Blame src/supplicant/nm-supplicant-config.c

Packit Service 87a54e
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit 5756e2
/*
Packit 5756e2
 * Copyright (C) 2006 - 2012 Red Hat, Inc.
Packit 5756e2
 * Copyright (C) 2007 - 2008 Novell, Inc.
Packit 5756e2
 */
Packit 5756e2
Packit 5756e2
#include "nm-default.h"
Packit 5756e2
Packit 5756e2
#include "nm-supplicant-config.h"
Packit 5756e2
Packit 5756e2
#include <stdlib.h>
Packit 5756e2
Packit 5756e2
#include "nm-glib-aux/nm-str-buf.h"
Packit 5756e2
#include "nm-core-internal.h"
Packit 5756e2
#include "nm-supplicant-settings-verify.h"
Packit 5756e2
#include "nm-setting.h"
Packit 5756e2
#include "nm-libnm-core-intern/nm-auth-subject.h"
Packit 5756e2
#include "NetworkManagerUtils.h"
Packit 5756e2
#include "nm-utils.h"
Packit 5756e2
#include "nm-setting-ip4-config.h"
Packit 5756e2
Packit 5756e2
typedef struct {
Packit Service a1bd4f
    char *         value;
Packit Service a1bd4f
    guint32        len;
Packit Service a1bd4f
    NMSupplOptType type;
Packit 5756e2
} ConfigOption;
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
typedef struct {
Packit Service a1bd4f
    GHashTable *   config;
Packit Service a1bd4f
    GHashTable *   blobs;
Packit Service a1bd4f
    NMSupplCapMask capabilities;
Packit Service a1bd4f
    guint32        ap_scan;
Packit Service a1bd4f
    bool           fast_required : 1;
Packit Service a1bd4f
    bool           dispose_has_run : 1;
Packit Service a1bd4f
    bool           ap_isolation : 1;
Packit 5756e2
} NMSupplicantConfigPrivate;
Packit 5756e2
Packit 5756e2
struct _NMSupplicantConfig {
Packit Service a1bd4f
    GObject                   parent;
Packit Service a1bd4f
    NMSupplicantConfigPrivate _priv;
Packit 5756e2
};
Packit 5756e2
Packit 5756e2
struct _NMSupplicantConfigClass {
Packit Service a1bd4f
    GObjectClass parent;
Packit 5756e2
};
Packit 5756e2
Packit Service a1bd4f
G_DEFINE_TYPE(NMSupplicantConfig, nm_supplicant_config, G_TYPE_OBJECT)
Packit 5756e2
Packit Service a1bd4f
#define NM_SUPPLICANT_CONFIG_GET_PRIVATE(self) \
Packit Service a1bd4f
    _NM_GET_PRIVATE(self, NMSupplicantConfig, NM_IS_SUPPLICANT_CONFIG)
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
_get_capability(NMSupplicantConfigPrivate *priv, NMSupplCapType type)
Packit 5756e2
{
Packit Service a1bd4f
    return NM_SUPPL_CAP_MASK_GET(priv->capabilities, type) == NM_TERNARY_TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
NMSupplicantConfig *
Packit Service a1bd4f
nm_supplicant_config_new(NMSupplCapMask capabilities)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    NMSupplicantConfig *       self;
Packit 5756e2
Packit Service a1bd4f
    self = g_object_new(NM_TYPE_SUPPLICANT_CONFIG, NULL);
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit 5756e2
Packit Service a1bd4f
    priv->capabilities = capabilities;
Packit 5756e2
Packit Service a1bd4f
    return self;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
config_option_free(ConfigOption *opt)
Packit 5756e2
{
Packit Service a1bd4f
    g_free(opt->value);
Packit Service a1bd4f
    g_slice_free(ConfigOption, opt);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
nm_supplicant_config_init(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit 5756e2
Packit Service a1bd4f
    priv->config = g_hash_table_new_full(nm_str_hash,
Packit Service a1bd4f
                                         g_str_equal,
Packit Service a1bd4f
                                         g_free,
Packit Service a1bd4f
                                         (GDestroyNotify) config_option_free);
Packit 5756e2
Packit Service a1bd4f
    priv->ap_scan         = 1;
Packit Service a1bd4f
    priv->dispose_has_run = FALSE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
nm_supplicant_config_add_option_with_type(NMSupplicantConfig *self,
Packit Service a1bd4f
                                          const char *        key,
Packit Service a1bd4f
                                          const char *        value,
Packit Service a1bd4f
                                          gint32              len,
Packit Service a1bd4f
                                          NMSupplOptType      opt_type,
Packit Service a1bd4f
                                          const char *        hidden,
Packit Service a1bd4f
                                          GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    ConfigOption *             old_opt;
Packit Service a1bd4f
    ConfigOption *             opt;
Packit Service a1bd4f
    NMSupplOptType             type;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(key != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(value != NULL, FALSE);
Packit Service a1bd4f
    nm_assert(!error || !*error);
Packit Service a1bd4f
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
Packit Service a1bd4f
    if (len < 0)
Packit Service a1bd4f
        len = strlen(value);
Packit Service a1bd4f
Packit Service a1bd4f
    if (opt_type != NM_SUPPL_OPT_TYPE_INVALID)
Packit Service a1bd4f
        type = opt_type;
Packit Service a1bd4f
    else {
Packit Service a1bd4f
        type = nm_supplicant_settings_verify_setting(key, value, len);
Packit Service a1bd4f
        if (type == NM_SUPPL_OPT_TYPE_INVALID) {
Packit Service a1bd4f
            gs_free char *str_free = NULL;
Packit Service a1bd4f
            const char *  str;
Packit Service a1bd4f
Packit Service a1bd4f
            str = nm_utils_buf_utf8safe_escape(value,
Packit Service a1bd4f
                                               len,
Packit Service a1bd4f
                                               NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL,
Packit Service a1bd4f
                                               &str_free);
Packit Service a1bd4f
Packit Service a1bd4f
            str = nm_strquote_a(255, str);
Packit Service a1bd4f
Packit Service a1bd4f
            g_set_error(error,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                        "key '%s' and/or value %s invalid",
Packit Service a1bd4f
                        key,
Packit Service a1bd4f
                        hidden ?: str);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    old_opt = (ConfigOption *) g_hash_table_lookup(priv->config, key);
Packit Service a1bd4f
    if (old_opt) {
Packit Service a1bd4f
        g_set_error(error,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                    "key '%s' already configured",
Packit Service a1bd4f
                    key);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    opt        = g_slice_new0(ConfigOption);
Packit Service a1bd4f
    opt->value = g_malloc(len + 1);
Packit Service a1bd4f
    memcpy(opt->value, value, len);
Packit Service a1bd4f
    opt->value[len] = '\0';
Packit Service a1bd4f
Packit Service a1bd4f
    opt->len  = len;
Packit Service a1bd4f
    opt->type = type;
Packit Service a1bd4f
Packit Service a1bd4f
    {
Packit Service a1bd4f
        char buf[255];
Packit Service a1bd4f
        memset(&buf[0], 0, sizeof(buf));
Packit Service a1bd4f
        memcpy(&buf[0], opt->value, opt->len > 254 ? 254 : opt->len);
Packit Service a1bd4f
        nm_log_info(LOGD_SUPPLICANT, "Config: added '%s' value '%s'", key, hidden ?: &buf[0]);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    g_hash_table_insert(priv->config, g_strdup(key), opt);
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
nm_supplicant_config_add_option(NMSupplicantConfig *self,
Packit Service a1bd4f
                                const char *        key,
Packit Service a1bd4f
                                const char *        value,
Packit Service a1bd4f
                                gint32              len,
Packit Service a1bd4f
                                const char *        hidden,
Packit Service a1bd4f
                                GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    return nm_supplicant_config_add_option_with_type(self,
Packit Service a1bd4f
                                                     key,
Packit Service a1bd4f
                                                     value,
Packit Service a1bd4f
                                                     len,
Packit Service a1bd4f
                                                     NM_SUPPL_OPT_TYPE_INVALID,
Packit Service a1bd4f
                                                     hidden,
Packit Service a1bd4f
                                                     error);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
nm_supplicant_config_add_blob(NMSupplicantConfig *self,
Packit Service a1bd4f
                              const char *        key,
Packit Service a1bd4f
                              GBytes *            value,
Packit Service a1bd4f
                              const char *        blobid,
Packit Service a1bd4f
                              GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    ConfigOption *             old_opt;
Packit Service a1bd4f
    ConfigOption *             opt;
Packit Service a1bd4f
    NMSupplOptType             type;
Packit Service a1bd4f
    const guint8 *             data;
Packit Service a1bd4f
    gsize                      data_len;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(key != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(value != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(blobid != NULL, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    data = g_bytes_get_data(value, &data_len);
Packit Service a1bd4f
    g_return_val_if_fail(data_len > 0, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
Packit Service a1bd4f
    type = nm_supplicant_settings_verify_setting(key, (const char *) data, data_len);
Packit Service a1bd4f
    if (type == NM_SUPPL_OPT_TYPE_INVALID) {
Packit Service a1bd4f
        g_set_error(error,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                    "key '%s' and/or its contained value is invalid",
Packit Service a1bd4f
                    key);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    old_opt = (ConfigOption *) g_hash_table_lookup(priv->config, key);
Packit Service a1bd4f
    if (old_opt) {
Packit Service a1bd4f
        g_set_error(error,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                    NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                    "key '%s' already configured",
Packit Service a1bd4f
                    key);
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    opt        = g_slice_new0(ConfigOption);
Packit Service a1bd4f
    opt->value = g_strdup_printf("blob://%s", blobid);
Packit Service a1bd4f
    opt->len   = strlen(opt->value);
Packit Service a1bd4f
    opt->type  = type;
Packit Service a1bd4f
Packit Service a1bd4f
    nm_log_info(LOGD_SUPPLICANT, "Config: added '%s' value '%s'", key, opt->value);
Packit Service a1bd4f
Packit Service a1bd4f
    g_hash_table_insert(priv->config, g_strdup(key), opt);
Packit Service a1bd4f
    if (!priv->blobs) {
Packit Service a1bd4f
        priv->blobs =
Packit Service a1bd4f
            g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, (GDestroyNotify) g_bytes_unref);
Packit Service a1bd4f
    }
Packit Service a1bd4f
    g_hash_table_insert(priv->blobs, g_strdup(blobid), g_bytes_ref(value));
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
nm_supplicant_config_add_blob_for_connection(NMSupplicantConfig *self,
Packit Service a1bd4f
                                             GBytes *            field,
Packit Service a1bd4f
                                             const char *        name,
Packit Service a1bd4f
                                             const char *        con_uid,
Packit Service a1bd4f
                                             GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    if (field && g_bytes_get_size(field)) {
Packit Service a1bd4f
        gs_free char *uid = NULL;
Packit Service a1bd4f
        char *        p;
Packit Service a1bd4f
Packit Service a1bd4f
        uid = g_strdup_printf("%s-%s", con_uid, name);
Packit Service a1bd4f
        for (p = uid; *p; p++) {
Packit Service a1bd4f
            if (*p == '/')
Packit Service a1bd4f
                *p = '-';
Packit Service a1bd4f
        }
Packit Service a1bd4f
        if (!nm_supplicant_config_add_blob(self, name, field, uid, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
nm_supplicant_config_finalize(GObject *object)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(object);
Packit 5756e2
Packit Service a1bd4f
    g_hash_table_destroy(priv->config);
Packit Service a1bd4f
    nm_clear_pointer(&priv->blobs, g_hash_table_destroy);
Packit 5756e2
Packit Service a1bd4f
    G_OBJECT_CLASS(nm_supplicant_config_parent_class)->finalize(object);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
nm_supplicant_config_class_init(NMSupplicantConfigClass *klass)
Packit 5756e2
{
Packit Service a1bd4f
    GObjectClass *object_class = G_OBJECT_CLASS(klass);
Packit 5756e2
Packit Service a1bd4f
    object_class->finalize = nm_supplicant_config_finalize;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
guint32
Packit Service a1bd4f
nm_supplicant_config_get_ap_scan(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), 1);
Packit 5756e2
Packit Service a1bd4f
    return NM_SUPPLICANT_CONFIG_GET_PRIVATE(self)->ap_scan;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_fast_required(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit 5756e2
Packit Service a1bd4f
    return NM_SUPPLICANT_CONFIG_GET_PRIVATE(self)->fast_required;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
GVariant *
Packit Service a1bd4f
nm_supplicant_config_to_variant(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    GVariantBuilder            builder;
Packit Service a1bd4f
    GHashTableIter             iter;
Packit Service a1bd4f
    ConfigOption *             option;
Packit Service a1bd4f
    const char *               key;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), NULL);
Packit Service a1bd4f
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
Packit Service a1bd4f
    g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
Packit Service a1bd4f
Packit Service a1bd4f
    g_hash_table_iter_init(&iter, priv->config);
Packit Service a1bd4f
    while (g_hash_table_iter_next(&iter, (gpointer) &key, (gpointer) &option)) {
Packit Service a1bd4f
        switch (option->type) {
Packit Service a1bd4f
        case NM_SUPPL_OPT_TYPE_INT:
Packit Service a1bd4f
            g_variant_builder_add(&builder, "{sv}", key, g_variant_new_int32(atoi(option->value)));
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SUPPL_OPT_TYPE_BYTES:
Packit Service a1bd4f
        case NM_SUPPL_OPT_TYPE_UTF8:
Packit Service a1bd4f
            g_variant_builder_add(
Packit Service a1bd4f
                &builder,
Packit Service a1bd4f
                "{sv}",
Packit Service a1bd4f
                key,
Packit Service a1bd4f
                g_variant_new_fixed_array(G_VARIANT_TYPE_BYTE, option->value, option->len, 1));
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SUPPL_OPT_TYPE_KEYWORD:
Packit Service a1bd4f
        case NM_SUPPL_OPT_TYPE_STRING:
Packit Service a1bd4f
            g_variant_builder_add(&builder, "{sv}", key, g_variant_new_string(option->value));
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        default:
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return g_variant_builder_end(&builder);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
GHashTable *
Packit Service a1bd4f
nm_supplicant_config_get_blobs(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), NULL);
Packit 5756e2
Packit Service a1bd4f
    return NM_SUPPLICANT_CONFIG_GET_PRIVATE(self)->blobs;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static const char *
Packit Service a1bd4f
wifi_freqs_to_string(gboolean bg_band)
Packit 5756e2
{
Packit Service a1bd4f
    static const char *str_2ghz = NULL;
Packit Service a1bd4f
    static const char *str_5ghz = NULL;
Packit Service a1bd4f
    const char **      f_p;
Packit Service a1bd4f
    const char *       f;
Packit 5756e2
Packit Service a1bd4f
    f_p = bg_band ? &str_2ghz : &str_5ghz;
Packit 5756e2
Packit 5756e2
again:
Packit Service a1bd4f
    f = g_atomic_pointer_get(f_p);
Packit Service a1bd4f
Packit Service a1bd4f
    if (G_UNLIKELY(!f)) {
Packit Service a1bd4f
        nm_auto_str_buf NMStrBuf strbuf = NM_STR_BUF_INIT(400, FALSE);
Packit Service a1bd4f
        const guint *            freqs;
Packit Service a1bd4f
        int                      i;
Packit Service a1bd4f
Packit Service a1bd4f
        freqs = bg_band ? nm_utils_wifi_2ghz_freqs() : nm_utils_wifi_5ghz_freqs();
Packit Service a1bd4f
        for (i = 0; freqs[i]; i++) {
Packit Service a1bd4f
            if (i > 0)
Packit Service a1bd4f
                nm_str_buf_append_c(&strbuf, ' ');
Packit Service a1bd4f
            nm_str_buf_append_printf(&strbuf, "%u", freqs[i]);
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        f = g_strdup(nm_str_buf_get_str(&strbuf));
Packit Service a1bd4f
Packit Service a1bd4f
        if (!g_atomic_pointer_compare_and_exchange(f_p, NULL, f)) {
Packit Service a1bd4f
            g_free((char *) f);
Packit Service a1bd4f
            goto again;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return f;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_setting_macsec(NMSupplicantConfig *self,
Packit Service a1bd4f
                                        NMSettingMacsec *   setting,
Packit Service a1bd4f
                                        GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    const char *value;
Packit Service a1bd4f
    char        buf[32];
Packit Service a1bd4f
    int         port;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(setting != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(!error || !*error, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    if (!nm_supplicant_config_add_option(self, "macsec_policy", "1", -1, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    value = nm_setting_macsec_get_encrypt(setting) ? "0" : "1";
Packit Service a1bd4f
    if (!nm_supplicant_config_add_option(self, "macsec_integ_only", value, -1, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    port = nm_setting_macsec_get_port(setting);
Packit Service a1bd4f
    if (port > 0 && port < 65534) {
Packit Service a1bd4f
        snprintf(buf, sizeof(buf), "%d", port);
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "macsec_port", buf, -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (nm_setting_macsec_get_mode(setting) == NM_SETTING_MACSEC_MODE_PSK) {
Packit Service a1bd4f
        guint8 buffer_cak[NM_SETTING_MACSEC_MKA_CAK_LENGTH / 2];
Packit Service a1bd4f
        guint8 buffer_ckn[NM_SETTING_MACSEC_MKA_CKN_LENGTH / 2];
Packit Service a1bd4f
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "key_mgmt", "NONE", -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
        value = nm_setting_macsec_get_mka_cak(setting);
Packit Service a1bd4f
        if (!value || !nm_utils_hexstr2bin_buf(value, FALSE, FALSE, NULL, buffer_cak)) {
Packit Service a1bd4f
            g_set_error_literal(error,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                                value ? "invalid MKA CAK" : "missing MKA CAK");
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                             "mka_cak",
Packit Service a1bd4f
                                             (char *) buffer_cak,
Packit Service a1bd4f
                                             sizeof(buffer_cak),
Packit Service a1bd4f
                                             "<hidden>",
Packit Service a1bd4f
                                             error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
        value = nm_setting_macsec_get_mka_ckn(setting);
Packit Service a1bd4f
        if (!value || !nm_utils_hexstr2bin_buf(value, FALSE, FALSE, NULL, buffer_ckn)) {
Packit Service a1bd4f
            g_set_error_literal(error,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                                value ? "invalid MKA CKN" : "missing MKA CKN");
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                             "mka_ckn",
Packit Service a1bd4f
                                             (char *) buffer_ckn,
Packit Service a1bd4f
                                             sizeof(buffer_ckn),
Packit Service a1bd4f
                                             NULL,
Packit Service a1bd4f
                                             error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_setting_wireless(NMSupplicantConfig *self,
Packit Service a1bd4f
                                          NMSettingWireless * setting,
Packit Service a1bd4f
                                          guint32             fixed_freq,
Packit Service a1bd4f
                                          GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    gboolean                   is_adhoc, is_ap, is_mesh;
Packit Service a1bd4f
    const char *               mode, *band;
Packit Service a1bd4f
    guint32                    channel;
Packit Service a1bd4f
    GBytes *                   ssid;
Packit Service a1bd4f
    const char *               bssid;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(setting != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(!error || !*error, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
Packit Service a1bd4f
    mode     = nm_setting_wireless_get_mode(setting);
Packit Service a1bd4f
    is_adhoc = nm_streq0(mode, "adhoc");
Packit Service a1bd4f
    is_ap    = nm_streq0(mode, "ap");
Packit Service a1bd4f
    is_mesh  = nm_streq0(mode, "mesh");
Packit Service a1bd4f
    if (is_adhoc || is_ap)
Packit Service a1bd4f
        priv->ap_scan = 2;
Packit Service a1bd4f
    else
Packit Service a1bd4f
        priv->ap_scan = 1;
Packit Service a1bd4f
Packit Service a1bd4f
    ssid = nm_setting_wireless_get_ssid(setting);
Packit Service a1bd4f
    if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                         "ssid",
Packit Service a1bd4f
                                         (char *) g_bytes_get_data(ssid, NULL),
Packit Service a1bd4f
                                         g_bytes_get_size(ssid),
Packit Service a1bd4f
                                         NULL,
Packit Service a1bd4f
                                         error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (is_adhoc) {
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "mode", "1", -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (is_ap) {
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "mode", "2", -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
        if (nm_setting_wireless_get_hidden(setting)
Packit Service a1bd4f
            && !nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                "ignore_broadcast_ssid",
Packit Service a1bd4f
                                                "1",
Packit Service a1bd4f
                                                -1,
Packit Service a1bd4f
                                                NULL,
Packit Service a1bd4f
                                                error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (is_mesh) {
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "mode", "5", -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if ((is_adhoc || is_ap || is_mesh) && fixed_freq) {
Packit Service a1bd4f
        gs_free char *str_freq = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
        str_freq = g_strdup_printf("%u", fixed_freq);
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "frequency", str_freq, -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Except for Ad-Hoc, Hotspot and Mesh, request that the driver probe for the
Packit Service a1bd4f
     * specific SSID we want to associate with.
Packit Service a1bd4f
     */
Packit Service a1bd4f
    if (!(is_adhoc || is_ap || is_mesh)) {
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "scan_ssid", "1", -1, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    bssid = nm_setting_wireless_get_bssid(setting);
Packit Service a1bd4f
    if (bssid) {
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self, "bssid", bssid, strlen(bssid), NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    band    = nm_setting_wireless_get_band(setting);
Packit Service a1bd4f
    channel = nm_setting_wireless_get_channel(setting);
Packit Service a1bd4f
    if (band) {
Packit Service a1bd4f
        if (channel) {
Packit Service a1bd4f
            guint32       freq;
Packit Service a1bd4f
            gs_free char *str_freq = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
            freq     = nm_utils_wifi_channel_to_freq(channel, band);
Packit Service a1bd4f
            str_freq = g_strdup_printf("%u", freq);
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self, "freq_list", str_freq, -1, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            const char *freqs = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
            if (nm_streq(band, "a"))
Packit Service a1bd4f
                freqs = wifi_freqs_to_string(FALSE);
Packit Service a1bd4f
            else if (nm_streq(band, "bg"))
Packit Service a1bd4f
                freqs = wifi_freqs_to_string(TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
            if (freqs
Packit Service a1bd4f
                && !nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                    "freq_list",
Packit Service a1bd4f
                                                    freqs,
Packit Service a1bd4f
                                                    strlen(freqs),
Packit Service a1bd4f
                                                    NULL,
Packit Service a1bd4f
                                                    error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_bgscan(NMSupplicantConfig *self, NMConnection *connection, GError **error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSettingWireless *        s_wifi;
Packit Service a1bd4f
    NMSettingWirelessSecurity *s_wsec;
Packit Service a1bd4f
    const char *               bgscan;
Packit Service a1bd4f
Packit Service a1bd4f
    s_wifi = nm_connection_get_setting_wireless(connection);
Packit Service a1bd4f
    g_assert(s_wifi);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Don't scan when a shared connection (either AP or Ad-Hoc) is active;
Packit Service a1bd4f
     * it will disrupt connected clients.
Packit Service a1bd4f
     */
Packit Service a1bd4f
    if (NM_IN_STRSET(nm_setting_wireless_get_mode(s_wifi),
Packit Service a1bd4f
                     NM_SETTING_WIRELESS_MODE_AP,
Packit Service a1bd4f
                     NM_SETTING_WIRELESS_MODE_ADHOC))
Packit Service a1bd4f
        return TRUE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Don't scan when the connection is locked to a specific AP, since
Packit Service a1bd4f
     * intra-ESS roaming (which requires periodic scanning) isn't being
Packit Service a1bd4f
     * used due to the specific AP lock. (bgo #513820)
Packit Service a1bd4f
     */
Packit Service a1bd4f
    if (nm_setting_wireless_get_bssid(s_wifi))
Packit Service a1bd4f
        return TRUE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Default to a very long bgscan interval when signal is OK on the assumption
Packit Service a1bd4f
     * that either (a) there aren't multiple APs and we don't need roaming, or
Packit Service a1bd4f
     * (b) since EAP/802.1x isn't used and thus there are fewer steps to fail
Packit Service a1bd4f
     * during a roam, we can wait longer before scanning for roam candidates.
Packit Service a1bd4f
     */
Packit Service a1bd4f
    bgscan = "simple:30:-70:86400";
Packit Service a1bd4f
Packit Service a1bd4f
    /* If using WPA Enterprise, Dynamic WEP or we have seen more than one AP use
Packit Service a1bd4f
     * a shorter bgscan interval on the assumption that this is a multi-AP ESS
Packit Service a1bd4f
     * in which we want more reliable roaming between APs. Thus trigger scans
Packit Service a1bd4f
     * when the signal is still somewhat OK so we have an up-to-date roam
Packit Service a1bd4f
     * candidate list when the signal gets bad.
Packit Service a1bd4f
     */
Packit Service a1bd4f
    if (nm_setting_wireless_get_num_seen_bssids(s_wifi) > 1
Packit Service a1bd4f
        || ((s_wsec = nm_connection_get_setting_wireless_security(connection))
Packit Service a1bd4f
            && NM_IN_STRSET(nm_setting_wireless_security_get_key_mgmt(s_wsec),
Packit Service a1bd4f
                            "ieee8021x",
Packit Service d0b836
                            "wpa-eap",
Packit Service d0b836
                            "wpa-eap-suite-b-192")))
Packit Service a1bd4f
        bgscan = "simple:30:-65:300";
Packit Service a1bd4f
Packit Service a1bd4f
    return nm_supplicant_config_add_option(self, "bgscan", bgscan, -1, FALSE, error);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
add_string_val(NMSupplicantConfig *self,
Packit Service a1bd4f
               const char *        field,
Packit Service a1bd4f
               const char *        name,
Packit Service a1bd4f
               gboolean            ucase,
Packit Service a1bd4f
               const char *        hidden,
Packit Service a1bd4f
               GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    if (field) {
Packit Service a1bd4f
        gs_free char *value = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
        if (ucase) {
Packit Service a1bd4f
            value = g_ascii_strup(field, -1);
Packit Service a1bd4f
            field = value;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        return nm_supplicant_config_add_option(self, name, field, strlen(field), hidden, error);
Packit Service a1bd4f
    }
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit Service a1bd4f
#define ADD_STRING_LIST_VAL(self,                                                         \
Packit Service a1bd4f
                            setting,                                                      \
Packit Service a1bd4f
                            setting_name,                                                 \
Packit Service a1bd4f
                            field,                                                        \
Packit Service a1bd4f
                            field_plural,                                                 \
Packit Service a1bd4f
                            name,                                                         \
Packit Service a1bd4f
                            separator,                                                    \
Packit Service a1bd4f
                            ucase,                                                        \
Packit Service a1bd4f
                            hidden,                                                       \
Packit Service a1bd4f
                            error)                                                        \
Packit Service a1bd4f
    ({                                                                                    \
Packit Service a1bd4f
        typeof(*(setting)) *_setting = (setting);                                         \
Packit Service a1bd4f
        gboolean            _success = TRUE;                                              \
Packit Service a1bd4f
                                                                                          \
Packit Service a1bd4f
        if (nm_setting_##setting_name##_get_num_##field_plural(_setting)) {               \
Packit Service a1bd4f
            const char _separator = (separator);                                          \
Packit Service a1bd4f
            GString *  _str       = g_string_new(NULL);                                   \
Packit Service a1bd4f
            guint      _k, _n;                                                            \
Packit Service a1bd4f
                                                                                          \
Packit Service a1bd4f
            _n = nm_setting_##setting_name##_get_num_##field_plural(_setting);            \
Packit Service a1bd4f
            for (_k = 0; _k < _n; _k++) {                                                 \
Packit Service a1bd4f
                const char *item = nm_setting_##setting_name##_get_##field(_setting, _k); \
Packit Service a1bd4f
                                                                                          \
Packit Service a1bd4f
                if (!_str->len) {                                                         \
Packit Service a1bd4f
                    g_string_append(_str, item);                                          \
Packit Service a1bd4f
                } else {                                                                  \
Packit Service a1bd4f
                    g_string_append_c(_str, _separator);                                  \
Packit Service a1bd4f
                    g_string_append(_str, item);                                          \
Packit Service a1bd4f
                }                                                                         \
Packit Service a1bd4f
            }                                                                             \
Packit Service a1bd4f
            if ((ucase))                                                                  \
Packit Service a1bd4f
                g_string_ascii_up(_str);                                                  \
Packit Service a1bd4f
            if (_str->len) {                                                              \
Packit Service a1bd4f
                if (!nm_supplicant_config_add_option((self),                              \
Packit Service a1bd4f
                                                     (name),                              \
Packit Service a1bd4f
                                                     _str->str,                           \
Packit Service a1bd4f
                                                     -1,                                  \
Packit Service a1bd4f
                                                     (hidden),                            \
Packit Service a1bd4f
                                                     (error)))                            \
Packit Service a1bd4f
                    _success = FALSE;                                                     \
Packit Service a1bd4f
            }                                                                             \
Packit Service a1bd4f
            g_string_free(_str, TRUE);                                                    \
Packit Service a1bd4f
        }                                                                                 \
Packit Service a1bd4f
        _success;                                                                         \
Packit Service a1bd4f
    })
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
wep128_passphrase_hash(const char *input, gsize input_len, guint8 *digest /* 13 bytes */)
Packit 5756e2
{
Packit Service a1bd4f
    nm_auto_free_checksum GChecksum *sum = NULL;
Packit Service a1bd4f
    guint8                           md5[NM_UTILS_CHECKSUM_LENGTH_MD5];
Packit Service a1bd4f
    guint8                           data[64];
Packit Service a1bd4f
    int                              i;
Packit 5756e2
Packit Service a1bd4f
    nm_assert(input);
Packit Service a1bd4f
    nm_assert(input_len);
Packit Service a1bd4f
    nm_assert(digest);
Packit 5756e2
Packit Service a1bd4f
    /* Get at least 64 bytes by repeating the passphrase into the buffer */
Packit Service a1bd4f
    for (i = 0; i < sizeof(data); i++)
Packit Service a1bd4f
        data[i] = input[i % input_len];
Packit 5756e2
Packit Service a1bd4f
    sum = g_checksum_new(G_CHECKSUM_MD5);
Packit Service a1bd4f
    g_checksum_update(sum, data, sizeof(data));
Packit Service a1bd4f
    nm_utils_checksum_get_digest(sum, md5);
Packit 5756e2
Packit Service a1bd4f
    /* WEP104 keys are 13 bytes in length (26 hex characters) */
Packit Service a1bd4f
    memcpy(digest, md5, 13);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
add_wep_key(NMSupplicantConfig *self,
Packit Service a1bd4f
            const char *        key,
Packit Service a1bd4f
            const char *        name,
Packit Service a1bd4f
            NMWepKeyType        wep_type,
Packit Service a1bd4f
            GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    gsize key_len;
Packit Service a1bd4f
Packit Service a1bd4f
    if (!key || (key_len = strlen(key)) == 0)
Packit Service a1bd4f
        return TRUE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (wep_type == NM_WEP_KEY_TYPE_UNKNOWN) {
Packit Service a1bd4f
        if (nm_utils_wep_key_valid(key, NM_WEP_KEY_TYPE_KEY))
Packit Service a1bd4f
            wep_type = NM_WEP_KEY_TYPE_KEY;
Packit Service a1bd4f
        else if (nm_utils_wep_key_valid(key, NM_WEP_KEY_TYPE_PASSPHRASE))
Packit Service a1bd4f
            wep_type = NM_WEP_KEY_TYPE_PASSPHRASE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if ((wep_type == NM_WEP_KEY_TYPE_UNKNOWN) || (wep_type == NM_WEP_KEY_TYPE_KEY)) {
Packit Service a1bd4f
        if ((key_len == 10) || (key_len == 26)) {
Packit Service a1bd4f
            guint8 buffer[26 / 2];
Packit Service a1bd4f
Packit Service a1bd4f
            if (!nm_utils_hexstr2bin_full(key,
Packit Service a1bd4f
                                          FALSE,
Packit Service a1bd4f
                                          FALSE,
Packit Service a1bd4f
                                          FALSE,
Packit Service a1bd4f
                                          NULL,
Packit Service a1bd4f
                                          key_len / 2,
Packit Service a1bd4f
                                          buffer,
Packit Service a1bd4f
                                          sizeof(buffer),
Packit Service a1bd4f
                                          NULL)) {
Packit Service a1bd4f
                g_set_error(error,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                            "cannot add wep-key %s to supplicant config because key is not hex",
Packit Service a1bd4f
                            name);
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                 name,
Packit Service a1bd4f
                                                 (char *) buffer,
Packit Service a1bd4f
                                                 key_len / 2,
Packit Service a1bd4f
                                                 "<hidden>",
Packit Service a1bd4f
                                                 error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else if ((key_len == 5) || (key_len == 13)) {
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self, name, key, key_len, "<hidden>", error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            g_set_error(
Packit Service a1bd4f
                error,
Packit Service a1bd4f
                NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                "Cannot add wep-key %s to supplicant config because key-length %u is invalid",
Packit Service a1bd4f
                name,
Packit Service a1bd4f
                (guint) key_len);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    } else if (wep_type == NM_WEP_KEY_TYPE_PASSPHRASE) {
Packit Service a1bd4f
        guint8 digest[13];
Packit Service a1bd4f
Packit Service a1bd4f
        wep128_passphrase_hash(key, key_len, digest);
Packit Service a1bd4f
        if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                             name,
Packit Service a1bd4f
                                             (const char *) digest,
Packit Service a1bd4f
                                             sizeof(digest),
Packit Service a1bd4f
                                             "<hidden>",
Packit Service a1bd4f
                                             error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_setting_wireless_security(NMSupplicantConfig *          self,
Packit Service a1bd4f
                                                   NMSettingWirelessSecurity *   setting,
Packit Service a1bd4f
                                                   NMSetting8021x *              setting_8021x,
Packit Service a1bd4f
                                                   const char *                  con_uuid,
Packit Service a1bd4f
                                                   guint32                       mtu,
Packit Service a1bd4f
                                                   NMSettingWirelessSecurityPmf  pmf,
Packit Service a1bd4f
                                                   NMSettingWirelessSecurityFils fils,
Packit Service a1bd4f
                                                   GError **                     error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv             = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
    nm_auto_free_gstring GString *key_mgmt_conf = NULL;
Packit Service a1bd4f
    const char *                  key_mgmt, *auth_alg;
Packit Service a1bd4f
    const char *                  psk;
Packit Service a1bd4f
    gboolean                      set_pmf;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(setting != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(con_uuid != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(!error || !*error, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Check if we actually support FILS */
Packit Service a1bd4f
    if (!_get_capability(priv, NM_SUPPL_CAP_TYPE_FILS)) {
Packit Service a1bd4f
        if (fils == NM_SETTING_WIRELESS_SECURITY_FILS_REQUIRED) {
Packit Service a1bd4f
            g_set_error_literal(error,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                                "Supplicant does not support FILS");
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        } else if (fils == NM_SETTING_WIRELESS_SECURITY_FILS_OPTIONAL)
Packit Service a1bd4f
            fils = NM_SETTING_WIRELESS_SECURITY_FILS_DISABLE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    key_mgmt      = nm_setting_wireless_security_get_key_mgmt(setting);
Packit Service a1bd4f
    key_mgmt_conf = g_string_new(key_mgmt);
Packit Service a1bd4f
    if (nm_streq(key_mgmt, "wpa-psk")) {
Packit Service a1bd4f
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " wpa-psk-sha256");
Packit Service a1bd4f
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " ft-psk");
Packit Service a1bd4f
    } else if (nm_streq(key_mgmt, "wpa-eap")) {
Packit Service d0b836
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)) {
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " wpa-eap-sha256");
Packit Service d0b836
Packit Service d0b836
            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_SUITEB192)
Packit Service d0b836
                && pmf == NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED)
Packit Service d0b836
                g_string_append(key_mgmt_conf, " wpa-eap-suite-b-192");
Packit Service d0b836
        }
Packit Service a1bd4f
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " ft-eap");
Packit Service a1bd4f
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT)
Packit Service a1bd4f
            && _get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " ft-eap-sha384");
Packit Service a1bd4f
        switch (fils) {
Packit Service a1bd4f
        case NM_SETTING_WIRELESS_SECURITY_FILS_REQUIRED:
Packit Service a1bd4f
            g_string_truncate(key_mgmt_conf, 0);
Packit Service a1bd4f
            if (!_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
Packit Service a1bd4f
                g_string_assign(key_mgmt_conf, "fils-sha256 fils-sha384");
Packit Service a1bd4f
            /* fall-through */
Packit Service a1bd4f
        case NM_SETTING_WIRELESS_SECURITY_FILS_OPTIONAL:
Packit Service a1bd4f
            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF))
Packit Service a1bd4f
                g_string_append(key_mgmt_conf, " fils-sha256 fils-sha384");
Packit Service a1bd4f
            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)
Packit Service a1bd4f
                && _get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
Packit Service a1bd4f
                g_string_append(key_mgmt_conf, " ft-fils-sha256");
Packit Service a1bd4f
            if (_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)
Packit Service a1bd4f
                && _get_capability(priv, NM_SUPPL_CAP_TYPE_FT)
Packit Service a1bd4f
                && _get_capability(priv, NM_SUPPL_CAP_TYPE_SHA384))
Packit Service a1bd4f
                g_string_append(key_mgmt_conf, " ft-fils-sha384");
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        default:
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    } else if (nm_streq(key_mgmt, "sae")) {
Packit Service a1bd4f
        if (_get_capability(priv, NM_SUPPL_CAP_TYPE_FT))
Packit Service a1bd4f
            g_string_append(key_mgmt_conf, " ft-sae");
Packit Service d0b836
    } else if (nm_streq(key_mgmt, "wpa-eap-suite-b-192")) {
Packit Service d0b836
        pmf = NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED;
Packit Service d0b836
        if (!nm_supplicant_config_add_option(self, "pairwise", "GCMP-256", -1, NULL, error)
Packit Service d0b836
            || !nm_supplicant_config_add_option(self, "group", "GCMP-256", -1, NULL, error))
Packit Service d0b836
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (!add_string_val(self, key_mgmt_conf->str, "key_mgmt", TRUE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    auth_alg = nm_setting_wireless_security_get_auth_alg(setting);
Packit Service a1bd4f
    if (!add_string_val(self, auth_alg, "auth_alg", TRUE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    psk = nm_setting_wireless_security_get_psk(setting);
Packit Service a1bd4f
    if (psk) {
Packit Service a1bd4f
        size_t psk_len = strlen(psk);
Packit Service a1bd4f
Packit Service a1bd4f
        if (psk_len >= 8 && psk_len <= 63) {
Packit Service a1bd4f
            /* Use NM_SUPPL_OPT_TYPE_STRING here so that it gets pushed to the
Packit Service a1bd4f
             * supplicant as a string, and therefore gets quoted,
Packit Service a1bd4f
             * and therefore the supplicant will interpret it as a
Packit Service a1bd4f
             * passphrase and not a hex key.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option_with_type(self,
Packit Service a1bd4f
                                                           "psk",
Packit Service a1bd4f
                                                           psk,
Packit Service a1bd4f
                                                           -1,
Packit Service a1bd4f
                                                           NM_SUPPL_OPT_TYPE_STRING,
Packit Service a1bd4f
                                                           "<hidden>",
Packit Service a1bd4f
                                                           error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else if (nm_streq(key_mgmt, "sae")) {
Packit Service a1bd4f
            /* If the SAE password doesn't comply with WPA-PSK limitation,
Packit Service a1bd4f
             * we need to call it "sae_password" instead of "psk".
Packit Service a1bd4f
             */
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option_with_type(self,
Packit Service a1bd4f
                                                           "sae_password",
Packit Service a1bd4f
                                                           psk,
Packit Service a1bd4f
                                                           -1,
Packit Service a1bd4f
                                                           NM_SUPPL_OPT_TYPE_STRING,
Packit Service a1bd4f
                                                           "<hidden>",
Packit Service a1bd4f
                                                           error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else if (psk_len == 64) {
Packit Service a1bd4f
            guint8 buffer[32];
Packit Service a1bd4f
Packit Service a1bd4f
            /* Hex PSK */
Packit Service a1bd4f
            if (!nm_utils_hexstr2bin_buf(psk, FALSE, FALSE, NULL, buffer)) {
Packit Service a1bd4f
                g_set_error(error,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                            "Cannot add psk to supplicant config due to invalid hex");
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                 "psk",
Packit Service a1bd4f
                                                 (char *) buffer,
Packit Service a1bd4f
                                                 sizeof(buffer),
Packit Service a1bd4f
                                                 "<hidden>",
Packit Service a1bd4f
                                                 error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            g_set_error(error,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                        "Cannot add psk to supplicant config due to invalid PSK length %u (not "
Packit Service a1bd4f
                        "between 8 and 63 characters)",
Packit Service a1bd4f
                        (guint) psk_len);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Don't try to enable PMF on non-WPA/SAE/OWE networks */
Packit Service d0b836
    if (!NM_IN_STRSET(key_mgmt, "wpa-eap", "wpa-eap-suite-b-192", "wpa-psk", "sae", "owe"))
Packit Service a1bd4f
        pmf = NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Check if we actually support PMF */
Packit Service a1bd4f
    set_pmf = TRUE;
Packit Service a1bd4f
    if (!_get_capability(priv, NM_SUPPL_CAP_TYPE_PMF)) {
Packit Service a1bd4f
        if (pmf == NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED) {
Packit Service a1bd4f
            g_set_error_literal(error,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                                NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                                "Supplicant does not support PMF");
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        set_pmf = FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Only WPA-specific things when using WPA */
Packit Service a1bd4f
    if (NM_IN_STRSET(key_mgmt, "wpa-psk", "wpa-eap", "sae", "owe")) {
Packit Service a1bd4f
        if (!ADD_STRING_LIST_VAL(self,
Packit Service a1bd4f
                                 setting,
Packit Service a1bd4f
                                 wireless_security,
Packit Service a1bd4f
                                 proto,
Packit Service a1bd4f
                                 protos,
Packit Service a1bd4f
                                 "proto",
Packit Service a1bd4f
                                 ' ',
Packit Service a1bd4f
                                 TRUE,
Packit Service a1bd4f
                                 NULL,
Packit Service a1bd4f
                                 error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        if (!ADD_STRING_LIST_VAL(self,
Packit Service a1bd4f
                                 setting,
Packit Service a1bd4f
                                 wireless_security,
Packit Service a1bd4f
                                 pairwise,
Packit Service a1bd4f
                                 pairwise,
Packit Service a1bd4f
                                 "pairwise",
Packit Service a1bd4f
                                 ' ',
Packit Service a1bd4f
                                 TRUE,
Packit Service a1bd4f
                                 NULL,
Packit Service a1bd4f
                                 error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        if (!ADD_STRING_LIST_VAL(self,
Packit Service a1bd4f
                                 setting,
Packit Service a1bd4f
                                 wireless_security,
Packit Service a1bd4f
                                 group,
Packit Service a1bd4f
                                 groups,
Packit Service a1bd4f
                                 "group",
Packit Service a1bd4f
                                 ' ',
Packit Service a1bd4f
                                 TRUE,
Packit Service a1bd4f
                                 NULL,
Packit Service a1bd4f
                                 error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
        if (set_pmf
Packit Service a1bd4f
            && NM_IN_SET(pmf,
Packit Service a1bd4f
                         NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE,
Packit Service a1bd4f
                         NM_SETTING_WIRELESS_SECURITY_PMF_REQUIRED)) {
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(
Packit Service a1bd4f
                    self,
Packit Service a1bd4f
                    "ieee80211w",
Packit Service a1bd4f
                    pmf == NM_SETTING_WIRELESS_SECURITY_PMF_DISABLE ? "0" : "2",
Packit Service a1bd4f
                    -1,
Packit Service a1bd4f
                    NULL,
Packit Service a1bd4f
                    error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* WEP keys if required */
Packit Service a1bd4f
    if (nm_streq(key_mgmt, "none")) {
Packit Service a1bd4f
        NMWepKeyType wep_type = nm_setting_wireless_security_get_wep_key_type(setting);
Packit Service a1bd4f
        const char * wep0     = nm_setting_wireless_security_get_wep_key(setting, 0);
Packit Service a1bd4f
        const char * wep1     = nm_setting_wireless_security_get_wep_key(setting, 1);
Packit Service a1bd4f
        const char * wep2     = nm_setting_wireless_security_get_wep_key(setting, 2);
Packit Service a1bd4f
        const char * wep3     = nm_setting_wireless_security_get_wep_key(setting, 3);
Packit Service a1bd4f
Packit Service a1bd4f
        if (!add_wep_key(self, wep0, "wep_key0", wep_type, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        if (!add_wep_key(self, wep1, "wep_key1", wep_type, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        if (!add_wep_key(self, wep2, "wep_key2", wep_type, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        if (!add_wep_key(self, wep3, "wep_key3", wep_type, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
        if (wep0 || wep1 || wep2 || wep3) {
Packit Service a1bd4f
            gs_free char *value = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
            value = g_strdup_printf("%d", nm_setting_wireless_security_get_wep_tx_keyidx(setting));
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self, "wep_tx_keyidx", value, -1, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (nm_streq0(auth_alg, "leap")) {
Packit Service a1bd4f
        /* LEAP */
Packit Service a1bd4f
        if (nm_streq(key_mgmt, "ieee8021x")) {
Packit Service a1bd4f
            const char *tmp;
Packit Service a1bd4f
Packit Service a1bd4f
            tmp = nm_setting_wireless_security_get_leap_username(setting);
Packit Service a1bd4f
            if (!add_string_val(self, tmp, "identity", FALSE, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
            tmp = nm_setting_wireless_security_get_leap_password(setting);
Packit Service a1bd4f
            if (!add_string_val(self, tmp, "password", FALSE, "<hidden>", error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
            if (!add_string_val(self, "leap", "eap", TRUE, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            g_set_error(error,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                        NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                        "Invalid key-mgmt \"%s\" for leap",
Packit Service a1bd4f
                        key_mgmt);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        /* 802.1x for Dynamic WEP and WPA-Enterprise */
Packit Service d0b836
        if (NM_IN_STRSET(key_mgmt, "ieee8021x", "wpa-eap", "wpa-eap-suite-b-192")) {
Packit Service a1bd4f
            if (!setting_8021x) {
Packit Service a1bd4f
                g_set_error(error,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                            "Cannot set key-mgmt %s with missing 8021x setting",
Packit Service a1bd4f
                            key_mgmt);
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            if (!nm_supplicant_config_add_setting_8021x(self,
Packit Service a1bd4f
                                                        setting_8021x,
Packit Service a1bd4f
                                                        con_uuid,
Packit Service a1bd4f
                                                        mtu,
Packit Service a1bd4f
                                                        FALSE,
Packit Service a1bd4f
                                                        error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service d0b836
        if (NM_IN_STRSET(key_mgmt, "wpa-eap", "wpa-eap-suite-b-192")) {
Packit Service a1bd4f
            /* When using WPA-Enterprise, we want to use Proactive Key Caching (also
Packit Service a1bd4f
             * called Opportunistic Key Caching) to avoid full EAP exchanges when
Packit Service a1bd4f
             * roaming between access points in the same mobility group.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                 "proactive_key_caching",
Packit Service a1bd4f
                                                 "1",
Packit Service a1bd4f
                                                 -1,
Packit Service a1bd4f
                                                 NULL,
Packit Service a1bd4f
                                                 error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static gboolean
Packit Service a1bd4f
add_pkcs11_uri_with_pin(NMSupplicantConfig *       self,
Packit Service a1bd4f
                        const char *               name,
Packit Service a1bd4f
                        const char *               uri,
Packit Service a1bd4f
                        const char *               pin,
Packit Service a1bd4f
                        const NMSettingSecretFlags pin_flags,
Packit Service a1bd4f
                        GError **                  error)
Packit 5756e2
{
Packit Service a1bd4f
    gs_strfreev char **split     = NULL;
Packit Service a1bd4f
    gs_free char *     tmp       = NULL;
Packit Service a1bd4f
    gs_free char *     tmp_log   = NULL;
Packit Service a1bd4f
    gs_free char *     pin_qattr = NULL;
Packit Service a1bd4f
    char *             escaped   = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    if (uri == NULL)
Packit Service a1bd4f
        return TRUE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* We ignore the attributes -- RFC 7512 suggests that some of them
Packit Service a1bd4f
     * might be unsafe and we want to be on the safe side. Also, we're
Packit Service a1bd4f
     * installing our attributes, so this makes things a bit easier for us. */
Packit Service a1bd4f
    split = g_strsplit(uri, "&", 2);
Packit Service a1bd4f
    if (split[1])
Packit Service a1bd4f
        nm_log_info(LOGD_SUPPLICANT, "URI attributes ignored");
Packit Service a1bd4f
Packit Service a1bd4f
    /* Fill in the PIN if required. */
Packit Service a1bd4f
    if (pin) {
Packit Service a1bd4f
        escaped   = g_uri_escape_string(pin, NULL, TRUE);
Packit Service a1bd4f
        pin_qattr = g_strdup_printf("pin-value=%s", escaped);
Packit Service a1bd4f
        g_free(escaped);
Packit Service a1bd4f
    } else if (!(pin_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)) {
Packit Service a1bd4f
        /* Include an empty PIN to indicate the login is still needed.
Packit Service a1bd4f
         * Probably a token that has a PIN path and the actual PIN will
Packit Service a1bd4f
         * be entered using a protected path. */
Packit Service a1bd4f
        pin_qattr = g_strdup("pin-value=");
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    tmp = g_strdup_printf("%s%s%s", split[0], (pin_qattr ? "?" : ""), (pin_qattr ?: ""));
Packit Service a1bd4f
Packit Service a1bd4f
    tmp_log = g_strdup_printf("%s%s%s",
Packit Service a1bd4f
                              split[0],
Packit Service a1bd4f
                              (pin_qattr ? "?" : ""),
Packit Service a1bd4f
                              (pin_qattr ? "pin-value=<hidden>" : ""));
Packit Service a1bd4f
Packit Service a1bd4f
    return add_string_val(self, tmp, name, FALSE, tmp_log, error);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_setting_8021x(NMSupplicantConfig *self,
Packit Service a1bd4f
                                       NMSetting8021x *    setting,
Packit Service a1bd4f
                                       const char *        con_uuid,
Packit Service a1bd4f
                                       guint32             mtu,
Packit Service a1bd4f
                                       gboolean            wired,
Packit Service a1bd4f
                                       GError **           error)
Packit 5756e2
{
Packit Service a1bd4f
    NMSupplicantConfigPrivate *priv;
Packit Service a1bd4f
    char *                     tmp;
Packit Service a1bd4f
    const char *               peapver, *value, *path;
Packit Service a1bd4f
    gboolean                   added;
Packit Service a1bd4f
    GString *                  phase1, *phase2;
Packit Service a1bd4f
    GBytes *                   bytes;
Packit Service a1bd4f
    gboolean                   fast = FALSE;
Packit Service a1bd4f
    guint32                    i, num_eap;
Packit Service a1bd4f
    gboolean                   fast_provisoning_allowed = FALSE;
Packit Service a1bd4f
    const char *               ca_path_override = NULL, *ca_cert_override = NULL;
Packit Service a1bd4f
    guint32                    frag, hdrs;
Packit Service a1bd4f
    gs_free char *             frag_str = NULL;
Packit Service a1bd4f
    NMSetting8021xAuthFlags    phase1_auth_flags;
Packit Service a1bd4f
    nm_auto_free_gstring GString *eap_str = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
    g_return_val_if_fail(NM_IS_SUPPLICANT_CONFIG(self), FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(setting != NULL, FALSE);
Packit Service a1bd4f
    g_return_val_if_fail(con_uuid != NULL, FALSE);
Packit Service a1bd4f
Packit Service a1bd4f
    priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE(self);
Packit Service a1bd4f
Packit Service a1bd4f
    value = nm_setting_802_1x_get_password(setting);
Packit Service a1bd4f
    if (value) {
Packit Service a1bd4f
        if (!add_string_val(self, value, "password", FALSE, "<hidden>", error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        bytes = nm_setting_802_1x_get_password_raw(setting);
Packit Service a1bd4f
        if (bytes) {
Packit Service a1bd4f
            if (!nm_supplicant_config_add_option(self,
Packit Service a1bd4f
                                                 "password",
Packit Service a1bd4f
                                                 (const char *) g_bytes_get_data(bytes, NULL),
Packit Service a1bd4f
                                                 g_bytes_get_size(bytes),
Packit Service a1bd4f
                                                 "<hidden>",
Packit Service a1bd4f
                                                 error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
    value = nm_setting_802_1x_get_pin(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "pin", FALSE, "<hidden>", error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    if (wired) {
Packit Service a1bd4f
        if (!add_string_val(self, "IEEE8021X", "key_mgmt", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        /* Wired 802.1x must always use eapol_flags=0 */
Packit Service a1bd4f
        if (!add_string_val(self, "0", "eapol_flags", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        priv->ap_scan = 0;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Build the "eap" option string while we check for EAP methods needing
Packit Service a1bd4f
     * special handling: PEAP + GTC, FAST, external */
Packit Service a1bd4f
    eap_str = g_string_new(NULL);
Packit Service a1bd4f
    num_eap = nm_setting_802_1x_get_num_eap_methods(setting);
Packit Service a1bd4f
    for (i = 0; i < num_eap; i++) {
Packit Service a1bd4f
        const char *method = nm_setting_802_1x_get_eap_method(setting, i);
Packit Service a1bd4f
Packit Service a1bd4f
        if (nm_streq(method, "fast")) {
Packit Service a1bd4f
            fast                = TRUE;
Packit Service a1bd4f
            priv->fast_required = TRUE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        if (nm_streq(method, "external")) {
Packit Service a1bd4f
            if (num_eap == 1) {
Packit Service a1bd4f
                g_set_error(error,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                            "Connection settings managed externally to NM, connection"
Packit Service a1bd4f
                            " cannot be used with wpa_supplicant");
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            continue;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        if (eap_str->len)
Packit Service a1bd4f
            g_string_append_c(eap_str, ' ');
Packit Service a1bd4f
        g_string_append(eap_str, method);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    g_string_ascii_up(eap_str);
Packit Service a1bd4f
    if (eap_str->len
Packit Service a1bd4f
        && !nm_supplicant_config_add_option(self, "eap", eap_str->str, -1, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Adjust the fragment size according to MTU, but do not set it higher than 1280-14
Packit Service a1bd4f
     * for better compatibility */
Packit Service a1bd4f
    hdrs = 14; /* EAPOL + EAP-TLS */
Packit Service a1bd4f
    frag = 1280 - hdrs;
Packit Service a1bd4f
    if (mtu > hdrs)
Packit Service a1bd4f
        frag = CLAMP(mtu - hdrs, 100, frag);
Packit Service a1bd4f
    frag_str = g_strdup_printf("%u", frag);
Packit Service a1bd4f
Packit Service a1bd4f
    if (!nm_supplicant_config_add_option(self, "fragment_size", frag_str, -1, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    phase1  = g_string_new(NULL);
Packit Service a1bd4f
    peapver = nm_setting_802_1x_get_phase1_peapver(setting);
Packit Service a1bd4f
    if (peapver) {
Packit Service a1bd4f
        if (nm_streq(peapver, "0"))
Packit Service a1bd4f
            g_string_append(phase1, "peapver=0");
Packit Service a1bd4f
        else if (nm_streq(peapver, "1"))
Packit Service a1bd4f
            g_string_append(phase1, "peapver=1");
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (nm_setting_802_1x_get_phase1_peaplabel(setting)) {
Packit Service a1bd4f
        if (phase1->len)
Packit Service a1bd4f
            g_string_append_c(phase1, ' ');
Packit Service a1bd4f
        g_string_append_printf(phase1,
Packit Service a1bd4f
                               "peaplabel=%s",
Packit Service a1bd4f
                               nm_setting_802_1x_get_phase1_peaplabel(setting));
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    value = nm_setting_802_1x_get_phase1_fast_provisioning(setting);
Packit Service a1bd4f
    if (value) {
Packit Service a1bd4f
        if (phase1->len)
Packit Service a1bd4f
            g_string_append_c(phase1, ' ');
Packit Service a1bd4f
        g_string_append_printf(phase1, "fast_provisioning=%s", value);
Packit Service a1bd4f
Packit Service a1bd4f
        if (!nm_streq(value, "0"))
Packit Service a1bd4f
            fast_provisoning_allowed = TRUE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    phase1_auth_flags = nm_setting_802_1x_get_phase1_auth_flags(setting);
Packit Service a1bd4f
    if (NM_FLAGS_HAS(phase1_auth_flags, NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_0_DISABLE))
Packit Service a1bd4f
        g_string_append_printf(phase1, "%stls_disable_tlsv1_0=1", (phase1->len ? " " : ""));
Packit Service a1bd4f
    if (NM_FLAGS_HAS(phase1_auth_flags, NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_1_DISABLE))
Packit Service a1bd4f
        g_string_append_printf(phase1, "%stls_disable_tlsv1_1=1", (phase1->len ? " " : ""));
Packit Service a1bd4f
    if (NM_FLAGS_HAS(phase1_auth_flags, NM_SETTING_802_1X_AUTH_FLAGS_TLS_1_2_DISABLE))
Packit Service a1bd4f
        g_string_append_printf(phase1, "%stls_disable_tlsv1_2=1", (phase1->len ? " " : ""));
Packit Service a1bd4f
Packit Service a1bd4f
    if (phase1->len) {
Packit Service a1bd4f
        if (!add_string_val(self, phase1->str, "phase1", FALSE, NULL, error)) {
Packit Service a1bd4f
            g_string_free(phase1, TRUE);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
    g_string_free(phase1, TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
    phase2 = g_string_new(NULL);
Packit Service a1bd4f
    if (nm_setting_802_1x_get_phase2_auth(setting) && !fast_provisoning_allowed) {
Packit Service a1bd4f
        tmp = g_ascii_strup(nm_setting_802_1x_get_phase2_auth(setting), -1);
Packit Service a1bd4f
        g_string_append_printf(phase2, "auth=%s", tmp);
Packit Service a1bd4f
        g_free(tmp);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (nm_setting_802_1x_get_phase2_autheap(setting)) {
Packit Service a1bd4f
        if (phase2->len)
Packit Service a1bd4f
            g_string_append_c(phase2, ' ');
Packit Service a1bd4f
        tmp = g_ascii_strup(nm_setting_802_1x_get_phase2_autheap(setting), -1);
Packit Service a1bd4f
        g_string_append_printf(phase2, "autheap=%s", tmp);
Packit Service a1bd4f
        g_free(tmp);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (phase2->len) {
Packit Service a1bd4f
        if (!add_string_val(self, phase2->str, "phase2", FALSE, NULL, error)) {
Packit Service a1bd4f
            g_string_free(phase2, TRUE);
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
    g_string_free(phase2, TRUE);
Packit Service a1bd4f
Packit Service a1bd4f
    /* PAC file */
Packit Service a1bd4f
    path = nm_setting_802_1x_get_pac_file(setting);
Packit Service a1bd4f
    if (path) {
Packit Service a1bd4f
        if (!add_string_val(self, path, "pac_file", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        /* PAC file is not specified.
Packit Service a1bd4f
         * If provisioning is allowed, use an blob format.
Packit Service a1bd4f
         */
Packit Service a1bd4f
        if (fast_provisoning_allowed) {
Packit Service a1bd4f
            gs_free char *blob_name = NULL;
Packit Service a1bd4f
Packit Service a1bd4f
            blob_name = g_strdup_printf("blob://pac-blob-%s", con_uuid);
Packit Service a1bd4f
            if (!add_string_val(self, blob_name, "pac_file", FALSE, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        } else {
Packit Service a1bd4f
            /* This is only error for EAP-FAST; don't disturb other methods. */
Packit Service a1bd4f
            if (fast) {
Packit Service a1bd4f
                g_set_error(error,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR,
Packit Service a1bd4f
                            NM_SUPPLICANT_ERROR_CONFIG,
Packit Service a1bd4f
                            "EAP-FAST error: no PAC file provided and "
Packit Service a1bd4f
                            "automatic PAC provisioning is disabled");
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* If user wants to use system CA certs, either populate ca_path (if the path
Packit Service a1bd4f
     * is a directory) or ca_cert (the path is a file name) */
Packit Service a1bd4f
    if (nm_setting_802_1x_get_system_ca_certs(setting)) {
Packit Service a1bd4f
        if (g_file_test(SYSTEM_CA_PATH, G_FILE_TEST_IS_DIR))
Packit Service a1bd4f
            ca_path_override = SYSTEM_CA_PATH;
Packit Service a1bd4f
        else
Packit Service a1bd4f
            ca_cert_override = SYSTEM_CA_PATH;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* CA path */
Packit Service a1bd4f
    path = nm_setting_802_1x_get_ca_path(setting);
Packit Service a1bd4f
    path = ca_path_override ?: path;
Packit Service a1bd4f
    if (path) {
Packit Service a1bd4f
        if (!add_string_val(self, path, "ca_path", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Phase2 CA path */
Packit Service a1bd4f
    path = nm_setting_802_1x_get_phase2_ca_path(setting);
Packit Service a1bd4f
    path = ca_path_override ?: path;
Packit Service a1bd4f
    if (path) {
Packit Service a1bd4f
        if (!add_string_val(self, path, "ca_path2", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* CA certificate */
Packit Service a1bd4f
    if (ca_cert_override) {
Packit Service a1bd4f
        if (!add_string_val(self, ca_cert_override, "ca_cert", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        switch (nm_setting_802_1x_get_ca_cert_scheme(setting)) {
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
            bytes = nm_setting_802_1x_get_ca_cert_blob(setting);
Packit Service a1bd4f
            if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                              bytes,
Packit Service a1bd4f
                                                              "ca_cert",
Packit Service a1bd4f
                                                              con_uuid,
Packit Service a1bd4f
                                                              error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
            path = nm_setting_802_1x_get_ca_cert_path(setting);
Packit Service a1bd4f
            if (!add_string_val(self, path, "ca_cert", FALSE, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
            if (!add_pkcs11_uri_with_pin(self,
Packit Service a1bd4f
                                         "ca_cert",
Packit Service a1bd4f
                                         nm_setting_802_1x_get_ca_cert_uri(setting),
Packit Service a1bd4f
                                         nm_setting_802_1x_get_ca_cert_password(setting),
Packit Service a1bd4f
                                         nm_setting_802_1x_get_ca_cert_password_flags(setting),
Packit Service a1bd4f
                                         error)) {
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        default:
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Phase 2 CA certificate */
Packit Service a1bd4f
    if (ca_cert_override) {
Packit Service a1bd4f
        if (!add_string_val(self, ca_cert_override, "ca_cert2", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
    } else {
Packit Service a1bd4f
        switch (nm_setting_802_1x_get_phase2_ca_cert_scheme(setting)) {
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
            bytes = nm_setting_802_1x_get_phase2_ca_cert_blob(setting);
Packit Service a1bd4f
            if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                              bytes,
Packit Service a1bd4f
                                                              "ca_cert2",
Packit Service a1bd4f
                                                              con_uuid,
Packit Service a1bd4f
                                                              error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
            path = nm_setting_802_1x_get_phase2_ca_cert_path(setting);
Packit Service a1bd4f
            if (!add_string_val(self, path, "ca_cert2", FALSE, NULL, error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
            if (!add_pkcs11_uri_with_pin(
Packit Service a1bd4f
                    self,
Packit Service a1bd4f
                    "ca_cert2",
Packit Service a1bd4f
                    nm_setting_802_1x_get_phase2_ca_cert_uri(setting),
Packit Service a1bd4f
                    nm_setting_802_1x_get_phase2_ca_cert_password(setting),
Packit Service a1bd4f
                    nm_setting_802_1x_get_phase2_ca_cert_password_flags(setting),
Packit Service a1bd4f
                    error)) {
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
            }
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        default:
Packit Service a1bd4f
            break;
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Subject match */
Packit Service a1bd4f
    value = nm_setting_802_1x_get_subject_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "subject_match", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    value = nm_setting_802_1x_get_phase2_subject_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "subject_match2", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* altSubjectName match */
Packit Service a1bd4f
    if (!ADD_STRING_LIST_VAL(self,
Packit Service a1bd4f
                             setting,
Packit Service a1bd4f
                             802_1x,
Packit Service a1bd4f
                             altsubject_match,
Packit Service a1bd4f
                             altsubject_matches,
Packit Service a1bd4f
                             "altsubject_match",
Packit Service a1bd4f
                             ';',
Packit Service a1bd4f
                             FALSE,
Packit Service a1bd4f
                             NULL,
Packit Service a1bd4f
                             error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    if (!ADD_STRING_LIST_VAL(self,
Packit Service a1bd4f
                             setting,
Packit Service a1bd4f
                             802_1x,
Packit Service a1bd4f
                             phase2_altsubject_match,
Packit Service a1bd4f
                             phase2_altsubject_matches,
Packit Service a1bd4f
                             "altsubject_match2",
Packit Service a1bd4f
                             ';',
Packit Service a1bd4f
                             FALSE,
Packit Service a1bd4f
                             NULL,
Packit Service a1bd4f
                             error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Domain suffix match */
Packit Service a1bd4f
    value = nm_setting_802_1x_get_domain_suffix_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "domain_suffix_match", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    value = nm_setting_802_1x_get_phase2_domain_suffix_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "domain_suffix_match2", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* domain match */
Packit Service a1bd4f
    value = nm_setting_802_1x_get_domain_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "domain_match", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    value = nm_setting_802_1x_get_phase2_domain_match(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "domain_match2", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    /* Private key */
Packit Service a1bd4f
    added = FALSE;
Packit Service a1bd4f
    switch (nm_setting_802_1x_get_private_key_scheme(setting)) {
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
        bytes = nm_setting_802_1x_get_private_key_blob(setting);
Packit Service a1bd4f
        if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                          bytes,
Packit Service a1bd4f
                                                          "private_key",
Packit Service a1bd4f
                                                          con_uuid,
Packit Service a1bd4f
                                                          error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
        path = nm_setting_802_1x_get_private_key_path(setting);
Packit Service a1bd4f
        if (!add_string_val(self, path, "private_key", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
        if (!add_pkcs11_uri_with_pin(self,
Packit Service a1bd4f
                                     "private_key",
Packit Service a1bd4f
                                     nm_setting_802_1x_get_private_key_uri(setting),
Packit Service a1bd4f
                                     nm_setting_802_1x_get_private_key_password(setting),
Packit Service a1bd4f
                                     nm_setting_802_1x_get_private_key_password_flags(setting),
Packit Service a1bd4f
                                     error)) {
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    default:
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (added) {
Packit Service a1bd4f
        NMSetting8021xCKFormat format;
Packit Service a1bd4f
        NMSetting8021xCKScheme scheme;
Packit Service a1bd4f
Packit Service a1bd4f
        format = nm_setting_802_1x_get_private_key_format(setting);
Packit Service a1bd4f
        scheme = nm_setting_802_1x_get_private_key_scheme(setting);
Packit Service a1bd4f
Packit Service a1bd4f
        if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH
Packit Service a1bd4f
            || format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
Packit Service a1bd4f
            /* Only add the private key password for PKCS#12 blobs and
Packit Service a1bd4f
             * all path schemes, since in both of these cases the private key
Packit Service a1bd4f
             * isn't decrypted at all.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            value = nm_setting_802_1x_get_private_key_password(setting);
Packit Service a1bd4f
            if (!add_string_val(self, value, "private_key_passwd", FALSE, "<hidden>", error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
Packit Service a1bd4f
            /* Only add the client cert if the private key is not PKCS#12, as
Packit Service a1bd4f
             * wpa_supplicant configuration directs us to do.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            switch (nm_setting_802_1x_get_client_cert_scheme(setting)) {
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
                bytes = nm_setting_802_1x_get_client_cert_blob(setting);
Packit Service a1bd4f
                if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                                  bytes,
Packit Service a1bd4f
                                                                  "client_cert",
Packit Service a1bd4f
                                                                  con_uuid,
Packit Service a1bd4f
                                                                  error))
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
                path = nm_setting_802_1x_get_client_cert_path(setting);
Packit Service a1bd4f
                if (!add_string_val(self, path, "client_cert", FALSE, NULL, error))
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
                if (!add_pkcs11_uri_with_pin(
Packit Service a1bd4f
                        self,
Packit Service a1bd4f
                        "client_cert",
Packit Service a1bd4f
                        nm_setting_802_1x_get_client_cert_uri(setting),
Packit Service a1bd4f
                        nm_setting_802_1x_get_client_cert_password(setting),
Packit Service a1bd4f
                        nm_setting_802_1x_get_client_cert_password_flags(setting),
Packit Service a1bd4f
                        error)) {
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                }
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            default:
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            }
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    /* Phase 2 private key */
Packit Service a1bd4f
    added = FALSE;
Packit Service a1bd4f
    switch (nm_setting_802_1x_get_phase2_private_key_scheme(setting)) {
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
        bytes = nm_setting_802_1x_get_phase2_private_key_blob(setting);
Packit Service a1bd4f
        if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                          bytes,
Packit Service a1bd4f
                                                          "private_key2",
Packit Service a1bd4f
                                                          con_uuid,
Packit Service a1bd4f
                                                          error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
        path = nm_setting_802_1x_get_phase2_private_key_path(setting);
Packit Service a1bd4f
        if (!add_string_val(self, path, "private_key2", FALSE, NULL, error))
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
        if (!add_pkcs11_uri_with_pin(
Packit Service a1bd4f
                self,
Packit Service a1bd4f
                "private_key2",
Packit Service a1bd4f
                nm_setting_802_1x_get_phase2_private_key_uri(setting),
Packit Service a1bd4f
                nm_setting_802_1x_get_phase2_private_key_password(setting),
Packit Service a1bd4f
                nm_setting_802_1x_get_phase2_private_key_password_flags(setting),
Packit Service a1bd4f
                error)) {
Packit Service a1bd4f
            return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
        added = TRUE;
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    default:
Packit Service a1bd4f
        break;
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (added) {
Packit Service a1bd4f
        NMSetting8021xCKFormat format;
Packit Service a1bd4f
        NMSetting8021xCKScheme scheme;
Packit Service a1bd4f
Packit Service a1bd4f
        format = nm_setting_802_1x_get_phase2_private_key_format(setting);
Packit Service a1bd4f
        scheme = nm_setting_802_1x_get_phase2_private_key_scheme(setting);
Packit Service a1bd4f
Packit Service a1bd4f
        if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH
Packit Service a1bd4f
            || format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
Packit Service a1bd4f
            /* Only add the private key password for PKCS#12 blobs and
Packit Service a1bd4f
             * all path schemes, since in both of these cases the private key
Packit Service a1bd4f
             * isn't decrypted at all.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            value = nm_setting_802_1x_get_phase2_private_key_password(setting);
Packit Service a1bd4f
            if (!add_string_val(self, value, "private_key2_passwd", FALSE, "<hidden>", error))
Packit Service a1bd4f
                return FALSE;
Packit Service a1bd4f
        }
Packit Service a1bd4f
Packit Service a1bd4f
        if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
Packit Service a1bd4f
            /* Only add the client cert if the private key is not PKCS#12, as
Packit Service a1bd4f
             * wpa_supplicant configuration directs us to do.
Packit Service a1bd4f
             */
Packit Service a1bd4f
            switch (nm_setting_802_1x_get_phase2_client_cert_scheme(setting)) {
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_BLOB:
Packit Service a1bd4f
                bytes = nm_setting_802_1x_get_phase2_client_cert_blob(setting);
Packit Service a1bd4f
                if (!nm_supplicant_config_add_blob_for_connection(self,
Packit Service a1bd4f
                                                                  bytes,
Packit Service a1bd4f
                                                                  "client_cert2",
Packit Service a1bd4f
                                                                  con_uuid,
Packit Service a1bd4f
                                                                  error))
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit Service a1bd4f
                path = nm_setting_802_1x_get_phase2_client_cert_path(setting);
Packit Service a1bd4f
                if (!add_string_val(self, path, "client_cert2", FALSE, NULL, error))
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit Service a1bd4f
                if (!add_pkcs11_uri_with_pin(
Packit Service a1bd4f
                        self,
Packit Service a1bd4f
                        "client_cert2",
Packit Service a1bd4f
                        nm_setting_802_1x_get_phase2_client_cert_uri(setting),
Packit Service a1bd4f
                        nm_setting_802_1x_get_phase2_client_cert_password(setting),
Packit Service a1bd4f
                        nm_setting_802_1x_get_phase2_client_cert_password_flags(setting),
Packit Service a1bd4f
                        error)) {
Packit Service a1bd4f
                    return FALSE;
Packit Service a1bd4f
                }
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            default:
Packit Service a1bd4f
                break;
Packit Service a1bd4f
            }
Packit Service a1bd4f
        }
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    value = nm_setting_802_1x_get_identity(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "identity", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
    value = nm_setting_802_1x_get_anonymous_identity(setting);
Packit Service a1bd4f
    if (!add_string_val(self, value, "anonymous_identity", FALSE, NULL, error))
Packit Service a1bd4f
        return FALSE;
Packit Service a1bd4f
Packit Service a1bd4f
    return TRUE;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_add_no_security(NMSupplicantConfig *self, GError **error)
Packit 5756e2
{
Packit Service a1bd4f
    return nm_supplicant_config_add_option(self, "key_mgmt", "NONE", -1, NULL, error);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
gboolean
Packit Service a1bd4f
nm_supplicant_config_get_ap_isolation(NMSupplicantConfig *self)
Packit 5756e2
{
Packit Service a1bd4f
    return self->_priv.ap_isolation;
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
void
Packit Service a1bd4f
nm_supplicant_config_set_ap_isolation(NMSupplicantConfig *self, gboolean ap_isolation)
Packit 5756e2
{
Packit Service a1bd4f
    self->_priv.ap_isolation = ap_isolation;
Packit 5756e2
}