aboutsummaryrefslogtreecommitdiff
path: root/node/node_client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/node_client.cpp')
-rw-r--r--node/node_client.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/node/node_client.cpp b/node/node_client.cpp
new file mode 100644
index 0000000..fef1937
--- /dev/null
+++ b/node/node_client.cpp
@@ -0,0 +1,46 @@
+
+#include "node.hpp"
+
+void Node::handle_client_keyexchange(ClientConnections::key_type handle, cmix_proto::KeyExchange const& ke) {
+ CMixClientData d;
+
+ size_t len = get_group_element_array_size(&cmix_ctx);
+
+ cmix_proto::KeyExchange nke;
+ nke.mutable_public_key()->resize(len);
+ nke.mutable_value()->resize(len);
+
+ key_exchange(&cmix_ctx, &d.shared_value.shared, &(*nke.mutable_public_key())[0], &(*nke.mutable_value())[0], ke.public_key().data(), ke.value().data());
+
+ data[handle] = d;
+
+ clients.at(handle).async_send(nke);
+}
+
+void Node::handle_client_bye(ClientConnections::key_type handle, cmix_proto::Bye const&)
+{
+ clients.at(handle).close();
+ clients.erase(handle);
+}
+
+void Node::handle_client_message(ClientConnections::key_type handle, cmix_proto::CMixMessage message)
+{
+ switch(message.contents_case()) {
+ case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling keyexchange";
+ handle_client_keyexchange(handle, message.keyexchange());
+ break;
+ }
+ case cmix_proto::CMixMessage::ContentsCase::kBye: {
+ BOOST_LOG_TRIVIAL(trace) << "Handling bye";
+ handle_client_bye(handle, message.bye());
+ return;
+ }
+ default: {
+ BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents.";
+ }
+ }
+ clients.at(handle).async_receive([this, handle](cmix_proto::CMixMessage message){
+ handle_client_message(handle, message);
+ });
+} \ No newline at end of file