summaryrefslogtreecommitdiff
path: root/mesh/manager.c
diff options
context:
space:
mode:
authorInga Stotland <inga.stotland@intel.com>2021-09-22 20:26:00 -0700
committerBrian Gix <brian.gix@intel.com>2021-09-27 13:22:39 -0700
commiteb642a59fbeb72d6f4580eeb7f0cbf6759720b8a (patch)
tree744291a473c85e4e647b246b092c3a7f605469a5 /mesh/manager.c
parent1dc110689577ddd14c44b1c869f695856381d03f (diff)
downloadbluez-eb642a59fbeb72d6f4580eeb7f0cbf6759720b8a.tar.gz
mesh: Implement ExportKeys() method
Add implementation for new method ExportKeys() on org.bluez.mesh.Management1 interface. This method is used by the authorized application to export information about network keys, application keys and device keys present in the local key database.
Diffstat (limited to 'mesh/manager.c')
-rw-r--r--mesh/manager.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/mesh/manager.c b/mesh/manager.c
index d70993e3b..e66b1a45b 100644
--- a/mesh/manager.c
+++ b/mesh/manager.c
@@ -776,6 +776,38 @@ static struct l_dbus_message *set_key_phase_call(struct l_dbus *dbus,
return l_dbus_message_new_method_return(msg);
}
+static struct l_dbus_message *export_keys_call(struct l_dbus *dbus,
+ struct l_dbus_message *msg,
+ void *user_data)
+{
+ const char *sender = l_dbus_message_get_sender(msg);
+ struct l_dbus_message_builder *builder;
+ struct l_dbus_message *reply;
+ struct mesh_node *node = user_data;
+
+ l_debug("Export Keys");
+
+ if (strcmp(sender, node_get_owner(node)))
+ return dbus_error(msg, MESH_ERROR_NOT_AUTHORIZED, NULL);
+
+ reply = l_dbus_message_new_method_return(msg);
+ builder = l_dbus_message_builder_new(reply);
+
+ l_dbus_message_builder_enter_array(builder, "{sv}");
+
+ if (!keyring_build_export_keys_reply(node, builder)) {
+ l_dbus_message_builder_destroy(builder);
+ l_dbus_message_unref(reply);
+ return dbus_error(msg, MESH_ERROR_FAILED, NULL);
+ }
+
+ l_dbus_message_builder_leave_array(builder);
+ l_dbus_message_builder_finalize(builder);
+ l_dbus_message_builder_destroy(builder);
+
+ return reply;
+}
+
static void setup_management_interface(struct l_dbus_interface *iface)
{
l_dbus_interface_method(iface, "AddNode", 0, add_node_call, "",
@@ -807,6 +839,9 @@ static void setup_management_interface(struct l_dbus_interface *iface)
"app_index", "app_key");
l_dbus_interface_method(iface, "SetKeyPhase", 0, set_key_phase_call, "",
"qy", "net_index", "phase");
+ l_dbus_interface_method(iface, "ExportKeys", 0, export_keys_call,
+ "a(qaya{sv})a(qay)", "",
+ "net_keys", "dev_keys");
}
bool manager_dbus_init(struct l_dbus *bus)