D-Bus: Add support to set pkcs11_{engine,module}_path
Add SetPKCS11EngineAndModulePath D-Bus method. Add PKCS11EnginePath and PKCS11ModulePath D-Bus property getters. Signed-hostap: Michael Schaller <misch@google.com>
This commit is contained in:
parent
80ed037f00
commit
bdec7ee5c9
6 changed files with 240 additions and 0 deletions
|
@ -408,6 +408,25 @@ fi.w1.wpa_supplicant1.CreateInterface.
|
|||
<h3>EAPLogon ( ) --> nothing</h3>
|
||||
<p>IEEE 802.1X EAPOL state machine logon.</p>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<h3>SetPKCS11EngineAndModulePath ( s : pkcs11_engine_path, s : pkcs11_module_path ) --> nothing</h3>
|
||||
<p>Set PKCS #11 engine and module path.</p>
|
||||
<h4>Arguments</h4>
|
||||
<dl>
|
||||
<dt>s : pkcs11_engine_path</dt>
|
||||
<dd>PKCS #11 engine path.</dd>
|
||||
<dt>s : pkcs11_module_path</dt>
|
||||
<dd>PKCS #11 module path.</dd>
|
||||
</dl>
|
||||
<h4>Possible errors</h4>
|
||||
<dl>
|
||||
<dt>org.freedesktop.DBus.Error.Failed.InvalidArgs</dt>
|
||||
<dd>Invalid PKCS #11 engine or module path.</dd>
|
||||
<dt>org.freedesktop.DBus.Error.Failed</dt>
|
||||
<dd>Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
\subsection dbus_interface_properties Properties
|
||||
|
@ -507,6 +526,16 @@ fi.w1.wpa_supplicant1.CreateInterface.
|
|||
<h3>ScanInterval - i - (read/write)</h3>
|
||||
<p>Time (in seconds) between scans for a suitable AP. Must be >= 0.</p>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<h3>PKCS11EnginePath - s - (read)</h3>
|
||||
<p>PKCS #11 engine path.</p>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<h3>PKCS11ModulePath - s - (read)</h3>
|
||||
<p>PKCS #11 module path.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
\subsection dbus_interface_signals Signals
|
||||
|
|
|
@ -2516,6 +2516,15 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
|
|||
}
|
||||
},
|
||||
#endif /* CONFIG_NO_CONFIG_BLOBS */
|
||||
{ "SetPKCS11EngineAndModulePath", WPAS_DBUS_NEW_IFACE_INTERFACE,
|
||||
(WPADBusMethodHandler)
|
||||
&wpas_dbus_handler_set_pkcs11_engine_and_module_path,
|
||||
{
|
||||
{ "pkcs11_engine_path", "s", ARG_IN },
|
||||
{ "pkcs11_module_path", "s", ARG_IN },
|
||||
END_ARGS
|
||||
}
|
||||
},
|
||||
#ifdef CONFIG_WPS
|
||||
{ "Start", WPAS_DBUS_NEW_IFACE_WPS,
|
||||
(WPADBusMethodHandler) &wpas_dbus_handler_wps_start,
|
||||
|
@ -2843,6 +2852,14 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
|
|||
wpas_dbus_getter_scan_interval,
|
||||
wpas_dbus_setter_scan_interval
|
||||
},
|
||||
{ "PKCS11EnginePath", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
||||
wpas_dbus_getter_pkcs11_engine_path,
|
||||
NULL
|
||||
},
|
||||
{ "PKCS11ModulePath", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
|
||||
wpas_dbus_getter_pkcs11_module_path,
|
||||
NULL
|
||||
},
|
||||
#ifdef CONFIG_WPS
|
||||
{ "ProcessCredentials", WPAS_DBUS_NEW_IFACE_WPS, "b",
|
||||
wpas_dbus_getter_process_credentials,
|
||||
|
|
|
@ -2161,6 +2161,63 @@ DBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message,
|
|||
#endif /* CONFIG_TDLS */
|
||||
|
||||
|
||||
/**
|
||||
* wpas_dbus_handler_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
|
||||
* @message: Pointer to incoming dbus message
|
||||
* @wpa_s: %wpa_supplicant data structure
|
||||
* Returns: A dbus message containing an error on failure or NULL on success
|
||||
*
|
||||
* Sets the PKCS #11 engine and module path.
|
||||
*/
|
||||
DBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
|
||||
DBusMessage *message, struct wpa_supplicant *wpa_s)
|
||||
{
|
||||
DBusMessageIter iter;
|
||||
char *value = NULL;
|
||||
char *pkcs11_engine_path = NULL;
|
||||
char *pkcs11_module_path = NULL;
|
||||
|
||||
dbus_message_iter_init(message, &iter);
|
||||
dbus_message_iter_get_basic(&iter, &value);
|
||||
if (value == NULL) {
|
||||
return dbus_message_new_error(
|
||||
message, DBUS_ERROR_INVALID_ARGS,
|
||||
"Invalid pkcs11_engine_path argument");
|
||||
}
|
||||
/* Empty path defaults to NULL */
|
||||
if (os_strlen(value))
|
||||
pkcs11_engine_path = value;
|
||||
|
||||
dbus_message_iter_next(&iter);
|
||||
dbus_message_iter_get_basic(&iter, &value);
|
||||
if (value == NULL) {
|
||||
os_free(pkcs11_engine_path);
|
||||
return dbus_message_new_error(
|
||||
message, DBUS_ERROR_INVALID_ARGS,
|
||||
"Invalid pkcs11_module_path argument");
|
||||
}
|
||||
/* Empty path defaults to NULL */
|
||||
if (os_strlen(value))
|
||||
pkcs11_module_path = value;
|
||||
|
||||
if (wpas_set_pkcs11_engine_and_module_path(wpa_s, pkcs11_engine_path,
|
||||
pkcs11_module_path))
|
||||
return dbus_message_new_error(
|
||||
message, DBUS_ERROR_FAILED,
|
||||
"Reinit of the EAPOL state machine with the new PKCS "
|
||||
"#11 engine and module path failed.");
|
||||
|
||||
wpa_dbus_mark_property_changed(
|
||||
wpa_s->global->dbus, wpa_s->dbus_new_path,
|
||||
WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
|
||||
wpa_dbus_mark_property_changed(
|
||||
wpa_s->global->dbus, wpa_s->dbus_new_path,
|
||||
WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpas_dbus_getter_capabilities - Return interface capabilities
|
||||
* @iter: Pointer to incoming dbus message iter
|
||||
|
@ -3176,6 +3233,76 @@ out:
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpas_dbus_getter_pkcs11_engine_path - Get PKCS #11 engine path
|
||||
* @iter: Pointer to incoming dbus message iter
|
||||
* @error: Location to store error on failure
|
||||
* @user_data: Function specific data
|
||||
* Returns: A dbus message containing the PKCS #11 engine path
|
||||
*
|
||||
* Getter for "PKCS11EnginePath" property.
|
||||
*/
|
||||
dbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data)
|
||||
{
|
||||
struct wpa_supplicant *wpa_s = user_data;
|
||||
const char *pkcs11_engine_path;
|
||||
|
||||
if (wpa_s->conf == NULL) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"wpas_dbus_getter_pkcs11_engine_path[dbus]: An "
|
||||
"error occurred getting the PKCS #11 engine path.");
|
||||
dbus_set_error_const(
|
||||
error, DBUS_ERROR_FAILED,
|
||||
"An error occured getting the PKCS #11 engine path.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (wpa_s->conf->pkcs11_engine_path == NULL)
|
||||
pkcs11_engine_path = "";
|
||||
else
|
||||
pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
|
||||
return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
|
||||
&pkcs11_engine_path, error);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpas_dbus_getter_pkcs11_module_path - Get PKCS #11 module path
|
||||
* @iter: Pointer to incoming dbus message iter
|
||||
* @error: Location to store error on failure
|
||||
* @user_data: Function specific data
|
||||
* Returns: A dbus message containing the PKCS #11 module path
|
||||
*
|
||||
* Getter for "PKCS11ModulePath" property.
|
||||
*/
|
||||
dbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data)
|
||||
{
|
||||
struct wpa_supplicant *wpa_s = user_data;
|
||||
const char *pkcs11_module_path;
|
||||
|
||||
if (wpa_s->conf == NULL) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"wpas_dbus_getter_pkcs11_module_path[dbus]: An "
|
||||
"error occurred getting the PKCS #11 module path.");
|
||||
dbus_set_error_const(
|
||||
error, DBUS_ERROR_FAILED,
|
||||
"An error occured getting the PKCS #11 module path.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (wpa_s->conf->pkcs11_module_path == NULL)
|
||||
pkcs11_module_path = "";
|
||||
else
|
||||
pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
|
||||
return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
|
||||
&pkcs11_module_path, error);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpas_dbus_getter_blobs - Get all blobs defined for this interface
|
||||
* @iter: Pointer to incoming dbus message iter
|
||||
|
|
|
@ -122,6 +122,9 @@ DBusMessage * wpas_dbus_handler_get_blob(DBusMessage *message,
|
|||
DBusMessage * wpas_dbus_handler_remove_blob(DBusMessage *message,
|
||||
struct wpa_supplicant *wpa_s);
|
||||
|
||||
DBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
|
||||
DBusMessage *message, struct wpa_supplicant *wpa_s);
|
||||
|
||||
DBusMessage * wpas_dbus_handler_flush_bss(DBusMessage *message,
|
||||
struct wpa_supplicant *wpa_s);
|
||||
|
||||
|
@ -218,6 +221,14 @@ dbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
|
|||
dbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
dbus_bool_t wpas_dbus_getter_pkcs11_engine_path(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
dbus_bool_t wpas_dbus_getter_pkcs11_module_path(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
dbus_bool_t wpas_dbus_getter_blobs(DBusMessageIter *iter, DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
|
|
|
@ -1957,6 +1957,59 @@ void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
|
||||
* @wpa_s: wpa_supplicant structure for a network interface
|
||||
* @pkcs11_engine_path: PKCS #11 engine path or NULL
|
||||
* @pkcs11_module_path: PKCS #11 module path or NULL
|
||||
* Returns: 0 on success; -1 on failure
|
||||
*
|
||||
* Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
|
||||
* path. If resetting the EAPOL state machine with the new PKCS #11 engine and
|
||||
* module path fails the paths will be reset to the default value (NULL).
|
||||
*/
|
||||
int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
|
||||
const char *pkcs11_engine_path,
|
||||
const char *pkcs11_module_path)
|
||||
{
|
||||
char *pkcs11_engine_path_copy = NULL;
|
||||
char *pkcs11_module_path_copy = NULL;
|
||||
|
||||
if (pkcs11_engine_path != NULL) {
|
||||
pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
|
||||
if (pkcs11_engine_path_copy == NULL)
|
||||
return -1;
|
||||
}
|
||||
if (pkcs11_module_path != NULL) {
|
||||
pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
|
||||
if (pkcs11_engine_path_copy == NULL) {
|
||||
os_free(pkcs11_engine_path_copy);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
os_free(wpa_s->conf->pkcs11_engine_path);
|
||||
os_free(wpa_s->conf->pkcs11_module_path);
|
||||
wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
|
||||
wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
|
||||
|
||||
wpa_sm_set_eapol(wpa_s->wpa, NULL);
|
||||
eapol_sm_deinit(wpa_s->eapol);
|
||||
wpa_s->eapol = NULL;
|
||||
if (wpa_supplicant_init_eapol(wpa_s)) {
|
||||
/* Error -> Reset paths to the default value (NULL) once. */
|
||||
if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
|
||||
wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
|
||||
NULL);
|
||||
|
||||
return -1;
|
||||
}
|
||||
wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wpa_supplicant_set_ap_scan - Set AP scan mode for interface
|
||||
* @wpa_s: wpa_supplicant structure for a network interface
|
||||
|
|
|
@ -772,6 +772,9 @@ void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
|
|||
struct wpa_ssid *ssid);
|
||||
void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
|
||||
struct wpa_ssid *ssid);
|
||||
int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
|
||||
const char *pkcs11_engine_path,
|
||||
const char *pkcs11_module_path);
|
||||
int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s,
|
||||
int ap_scan);
|
||||
int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
|
||||
|
|
Loading…
Reference in a new issue