diff options
Diffstat (limited to 'node/node_client.cpp')
| -rw-r--r-- | node/node_client.cpp | 46 |
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 |
