Commit 1135449e authored by Robin Sommer's avatar Robin Sommer Committed by Dominik Charousset

Filling in OpenSSL code.

New actor system configuration options:

  openssl_certificate
  openssl_key
  openssl_passphrase
  openssl_capath
  openssl_cafile

If none of these options is set, SSL sessions remain unauthenticated.
If however at least one is set, the endpoint will require a valid
certificate from peers.
parent 18b5a995
......@@ -497,6 +497,7 @@ add_optional_caf_lib(io)
# build SSL module if OpenSSL library is available
find_package(OpenSSL)
if(OPENSSL_FOUND)
include_directories(BEFORE ${OPENSSL_INCLUDE_DIR})
add_optional_caf_lib(openssl)
endif(OPENSSL_FOUND)
......
......@@ -293,6 +293,14 @@ public:
std::string opencl_device_ids;
// -- config parameters of the OpenSSL module ---------------------------------
std::string openssl_certificate;
std::string openssl_key;
std::string openssl_passphrase;
std::string openssl_capath;
std::string openssl_cafile;
// -- factories --------------------------------------------------------------
value_factory_string_map value_factories_by_name;
......
......@@ -200,6 +200,17 @@ actor_system_config::actor_system_config()
opt_group(options_, "opencl")
.add(opencl_device_ids, "device-ids",
"restricts which OpenCL devices are accessed by CAF");
opt_group(options_, "openssl")
.add(openssl_certificate, "certificate",
"sets the path to the file containining the certificate for this node PEM format")
.add(openssl_key, "key",
"sets the path to the file containting the private key for this node")
.add(openssl_passphrase, "passphrase",
"sets the passphrase to decrypt the private key, if needed")
.add(openssl_capath, "capath",
"sets the path to an OpenSSL-style directory of trusted certificates")
.add(openssl_cafile, "cafile",
"sets the path to a file containing trusted certificates concatenated together in PEM format");
// add renderers for default error categories
error_renderers.emplace(atom("system"), render_sec);
error_renderers.emplace(atom("exit"), render_exit_reason);
......
......@@ -10,7 +10,8 @@ set (LIBCAF_OPENSSL_SRCS
src/manager.cpp
src/middleman_actor.cpp
src/publish.cpp
src/remote_actor.cpp)
src/remote_actor.cpp
src/ssl_session.cpp)
add_custom_target(libcaf_openssl)
......@@ -19,7 +20,12 @@ if (NOT CAF_BUILD_STATIC_ONLY)
add_library(libcaf_openssl_shared SHARED
${LIBCAF_OPENSSL_SRCS} ${LIBCAF_OPENSSL_HDRS})
target_link_libraries(libcaf_openssl_shared ${LD_FLAGS}
${CAF_LIBRARY_CORE} ${CAF_LIBRARY_IO})
${CAF_LIBRARY_CORE} ${CAF_LIBRARY_IO} ${OPENSSL_LIBRARIES})
if(NOT APPLE AND NOT WIN32)
target_link_libraries(libcaf_openssl_shared "-pthread")
endif()
set_target_properties(libcaf_openssl_shared
PROPERTIES
SOVERSION ${CAF_VERSION}
......@@ -38,7 +44,7 @@ if (CAF_BUILD_STATIC_ONLY OR CAF_BUILD_STATIC)
add_library(libcaf_openssl_static STATIC
${LIBCAF_OPENSSL_HDRS} ${LIBCAF_OPENSSL_SRCS})
target_link_libraries(libcaf_openssl_static ${LD_FLAGS}
${CAF_LIBRARY_CORE_STATIC} ${CAF_LIBRARY_IO_STATIC})
${CAF_LIBRARY_CORE_STATIC} ${CAF_LIBRARY_IO_STATIC} ${OPENSSL_LIBRARIES})
set_target_properties(libcaf_openssl_static PROPERTIES
OUTPUT_NAME caf_openssl_static)
if(NOT WIN32)
......
......@@ -55,6 +55,10 @@ public:
return system_;
}
/// Returns true if configured to require certificate-based authentication
/// of peers.
bool authentication_enabled();
/// Returns an OpenSSL manager using the default network backend.
/// @warning Creating an OpenSSL manager will fail when using the ASIO
/// network backend or any other custom implementation.
......
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2017 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#ifndef CAF_OPENSSL_SSL_SESSION_HPP
#define CAF_OPENSSL_SSL_SESSION_HPP
#include "caf/actor_system.hpp"
#include "caf/io/network/native_socket.hpp"
#include <openssl/err.h>
#include <openssl/ssl.h>
namespace caf {
namespace openssl {
using native_socket = io::network::native_socket;
class ssl_session {
public:
ssl_session(actor_system& sys);
~ssl_session();
bool read_some(size_t& result, native_socket fd, void* buf, size_t len);
bool write_some(size_t& result, native_socket fd, const void* buf,
size_t len);
bool connect(native_socket fd);
bool try_accept(native_socket fd);
const char* openssl_passphrase();
private:
SSL_CTX* create_ssl_context(actor_system& sys);
std::string get_ssl_error();
void raise_ssl_error(std::string msg);
bool handle_ssl_result(int ret);
SSL_CTX* ctx;
SSL* ssl;
std::string openssl_passphrase_;
};
} // namespace openssl
} // namespace caf
#endif // CAF_OPENSSL_SSL_SESSION_HPP
......@@ -19,6 +19,9 @@
#include "caf/openssl/manager.hpp"
#include <openssl/err.h>
#include <openssl/ssl.h>
#include "caf/expected.hpp"
#include "caf/actor_system.hpp"
#include "caf/scoped_actor.hpp"
......@@ -55,7 +58,19 @@ void manager::stop() {
void manager::init(actor_system_config&) {
CAF_LOG_TRACE("");
// TODO: initialize OpenSSL state
ERR_load_crypto_strings();
OPENSSL_add_all_algorithms_conf();
SSL_library_init();
SSL_load_error_strings();
if (authentication_enabled()) {
if (!system().config().openssl_certificate.size())
CAF_RAISE_ERROR("No certificate configured for SSL endpoint");
if (!system().config().openssl_key.size())
CAF_RAISE_ERROR("No private key configured for SSL endpoint");
}
}
actor_system::module::id_t manager::id() const {
......@@ -66,6 +81,13 @@ void* manager::subtype_ptr() {
return this;
}
bool manager::authentication_enabled() {
auto& cfg = system().config();
return cfg.openssl_certificate.size() || cfg.openssl_key.size()
|| cfg.openssl_passphrase.size() || cfg.openssl_capath.size()
|| cfg.openssl_cafile.size();
}
actor_system::module* manager::make(actor_system& sys, detail::type_list<>) {
if (!sys.has_middleman())
CAF_RAISE_ERROR("Cannot start OpenSSL module without middleman.");
......
......@@ -39,6 +39,8 @@
#include "caf/io/network/interfaces.hpp"
#include "caf/io/network/default_multiplexer.hpp"
#include "caf/openssl/ssl_session.hpp"
namespace caf {
namespace openssl {
......@@ -48,34 +50,53 @@ using native_socket = io::network::native_socket;
using default_mpx = io::network::default_multiplexer;
struct ssl_policy {
/// Reads up to `len` bytes from an OpenSSL socket.
static bool read_some(size_t& result, native_socket fd, void* buf,
ssl_policy(std::shared_ptr<ssl_session> ssl) : ssl_(ssl) {
}
bool read_some(size_t& result, native_socket fd, void* buf,
size_t len) {
CAF_LOG_TRACE(CAF_ARG(fd) << CAF_ARG(len));
// TODO: implement me
CAF_RAISE_ERROR("unimplemented function: openssl::read_some");
return ssl_->read_some(result, fd, buf, len);
}
static bool write_some(size_t& result, native_socket fd, const void* buf,
bool write_some(size_t& result, native_socket fd, const void* buf,
size_t len) {
CAF_LOG_TRACE(CAF_ARG(fd) << CAF_ARG(len));
// TODO: implement me
CAF_RAISE_ERROR("unimplemented function: openssl::write_some");
return ssl_->write_some(result, fd, buf, len);
}
static bool try_accept(native_socket& result, native_socket fd) {
bool try_accept(native_socket& result, native_socket fd) {
CAF_LOG_TRACE(CAF_ARG(fd));
// TODO: implement me
CAF_RAISE_ERROR("unimplemented function: openssl::try_accept");
sockaddr_storage addr;
memset(&addr, 0, sizeof(addr));
socklen_t addrlen = sizeof(addr);
result = ::accept(fd, reinterpret_cast<sockaddr*>(&addr), &addrlen);
CAF_LOG_DEBUG(CAF_ARG(fd) << CAF_ARG(result));
if (result == io::network::invalid_native_socket) {
auto err = io::network::last_socket_error();
if (!io::network::would_block_or_temporarily_unavailable(err))
return false;
}
return ssl_->try_accept(result);
}
private:
std::shared_ptr<ssl_session> ssl_;
};
class scribe_impl : public io::scribe {
public:
scribe_impl(default_mpx& mpx, native_socket sockfd)
scribe_impl(default_mpx& mpx, native_socket sockfd,
std::shared_ptr<ssl_session> ssl)
: scribe(io::network::conn_hdl_from_socket(sockfd)),
launched_(false),
stream_(mpx, sockfd) {
stream_(mpx, sockfd, ssl) {
// nop
}
......@@ -146,9 +167,11 @@ class scribe_impl : public io::scribe {
class doorman_impl : public io::doorman {
public:
doorman_impl(default_mpx& mx, native_socket sockfd)
doorman_impl(default_mpx& mx, native_socket sockfd,
std::shared_ptr<ssl_session> ssl)
: doorman(io::network::accept_hdl_from_socket(sockfd)),
acceptor_(mx, sockfd) {
acceptor_(mx, sockfd, ssl),
ssl_(ssl) {
// nop
}
......@@ -161,7 +184,8 @@ public:
// further activities for the broker
return false;
auto& dm = acceptor_.backend();
auto sptr = dm.new_scribe(acceptor_.accepted_socket());
auto sptr =
make_counted<scribe_impl>(dm, acceptor_.accepted_socket(), ssl_);
auto hdl = sptr->hdl();
parent()->add_scribe(std::move(sptr));
return doorman::new_connection(&dm, hdl);
......@@ -202,6 +226,7 @@ public:
private:
io::network::acceptor_impl<ssl_policy> acceptor_;
std::shared_ptr<ssl_session> ssl_;
};
class middleman_actor_impl : public io::middleman_actor_impl {
......@@ -214,16 +239,29 @@ public:
protected:
expected<io::scribe_ptr> connect(const std::string& host,
uint16_t port) override {
native_socket fd;
// TODO: implement me
return make_counted<scribe_impl>(mpx(), fd);
auto fd = io::network::new_tcp_connection(host, port);
if (!fd)
return std::move(fd.error());
auto ssl = std::make_shared<ssl_session>(system());
if (ssl->connect(*fd))
return make_counted<scribe_impl>(mpx(), *fd, ssl);
else
return sec::cannot_connect_to_node;
}
expected<io::doorman_ptr> open(uint16_t port, const char* addr,
bool reuse) override {
native_socket fd;
// TODO: implement me
return make_counted<doorman_impl>(mpx(), fd);
auto fd = io::network::new_tcp_acceptor_impl(port, addr, reuse);
if (!fd)
return std::move(fd.error());
auto ssl = std::make_shared<ssl_session>(system());
return make_counted<doorman_impl>(mpx(), *fd, ssl);
}
private:
......
......@@ -37,20 +37,21 @@ namespace openssl {
expected<strong_actor_ptr> remote_actor(actor_system& sys,
const std::set<std::string>& mpi,
std::string host, uint16_t port) {
CAF_LOG_TRACE(CAF_ARG(expected) << CAF_ARG(host) << CAF_ARG(port));
CAF_LOG_TRACE(CAF_ARG(mpi) << CAF_ARG(host) << CAF_ARG(port));
expected<strong_actor_ptr> res{strong_actor_ptr{nullptr}};
scoped_actor self{sys};
self->request(sys.openssl_manager().actor_handle(), infinite,
connect_atom::value, std::move(host), port)
.receive(
[&](const node_id&, strong_actor_ptr& ptr, std::set<std::string>& found) {
if (res) {
if (ptr) {
if (sys.assignable(found, mpi))
res = std::move(ptr);
else
res = sec::unexpected_actor_messaging_interface;
} else {
res = sec::no_actor_published_at_port;
}
res = sec::no_actor_published_at_port;
},
[&](error& err) {
res = std::move(err);
......
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2017 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/openssl/ssl_session.hpp"
#include <sys/socket.h>
#include "caf/actor_system_config.hpp"
#include "caf/openssl/manager.hpp"
namespace caf {
namespace openssl {
static int pem_passwd_cb(char* buf, int size, int rwflag, void* session);
ssl_session::ssl_session(actor_system& sys) {
ctx = create_ssl_context(sys);
ssl = SSL_new(ctx);
if (!ssl)
CAF_RAISE_ERROR("cannot create SSL session");
}
ssl_session::~ssl_session() {
SSL_free(ssl);
SSL_CTX_free(ctx);
}
bool ssl_session::read_some(size_t& result, native_socket fd, void* buf,
size_t len) {
CAF_LOG_TRACE(CAF_ARG(fd) << CAF_ARG(len));
if (len == 0)
return 0;
auto ret = SSL_read(ssl, buf, len);
if (ret > 0) {
result = ret;
return true;
} else {
result = 0;
return handle_ssl_result(ret);
}
}
bool ssl_session::write_some(size_t& result, native_socket fd, const void* buf,
size_t len) {
CAF_LOG_TRACE(CAF_ARG(fd) << CAF_ARG(len));
if (len == 0)
return true;
auto ret = SSL_write(ssl, buf, len);
if (ret > 0) {
result = ret;
return true;
} else {
result = 0;
return handle_ssl_result(ret);
}
}
bool ssl_session::connect(native_socket fd) {
SSL_set_fd(ssl, fd);
SSL_set_connect_state(ssl);
auto ret = SSL_connect(ssl);
return ret > 0 || handle_ssl_result(ret);
}
bool ssl_session::try_accept(native_socket fd) {
SSL_set_fd(ssl, fd);
SSL_set_accept_state(ssl);
auto ret = SSL_accept(ssl);
if (ret > 0)
return true;
else
return handle_ssl_result(ret);
}
const char* ssl_session::openssl_passphrase() {
return openssl_passphrase_.c_str();
}
SSL_CTX* ssl_session::create_ssl_context(actor_system& sys) {
auto ctx = SSL_CTX_new(TLSv1_2_method());
if (!ctx)
raise_ssl_error("cannot create OpenSSL context");
if (sys.openssl_manager().authentication_enabled()) {
// Require valid certificates on both sides.
auto& cfg = sys.config();
if (cfg.openssl_certificate.size()
&& SSL_CTX_use_certificate_chain_file(ctx,
cfg.openssl_certificate.c_str())
!= 1)
raise_ssl_error("cannot load certificate");
if (cfg.openssl_passphrase.size()) {
openssl_passphrase_ = cfg.openssl_passphrase;
SSL_CTX_set_default_passwd_cb(ctx, pem_passwd_cb);
SSL_CTX_set_default_passwd_cb_userdata(ctx, (void*)this);
}
if (cfg.openssl_key.size()
&& SSL_CTX_use_PrivateKey_file(ctx, cfg.openssl_key.c_str(),
SSL_FILETYPE_PEM)
!= 1)
raise_ssl_error("cannot load private key");
auto cafile =
(cfg.openssl_cafile.size() ? cfg.openssl_cafile.c_str() : nullptr);
auto capath =
(cfg.openssl_capath.size() ? cfg.openssl_capath.c_str() : nullptr);
if (cafile || capath) {
if (SSL_CTX_load_verify_locations(ctx, cafile, capath) != 1)
raise_ssl_error("cannot load trusted CA certificates");
}
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr);
if (SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!MD5") != 1)
raise_ssl_error("cannot set cipher list");
}
else {
// No authentication.
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);
auto ecdh = EC_KEY_new_by_curve_name(NID_secp384r1);
if (!ecdh)
raise_ssl_error("cannot get ECDH curve");
SSL_CTX_set_tmp_ecdh(ctx, ecdh);
if (SSL_CTX_set_cipher_list(ctx, "AECDH-AES256-SHA") != 1)
raise_ssl_error("cannot set anonymous cipher");
}
return ctx;
}
std::string ssl_session::get_ssl_error() {
std::string msg = "";
while (auto err = ERR_get_error()) {
if (msg.size())
msg += " ";
char buf[256];
ERR_error_string_n(err, buf, sizeof(buf));
msg += buf;
}
return msg;
}
void ssl_session::raise_ssl_error(std::string msg) {
CAF_RAISE_ERROR(std::string("[OpenSSL] ") + msg + ": " + get_ssl_error());
}
bool ssl_session::handle_ssl_result(int ret) {
auto err = SSL_get_error(ssl, ret);
switch (err) {
case SSL_ERROR_WANT_READ: // Try again next time.
case SSL_ERROR_WANT_WRITE:
return true;
case SSL_ERROR_ZERO_RETURN: // Regular remote connection shutdown.
case SSL_ERROR_SYSCALL: // Socket connection closed.
return false;
default: // Other error
// TODO: Log somehow?
// auto msg = get_ssl_error();
return false;
}
}
static int pem_passwd_cb(char* buf, int size, int /* rwflag */, void* session) {
auto passphrase = static_cast<ssl_session*>(session)->openssl_passphrase();
strncpy(buf, passphrase, size);
buf[size - 1] = '\0';
return strlen(buf);
}
} // namespace openssl
} // namespace caf
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2017 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/config.hpp"
#define CAF_SUITE openssl_authentication_failure
#include "caf/test/unit_test.hpp"
#include <vector>
#include <sstream>
#include <utility>
#include <algorithm>
#include <limits.h>
#include <stdlib.h>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
#include "caf/openssl/all.hpp"
using namespace caf;
namespace {
constexpr char local_host[] = "127.0.0.1";
class config : public actor_system_config {
public:
config() {
load<io::middleman>();
load<openssl::manager>();
add_message_type<std::vector<int>>("std::vector<int>");
actor_system_config::parse(test::engine::argc(),
test::engine::argv());
}
static std::string data_dir() {
auto path = std::string(::caf::test::engine::path());
auto found = path.find_last_of("/");
path = path.substr(0, path.find_last_of("/"));
path += "/../../libcaf_openssl/test";
char rpath[PATH_MAX];
return realpath(path.c_str(), rpath);
}
};
behavior make_pong_behavior() {
return {
[](int val) -> int {
CAF_MESSAGE("pong with " << ++val);
return val;
}
};
}
behavior make_ping_behavior(event_based_actor* self, const actor& pong) {
CAF_MESSAGE("ping with " << 0);
self->send(pong, 0);
return {
[=](int val) -> int {
if (val == 3) {
CAF_MESSAGE("ping with exit");
self->send_exit(self->current_sender(),
exit_reason::user_shutdown);
CAF_MESSAGE("ping quits");
self->quit();
}
CAF_MESSAGE("ping with " << val);
return val;
}
};
}
} // namespace <anonymous>
struct fixture_certs_failure {
config server_side_config;
actor_system server_side{server_side_config};
config client_side_config;
actor_system client_side{client_side_config};
fixture_certs_failure()
{
server_side_config.openssl_cafile = config::data_dir() + "/ca.pem";
server_side_config.openssl_certificate = config::data_dir() + "/cert.1.pem";
server_side_config.openssl_key = config::data_dir() + "/key.1.enc.pem";
server_side_config.openssl_passphrase = "12345";
// client_side_config.openssl_cafile = config::data_dir() + "/ca.pem";
client_side_config.openssl_certificate = config::data_dir() + "/cert.2.pem";
client_side_config.openssl_key = config::data_dir() + "/key.2.pem";
}
};
CAF_TEST_FIXTURE_SCOPE(authentication_failure, fixture_certs_failure)
using openssl::remote_actor;
using openssl::publish;
CAF_TEST(authentication_failure_ping_pong) {
// server side
CAF_EXP_THROW(port,
publish(server_side.spawn(make_pong_behavior), 0, local_host));
// client side
CAF_EXP_THROW(pong, remote_actor(client_side, local_host, port));
client_side.spawn(make_ping_behavior, pong);
}
CAF_TEST_FIXTURE_SCOPE_END()
/******************************************************************************
* ____ _ _____ *
* / ___| / \ | ___| C++ *
* | | / _ \ | |_ Actor *
* | |___ / ___ \| _| Framework *
* \____/_/ \_|_| *
* *
* Copyright (C) 2011 - 2017 *
* Dominik Charousset <dominik.charousset (at) haw-hamburg.de> *
* *
* Distributed under the terms and conditions of the BSD 3-Clause License or *
* (at your option) under the terms and conditions of the Boost Software *
* License 1.0. See accompanying files LICENSE and LICENSE_ALTERNATIVE. *
* *
* If you did not receive a copy of the license files, see *
* http://opensource.org/licenses/BSD-3-Clause and *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
#include "caf/config.hpp"
#define CAF_SUITE openssl_authentication_success
#include "caf/test/unit_test.hpp"
#include <vector>
#include <sstream>
#include <utility>
#include <algorithm>
#include <limits.h>
#include <stdlib.h>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
#include "caf/openssl/all.hpp"
using namespace caf;
namespace {
constexpr char local_host[] = "127.0.0.1";
class config : public actor_system_config {
public:
config() {
load<io::middleman>();
load<openssl::manager>();
add_message_type<std::vector<int>>("std::vector<int>");
actor_system_config::parse(test::engine::argc(),
test::engine::argv());
}
static std::string data_dir() {
auto path = std::string(::caf::test::engine::path());
auto found = path.find_last_of("/");
path = path.substr(0, path.find_last_of("/"));
path += "/../../libcaf_openssl/test";
char rpath[PATH_MAX];
return realpath(path.c_str(), rpath);
}
};
behavior make_pong_behavior() {
return {
[](int val) -> int {
CAF_MESSAGE("pong with " << ++val);
return val;
}
};
}
behavior make_ping_behavior(event_based_actor* self, const actor& pong) {
CAF_MESSAGE("ping with " << 0);
self->send(pong, 0);
return {
[=](int val) -> int {
if (val == 3) {
CAF_MESSAGE("ping with exit");
self->send_exit(self->current_sender(),
exit_reason::user_shutdown);
CAF_MESSAGE("ping quits");
self->quit();
}
CAF_MESSAGE("ping with " << val);
return val;
}
};
}
} // namespace <anonymous>
struct fixture_certs_success {
config server_side_config;
actor_system server_side{server_side_config};
config client_side_config;
actor_system client_side{client_side_config};
fixture_certs_success()
{
server_side_config.openssl_cafile = config::data_dir() + "/ca.pem";
server_side_config.openssl_certificate = config::data_dir() + "/cert.1.pem";
server_side_config.openssl_key = config::data_dir() + "/key.1.enc.pem";
server_side_config.openssl_passphrase = "12345";
client_side_config.openssl_cafile = config::data_dir() + "/ca.pem";
client_side_config.openssl_certificate = config::data_dir() + "/cert.2.pem";
client_side_config.openssl_key = config::data_dir() + "/key.2.pem";
}
};
CAF_TEST_FIXTURE_SCOPE(authentication_success, fixture_certs_success)
using openssl::remote_actor;
using openssl::publish;
CAF_TEST(authentication_success_ping_pong) {
// server side
CAF_EXP_THROW(port,
publish(server_side.spawn(make_pong_behavior), 0, local_host));
// client side
CAF_EXP_THROW(pong, remote_actor(client_side, local_host, port));
client_side.spawn(make_ping_behavior, pong);
}
CAF_TEST_FIXTURE_SCOPE_END()
-----BEGIN CERTIFICATE-----
MIIDmzCCAoOgAwIBAgIJAPLZ3e3WR0LLMA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJDQTERMA8GA1UEBwwIQmVya2VsZXkxIzAhBgNVBAoM
GkFDTUUgU2lnbmluZyBBdXRob3JpdHkgSW5jMRAwDgYDVQQDDAdmb28uYmFyMB4X
DTE3MDQyMTIzMjM0OFoXDTQyMDQyMTIzMjM0OFowZDELMAkGA1UEBhMCVVMxCzAJ
BgNVBAgMAkNBMREwDwYDVQQHDAhCZXJrZWxleTEjMCEGA1UECgwaQUNNRSBTaWdu
aW5nIEF1dGhvcml0eSBJbmMxEDAOBgNVBAMMB2Zvby5iYXIwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC6ah79JvrN3LtcPzc9bX5THdzfidWncSmowotG
SZA3gcIhlsYD3P3RCaUR9g+f2Z/l0l7ciKgWetpNtN9hRBbg5/9tFzSpCb/Y0SSG
mwtHHovEqN2MWV+Od/MUcYSlL6MmPjSDc8Ls5NSniTr9OBE9J1jm72AsuzHasjPQ
D84TlWeTSs0HW3H5VxDb15xWYFnmgBo0JylDWj0+VWI+G41Xr7Ubu9699lWSFYF9
FCtdjzM5e1CGZOMvqUbUBus38BhUAdQ4fE7Dwnn8seKh+7HpJ70omIgqG87e4DBo
HbnMAkZaekk8+LBl0Hfu8c66Utw9mNoMIlFf/AMlJyLDIpNxAgMBAAGjUDBOMB0G
A1UdDgQWBBRc6Cbyshtny6jFWZtd/cEUUfMQ3DAfBgNVHSMEGDAWgBRc6Cbyshtn
y6jFWZtd/cEUUfMQ3DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCY
numHau9XYH5h4R2CoMdnKPMGk6V7UZZdbidLLcE4roQrYhnBdyhT69b/ySJK2Ee4
mt8T+E0wcg3k8Pr3aJEJA8eYYaJTqZvvv+TwuMBPjmE2rYSIpgMZv2tRD3XWMaQu
duLbwkclfejQHDD26xNXsxuU+WNB5kuvtNAg0oKFyFdNKElLQEcjyYzfxmCF4YX5
WmElijr1Tzuzd59rWPqC/tVIsh42vQ+P6g8Y1PDmo8eTUFveZ+wcr/eEPW6IOMrg
OW7tATcrgzNuXZ1umiuGgAPuIVqPfr9ssZHBqi9UOK9L/8MQrnOxecNUpPohcTFR
vq+Zqu15QV9T4BVWKHv0
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDOjCCAiICCQDz7oMOR7Wm7jANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExETAPBgNVBAcMCEJlcmtlbGV5MSMwIQYDVQQKDBpBQ01F
IFNpZ25pbmcgQXV0aG9yaXR5IEluYzEQMA4GA1UEAwwHZm9vLmJhcjAgFw0xNzA0
MjEyMzI2MzhaGA80NzU1MDMxOTIzMjYzOFowWDELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMREwDwYDVQQHDAhCZXJrZWxleTEVMBMGA1UECgwMQUNNRSBTZXJ2aWNl
MRIwEAYDVQQDDAkxLmZvby5iYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDHobccAQQqbZANdOdx852W/nUzGcwpurOi8zbh9yCxMwnFMogW9AsqKEnd
sypV6Ah/cIz45PAgCdEg+1pc2DG7+E0+QlV4ChNwCDuk+FSWB6pqMTCdZcLeIwlA
GPp6Ow9v40dW7IFpDetFKXEo6kqEzR5P58Q0a6KpCtpsSMqhk57Py83wB9gPA1vp
s77kN7D5CI3oay86TA5j5nfFMT1X/77Hs24csW6CLnW/OD4f1RK79UgPd/kpPKQ1
jNq+hsR7NZTcfrAF1hcfScxnKaznO7WopSt1k75NqLdnSN1GIci2GpiXYKtXZ9l5
TErv2Oucpw/u+a/wjKlXjrgLL9lfAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAKuW
yKA2uuiNc9MKU+yVbNaP8kPaMb/wMvVaFG8FFFpCTZ0MFMLsqRpeqtj7gMK/gaJC
CQm4EyadjzfWFYDLkHzm6b7gI8digvvhjr/C2RJ5Qxr2P0iFP1buGq0CqnF20XgQ
Q+ecS43CZ77CfKfS6ZLPmAZMAwgFLImVyo5mkaTECo3+9oCnjDYBapvXLJqCJRhk
NosoTmGCV0HecWN4l38ojnXd44aSktQIND9iCLus3S6++nFnX5DHGZiv6/SnSO/6
+Op7nV0A6zKVcMOYQ0SGZPD8UQs5wDJgrR9LY29Ox5QBwu/5NqyvNSrMQaTop5vb
wkMInaq5lLxEYQDSLBc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDOjCCAiICCQDz7oMOR7Wm7TANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExETAPBgNVBAcMCEJlcmtlbGV5MSMwIQYDVQQKDBpBQ01F
IFNpZ25pbmcgQXV0aG9yaXR5IEluYzEQMA4GA1UEAwwHZm9vLmJhcjAgFw0xNzA0
MjEyMzI2MzNaGA80NzU1MDMxOTIzMjYzM1owWDELMAkGA1UEBhMCVVMxCzAJBgNV
BAgMAkNBMREwDwYDVQQHDAhCZXJrZWxleTEVMBMGA1UECgwMQUNNRSBTZXJ2aWNl
MRIwEAYDVQQDDAkyLmZvby5iYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDG9fAvW9qnhjGRmLpA++RvOHaesu7NiUQvxf2F6gF2rLJV0/+DSA/PztEv
1WJaGhgJSaEqUjaHk3HY2EKlbGXEPh1mxqgPZD5plGlu4ddTwutxCxxQiFIBH+3N
MYRjJvDN7ozJoi4uRiK0QQdDWAqWJs5hMOJqeWd6MCgmVXSP6pj5/omGROktbHzD
9jJhAW9fnYFg6k+7cGN5kLmjqqnGhJkNtgom6uW9j73S9OpU/9Er2aZme6/PrujI
qYFBV81TJK2vmonWUITxfQjk9JVJYhBdHamGTxUqVBbuRcbAqdImV9yx4LoGh55u
L6xnsW4i0n1o1k+bh03NgwPz12O3AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAJmN
yCdInFIeEwomE6m+Su82BWBzkztOfMG9iRE+1aGuC8EQ8kju5NNMmWQcuKetNh0s
hJVdY6LXh27O0ZUllhQ/ig9c+dYFh6AHoZU7WjiNKIyWuyl4IAOkQ4IEdsBvst+l
0rafcdJjUpqNOMWeyg6x1s+gUD5o+ZLCZGCdkCW3fZbKgF52L+vmsSRiJg2JkYZW
8BPNNsroHZw2UXnLvRqUXCMf1hnOrlx/B0a0Q46hD4NQvl+OzlKaxfR2L2USmJ8M
XZvT6+i8fWvkGv18iunm23Yu+8Zf08wTXnbqXvmMda5upAYLmwD0YKIVYC3ycihh
mkYCYI6PVeH63a2/zxw=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,4FEF2D042C3D3463
S3uHh5KH2Vsxzhw+B8zKsZNUG7CjMAvYfZwUptDnCms2dqxdfyzioxiRVNTN2MBb
nFxMKZayl5Xjr+04LhUpCAKdmvTfqGmWRFVSa8ol1hvqN/Vmg3a11B+3MD9pHXKu
ipgHMDTmE34DsDun6cXZ8W2k9ZSSJ20Y7qhcb4lTYUZuWq+94+Bup684COZytbyG
Eb6tOvVs/N6KeFhvd4vBL4YgTR3aY/vu1cHQQJeHvSYFtGKTKr7qpsfFfDFB7ExM
bqt2qbiUq1s+uZ0hlDjs+/TCZpC9Wuqpl9m05FrZhboubBRK9pw3wRVNvrpfwunH
2/E4Ta8/YaxypUwtk4saiPofKcJwvYx3Te38OHKKXgVKlein1p1e6eJNZt3qJaPd
BEBAR11iWstE+ghPS2WmrwT17cDqNA8wG5CRM9unYVWRMtO8Nl98OYars0vAXOgd
TI8bHDx6OHm2sJnkc56HAfu6hMdTbKzZXsWyOqLXUU79ioNmTvbMQUO0F+0VKDrv
3LikXewv69aOhhk+M96ng8KpWUW4z2kbDReiFuWQfjtiFNyEdS9wQIElpq5gU98r
EAeZoT6s8O0fkE/tt374ZJREEe9YEkMFcv06c96GPkMKnScncOFKRa1w0AblGxOM
vjICMLIk3CesFNWNzJk4MQu5ZVerJsz27UFocjNUvT6iM10rDCeU55W71bIPWRSb
SZL3JUi1gOeORrv3jAEamOd6YRlvPRYQjpDENg/qnx+bdXp5S3qHeHFSkRRHBCfy
UcYUba5hZJVDyBJXC4dkc2Ftcna149PZP1aKe9r//ZGa25PVZl1Mg6HhLROSJrEN
D2lqPMYcBDuSiZ6QK5ZHh2gsXJPktDgMhw4ZNIfIIqIpMDJ7rV4tQXXwB3d+iZte
/Ib/y1Mn8fZOo448nBqagpNFvU70eg7WkA4rzgiS3VzFYosP3g48PlZ07bEZ0awy
9lMGE0OKJv6x8EkVY0xHDxujzD5WVFEkanpGo8bWl1ofBrsnnDsFrvvRkDRsQbrG
WZkRqn7zLaGKOUirfKjfktajvPOAKMsvbl9KXAfp88sOtTZuYppCivZ/2qnzQ8xg
9/fuGfpAPXYfUu44+7dhrbvxJzrPp+GQRLUb1e3KA2MLgVak+yV1TIKdDGYek5vM
xDEmLLgOQqsE/OAcdXD2b/qIVYEmFPdut6N9K0m65AoqrN5nY6r0BzuC7usCgxnu
K6Z7Y2L6Ax4DjnKt21RRcjIVLLpea7KXnMiTogCYJ7+zmD82fE3i1xCDQs7R9b4T
tZhnkGfQS2RjOp3WaiV5rcmOKXDK3kYE+ezD0wbiVFDgB2jNdR7duOFqzW/WuPac
hsIPYn7VmjLB3W4p7PBf7OQ1fIiQ6IofeMvu8I8IOVRfC7eYDCJ0QKsHI8uA6j9T
vOCfjsZcpjygtN1Xy3uXIEZUVJJq/DF5t2Lxn95wDG9VfstJQR3KuDbPwYAWOYCh
W6gYu6HftIr3OlIYKurtSUFM4+iargMUaBVOUQ4XWLN8LzoyHNL3fsiGKn1afBV/
J3Qaqrn/YBGCAc2SOUCRl3F8yfWjmidXy6rQIzrjpF8aX2QSflB+fw==
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAx6G3HAEEKm2QDXTncfOdlv51MxnMKbqzovM24fcgsTMJxTKI
FvQLKihJ3bMqVegIf3CM+OTwIAnRIPtaXNgxu/hNPkJVeAoTcAg7pPhUlgeqajEw
nWXC3iMJQBj6ejsPb+NHVuyBaQ3rRSlxKOpKhM0eT+fENGuiqQrabEjKoZOez8vN
8AfYDwNb6bO+5Dew+QiN6GsvOkwOY+Z3xTE9V/++x7NuHLFugi51vzg+H9USu/VI
D3f5KTykNYzavobEezWU3H6wBdYXH0nMZyms5zu1qKUrdZO+Tai3Z0jdRiHIthqY
l2CrV2fZeUxK79jrnKcP7vmv8IypV464Cy/ZXwIDAQABAoIBAC0Y7jmoTR2clJ9F
modWhnI215kMqd9/atdT5EEVx8/f/MQMj0vII8GJSm6H6/duLIVFksMjTM+gCBtQ
TPCOcmXJSQHYkGBGvm9fnMG+y7T81FWa+SWFeIkgFxXgzqzQLMOU72fGk9F8sHp2
Szb3/o+TmtZoQB2rdxqC9ibiJsxrG5IBVKkzlSPv3POkPXwSb1HcETqrTwefuioj
WMuMrqtm5Y3HddJ5l4JEF5VA3KrsfXWl3JLHH0UViemVahiNjXQAVTKAXIL1PHAV
J2MCEvlpA7sIgXREbmvPvZUTkt3pIqhVjZVJ7tHiSnSecqNTbuxcocnhKhZrHNtC
v2zYKHkCgYEA6cAIhz0qOGDycZ1lf9RSWw0RO1hO8frATMQNVoFVuJJCVL22u96u
0FvJ0JGyYbjthULnlOKyRe7DUL5HRLVS4D7vvKCrgwDmsJp1VFxMdASUdaBfq6aX
oKLUW4q7kC2lQcmK/PVRYwp2GQSx8bodWe+DtXUY/GcN03znY8mhSB0CgYEA2qJK
1GSZsm6kFbDek3BiMMHfO+X819owB2FmXiH+GQckyIZu9xA3HWrkOWTqwglEvzfO
qzFF96E9iEEtseAxhcM8gPvfFuXiUj9t2nH/7SzMnVGikhtYi0p6jrgHmscc4NBx
AOUA15kYEFOGqpZfl2uuKqgHidrHdGkJzzSUBqsCgYAVCjb6TVQejQNlnKBFOExN
a8iwScuZVlO21TLKJYwct/WGgSkQkgO0N37b6jFfQHEIvLPxn9IiH1KvUuFBWvzh
uGiF1wR5HzykitKizEgJbVwbllrmLXGagO2Sa9NkL+efG1AKYt53hrqIl/aYZoM7
1CZL0AV2uqPw9F4zijOdNQKBgH1WmvWGMsKjQTgaLI9z1ybCjjqlj70jHXOtt+Tx
Md2hRcobn5PN3PrlY68vlpHkhF/nG3jzB3x+GGt7ijm2IE3h7la3jl5vLb8fE9gu
kJykmSz7Nurx+GHqMbaN8/Ycfga4GIB9yGzRHIWHjOVQzb5eAfv8Vk4GeV/YM8Jx
Dwd/AoGAILn8pVC9dIFac2BDOFU5y9ZvMmZAvwRxh9vEWewNvkzg27vdYc+rCHNm
I7H0S/RqfqVeo0ApE5PQ8Sll6RvxN/mbSQo9YeCDGQ1r1rNe4Vs12GAYXAbE4ipf
BTdqMbieumB/zL97iK5baHUFEJ4VRtLQhh/SOXgew/BF8ccpilI=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxvXwL1vap4YxkZi6QPvkbzh2nrLuzYlEL8X9heoBdqyyVdP/
g0gPz87RL9ViWhoYCUmhKlI2h5Nx2NhCpWxlxD4dZsaoD2Q+aZRpbuHXU8LrcQsc
UIhSAR/tzTGEYybwze6MyaIuLkYitEEHQ1gKlibOYTDianlnejAoJlV0j+qY+f6J
hkTpLWx8w/YyYQFvX52BYOpPu3BjeZC5o6qpxoSZDbYKJurlvY+90vTqVP/RK9mm
Znuvz67oyKmBQVfNUyStr5qJ1lCE8X0I5PSVSWIQXR2phk8VKlQW7kXGwKnSJlfc
seC6Boeebi+sZ7FuItJ9aNZPm4dNzYMD89djtwIDAQABAoIBAQDDaWquGRl40GR/
C/JjQQPr+RkIZdYGKXu/MEcA8ATf+l5tzfp3hp+BCzCKOpqOxHI3LQoN9xF3t2lq
AX3z27NYO2nFN/h4pYxnRk0Hiulia1+zd6YnsrxYPnPhxXCxsd1xZYsBvzh8WoZb
ZEMt8Zr0PskUzF6VFQh9Ci9k9ym07ooo/KqP4wjXsm/JK1ueOCTpRtabrBI1icrV
iTaw1JEGqlTAQ92vg3pXqSG5yy69Krt7miZZtiOA5mJ90VrHtlNSgp31AOcVv/Ve
/LMIwJp9EzTN+4ipT7AKPeJAoeVqpFjQk+2cW44zJ7xyzw73pTs5ErxkEIhQOp4M
ak2iMg4BAoGBAOivDZSaOcTxEB3oKxYvN/jL9eU2Io9wdZwAZdYQpkgc8lkM9elW
2rbHIwifkDxQnZbl3rXM8xmjA4c5PSCUYdPnLvx6nsUJrWTG0RjakHRliSLthNEC
LpL9MR1aQblyz1D/ulWTFOCNvHU7m3XI3RVJEQWu3qQ5pCndzT56wXjnAoGBANrl
zKvR9o2SONU8SDIcMzXrO2647Z8yXn4Kz1WhWojhRQQ1V3VOLm8gBwv8bPtc7LmE
MSX5MIcxRoHu7D98d53hd+K/ZGYV2h/638qaIEgZDf2oa8QylBgvoGljoy1DH8nN
KKOgksqWK0AAEkP0+S4IFugTxHVanw8JUkV0gVSxAoGBANIRUGJrxmHt/M3zUArs
QE0G3o28DQGQ1y0rEsVrLKQINid9UvoBpt3C9PcRD2fUpCGakDFzwbnQeRv46h3i
uFtV6Q6aKYLcFMXZ1ObqU+Yx0NhOtUz4+lFL8q58UL/7Tf3jkjc13XBJpe31DYoN
+MMBvzNxR6HeRD5j96tDqi3bAoGAT57SqZS/l5MeNQGuSPvU7MHZZlbBp+xMTpBk
BgOgyLUXw4Ybf8GmRiliJsv0YCHWwUwCDIvtSN91hAGB0T3WzIiccM+pFzDPnF5G
VI1nPJJQcnl2aXD0SS/ZqzvguK/3uhFzvMDFZAbnSGo+OpW6pTGwE05NYVpLDM8Z
K8ZK3KECgYEApNoI5Mr5tmtjq4sbZrgQq6cMlfkIj9gUubOzFCryUb6NaB38Xqkp
2N3/jqdkR+5ZiKOYhsYj+Iy6U3jyqiEl9VySYTfEIfP/ky1CD0a8/EVC9HR4iG8J
im6G7/osaSBYAZctryLqVJXObTelgEy/EFwW9jW8HVph/G+ljmHOmuQ=
-----END RSA PRIVATE KEY-----
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment