diff options
author | Determinant <[email protected]> | 2019-06-20 23:52:56 -0400 |
---|---|---|
committer | Determinant <[email protected]> | 2019-06-20 23:52:56 -0400 |
commit | 823585c4db2ef6752d12f489c83edab577b86099 (patch) | |
tree | 9ee3d121e74cc88cb8496d87c19a49a0e2681b93 | |
parent | 65f7c078663da387fd2cee8ab401c7ef66081138 (diff) |
finish test_msgnet_tls exampletls
-rw-r--r-- | include/salticidae/conn.h | 20 | ||||
-rw-r--r-- | include/salticidae/crypto.h | 21 | ||||
-rw-r--r-- | test/.gitignore | 2 | ||||
-rw-r--r-- | test/CMakeLists.txt | 3 | ||||
-rw-r--r-- | test/alice.pem | 83 | ||||
-rw-r--r-- | test/bench_network_tls.cpp | 6 | ||||
-rw-r--r-- | test/bob.pem | 83 | ||||
-rw-r--r-- | test/test_msgnet_tls.cpp | 182 |
8 files changed, 387 insertions, 13 deletions
diff --git a/include/salticidae/conn.h b/include/salticidae/conn.h index 59d93fc..a3da96c 100644 --- a/include/salticidae/conn.h +++ b/include/salticidae/conn.h @@ -112,7 +112,9 @@ class ConnPool { void disp_terminate(); public: - Conn(): ready_send(false), send_data_func(nullptr), recv_data_func(nullptr) {} + Conn(): ready_send(false), + send_data_func(nullptr), recv_data_func(nullptr), + tls(nullptr), peer_cert(nullptr) {} Conn(const Conn &) = delete; Conn(Conn &&other) = delete; @@ -133,7 +135,7 @@ class ConnPool { operator std::string() const; const NetAddr &get_addr() const { return addr; } - const X509 &get_peer_cert() const { return *peer_cert; } + const X509 *get_peer_cert() const { return peer_cert.get(); } ConnMode get_mode() const { return mode; } ConnPool *get_pool() const { return cpool; } MPSCWriteBuffer &get_send_buffer() { return send_buffer; } @@ -190,12 +192,16 @@ class ConnPool { void update_conn(const conn_t &conn, bool connected) { user_tcall->async_call([this, conn, connected](ThreadCall::Handle &) { - if ((!conn_cb || - conn_cb(conn, connected)) && - enable_tls && connected) - conn->worker->get_tcall()->async_call([conn](ThreadCall::Handle &) { - conn->recv_data_func = Conn::_recv_data_tls; + bool ret = !conn_cb || conn_cb(conn, connected); + if (enable_tls && connected) + { + conn->worker->get_tcall()->async_call([conn, ret](ThreadCall::Handle &) { + if (ret) + conn->recv_data_func = Conn::_recv_data_tls; + else + conn->worker_terminate(); }); + } }); } diff --git a/include/salticidae/crypto.h b/include/salticidae/crypto.h index bcfd9dc..7eec030 100644 --- a/include/salticidae/crypto.h +++ b/include/salticidae/crypto.h @@ -168,8 +168,8 @@ class PKey { return PKey(key); } - bytearray_t get_pubkey_der() { - uint8_t *der; + bytearray_t get_pubkey_der() const { + uint8_t *der = nullptr; auto ret = i2d_PublicKey(key, &der); if (ret <= 0) throw SalticidaeError(SALTI_ERROR_TLS_KEY); @@ -179,8 +179,8 @@ class PKey { return std::move(res); } - bytearray_t get_privkey_der() { - uint8_t *der; + bytearray_t get_privkey_der() const { + uint8_t *der = nullptr; auto ret = i2d_PrivateKey(key, &der); if (ret <= 0) throw SalticidaeError(SALTI_ERROR_TLS_KEY); @@ -229,13 +229,24 @@ class X509 { return X509(x509); } - PKey get_pubkey() { + PKey get_pubkey() const { auto key = X509_get_pubkey(x509); if (key == nullptr) throw SalticidaeError(SALTI_ERROR_TLS_X509); return PKey(key); } + bytearray_t get_der() const { + uint8_t *der = nullptr; + auto ret = i2d_X509(x509, &der); + if (ret <= 0) + throw SalticidaeError(SALTI_ERROR_TLS_X509); + bytearray_t res(der, der + ret); + OPENSSL_cleanse(der, ret); + OPENSSL_free(der); + return std::move(res); + } + ~X509() { if (x509) X509_free(x509); } }; diff --git a/test/.gitignore b/test/.gitignore index bbd91a2..7cebf5d 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -7,3 +7,5 @@ test_queue bench_network Makefile test_msgnet_c +test_msgnet_tls +bench_network_tls diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e7c5813..d112b7a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -29,6 +29,9 @@ target_link_libraries(test_bits salticidae_static) add_executable(test_msgnet test_msgnet.cpp) target_link_libraries(test_msgnet salticidae_static) +add_executable(test_msgnet_tls test_msgnet_tls.cpp) +target_link_libraries(test_msgnet_tls salticidae_static) + add_executable(test_p2p test_p2p.cpp) target_link_libraries(test_p2p salticidae_static) diff --git a/test/alice.pem b/test/alice.pem new file mode 100644 index 0000000..6efe00f --- /dev/null +++ b/test/alice.pem @@ -0,0 +1,83 @@ +-----BEGIN PRIVATE KEY----- +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 +THSAjGzVtLewAwo0qkl141+539oWDw== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIUFitZjQ11n2jQiX7GPH5RtQorw1gwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA2MjEwMjU5MThaFw0xOTA3 +MjEwMjU5MThaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDZFKh7iaGPvfvh6qYrQN0Twq9nnpukjHYG+Zjuq/6T +/JgMVezRXDA6e6nPH1va6tRzi+MsJ4Ues7alm6ddnxNgUOI2ROl9G6Gmx68Y75BG +R1vKMUw7ujz8flaXYFO5mASSbE87pI5F/Hm/7k0Ke47rEE6Ke1iARcv0pW9loFT8 +y00NBXg/IQSUSb1riDXOHVK3fY8xHN5w5/pXwaLNpqTByKOPcBCQhJBWh83n09vY +ysDEFzJC3QUvNWNCUttbgexqY8hJO4jP5SD+DmSiPw+6gNiyJdPdvmY+VgDXtd1d +1ApihkiLlSa3EhQAMbS6ajM3NuwS5ikpnZ5cNDvGuBS4XQx8R+X93Q1xyeclNVkd +2bFj0rdjfIxyurl8Nziq2/NM/AVCtBXCdGDO8aFnivPlA/FtfKbfuhhNVWts0ODL +HR8dd5AZpGjtgZBJiXW97XQOeG0hDp8WwBNns0UFEewkMOMX1ByA7ZWeOSiJHe+l +cmVEs7RaUcEhs5OK/sgAo3Ig+4mO0z6VH8gp/WxP8ce+5xA6cTao2wJn3N1ux4Oq +4fqZXR3rPh7IcEkHCyBKL1jxiUmPlIXvmED2PzyWSxyoDTm9w1TBLamD0Usdd1P9 +9Rclgri3erhr6kT4YnWV0WMqrsP3ZserGTkm3Gsi6s6X9sTdu3Yi/P4N2nvRPZOB +0wIDAQABo1MwUTAdBgNVHQ4EFgQU/dKIin9ueRiA5tqyKmD9w0g4TVAwHwYDVR0j +BBgwFoAU/dKIin9ueRiA5tqyKmD9w0g4TVAwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAgEANGM+fUoMyYkbdSRhocIJ/WZo3fb96289SsDmVrwQyazn +4O0MPlgz2y6RXQf0rDr0xQ9jj0hv6UEpVcaUdVrgRYJzW7YviN6x/urqsJNtVUJb +t6xF+IS+ibT4OulJlQyJlYX0opQQzVQGgKW8jwetPdBNVtoH5j7AZaCYhlOnOz6r +JpA07sI3fSuVb0NjDuHPgzR139r1IlpBLP/OmkG4LH19tP9Ad78Dehl7K/TA2Rwr +i3wZk77Wvbz7u5ZMqHxxdS4opUWYnpyApeudFNiXRS1ls7R7lJZE3+9OKT9EcVd+ +GwJzWJVvtqXotOqfjYVWj4EFebH9MAdb34l7F1OgyKQ3Nmw7BzuQ7XdoKn5/DL5Q +b9PeRSnWpzgaSEj341GlZL1fs2IY+KYxHB3XeptDgAIPRP7+Q39/FRKGyuxTX2l/ +7a1jIN7xRF15mqpEzbICch+RXv9hMMHqMr7H8psQXKbQTFZkZatwPneho1T6E58o +JLjQME1bOMR++forya9rZZCl11io3OitFbzewBmMdPCcA5fJS13MW7jJ6x41L/lw +d6qBH3eG2paTc+aVRIaJhhwR/ommpILiU8X/kXq6StLGB1YD5Jm0KvREyME/o0U7 +sT/91lpmMtRtwqaIOTZbUn1vEmS3aHZKS5q+Vs/eYZm3exF/L+Bzy40vn9wxU0I= +-----END CERTIFICATE----- diff --git a/test/bench_network_tls.cpp b/test/bench_network_tls.cpp index bb5d0c1..1143877 100644 --- a/test/bench_network_tls.cpp +++ b/test/bench_network_tls.cpp @@ -82,7 +82,11 @@ struct MyNet: public MsgNetworkByteOp { const NetAddr &peer, double stat_timeout = -1): MsgNetworkByteOp(ec, MsgNetworkByteOp::Config( - ConnPool::Config().queue_capacity(65536).enable_tls(true).tls_cert_file("all.pem").tls_key_file("all.pem")).burst_size(1000)), + ConnPool::Config() + .queue_capacity(65536) + .enable_tls(true) + .tls_cert_file("alice.pem") + .tls_key_file("alice.pem")).burst_size(1000)), name(name), peer(peer), ev_period_stat(ec, [this, stat_timeout](TimerEvent &) { diff --git a/test/bob.pem b/test/bob.pem new file mode 100644 index 0000000..8f8afcc --- /dev/null +++ b/test/bob.pem @@ -0,0 +1,83 @@ +-----BEGIN PRIVATE KEY----- +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 +HHHAbLi3XqeKbfEWQL0METvL2SBhlAA= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIUTfDNmCzLkU+iC/fDlcG2P7Z2iXMwDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA2MjEwMzI4MjVaFw0xOTA3 +MjEwMzI4MjVaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw +HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDfnQZzGUUL/pQN4g3U7fI6DHsvy6AztawB89m5nbXO +FA9YGiFpzTGByZ6xAJRRnoz5HtbwjbkAYiUcG+sbGF7RSDAchAOC0EYKK8YQd/kG +YzD/mIFzyzRSk1Kpc/SSIDKmuO9iFWfNSOqIzfkE8M0hV2vwbZ/tZfi/ToP8nH7Z +llpa6E2SQhQRDsojMPSyMkP2uYvBL9CjRbZzgsVPaHItfQkP5c3+oNTgTNbv6HwI +98h2xXYIAL8MKg7B/xj8BXczf9KGhWNCcRn/ci+wME08e9+FZUH1JYIQgRAu1Q7e +Gp5JhGl4Tls9/YTH7FFVTbpZZaoRj95mMKVTzrXOlSdiQcAuAnfKvSm733tK9VL/ +JFFWfrscWaWONKUEogW988hQ7xg+0VQ5BBd3/S6yT/0fUjVLwM2hoJguQFtNkuBd +eT7Bp+cVO0uI+g1sPFV3+0XC0Z5MytwedS+0BSq3KBheQ/FBTDZ8wHk9H1fPbNX4 +va1dj4bw2D5vuQL1gYTSIV5yUARakt78qH9s9+gkUfJGjtiI8FBbF5p4AhbBpKD0 +dhy7Pbkzw3zaWGCxOATUXTxiB9qgLwjancaxx1XegMB8ZhjoNjUzX1iBh11Sejmq +v0Sv1PLdAgzxlIVfaIkf/wyQwX/GGbqN7ne/J+lk2DIe3ynxn6FmIdvtfrFbbCGp +xQIDAQABo1MwUTAdBgNVHQ4EFgQUX/c1vXnm9tkgHTZndvy5PzgoupIwHwYDVR0j +BBgwFoAUX/c1vXnm9tkgHTZndvy5PzgoupIwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAgEAhUik2ITFpR8s571Ds1jNr/kvM3j1dwG1qCIN7GuE4XuV +0vS6W2FCeBfB/WPvf9HCQFNR9l9npPI27BJA1J853ywlzj6WyfiA9Fv517aOMCs+ +PaySYcM23Hyyi3sSAdNYWlnQg0JUI1kdIMb3dileleDz2Eh6IxIugpvZ3s+7bOiN +H2FkOrzMq/w8aJ+kUk8IyGToxtBVvmjbINRK0bgANHJOifzp5ASYqvEZAcggot1n +pvVToqGDxtuuVd4qX8/DXPCVooOJ0RAcGZ44+hXfN1T5icPmnqMLuoPx9qiUZO+T +PIHg2DknmZSEunyy4LO5SiEsQVBzL3v8voYIqoobBuB5A2wyG9BXT5c3OM2rxDkX +UfXjxMdiGu3+iOaGE0KePXVY6oy3vgbmaowh5n8ZN6sN8aJPty3ZdpYpRPXKJsft +DtTH5sITHiisU2+rV2kJMKyASrxPWJAxkelahbUacOzid83TG+uqBCUJY0YPLRsF +TCvZ/jqJ8PNXFiZWnfyVkH3qFNjzQ595xMLe5fE5p/pCEV7aqHI0Ds9VYy82IJAT +070s/gtoLj5DussTetb9rh7Nt9ndJ5T7vvL9aeSmulRs2Z1j6u7rTvo4TjAbLbxx +bCR8r/T+5G0F9qLC6o4C2kFfZSiogxtM8n6tCJzzpWnpMwVad0a+GuH4tdNFsQA= +-----END CERTIFICATE----- diff --git a/test/test_msgnet_tls.cpp b/test/test_msgnet_tls.cpp new file mode 100644 index 0000000..9c82234 --- /dev/null +++ b/test/test_msgnet_tls.cpp @@ -0,0 +1,182 @@ +/** + * Copyright (c) 2018 Cornell University. + * + * Author: Ted Yin <[email protected]> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include <cstdio> +#include <string> +#include <functional> + +#include "salticidae/msg.h" +#include "salticidae/event.h" +#include "salticidae/network.h" +#include "salticidae/stream.h" + +using salticidae::NetAddr; +using salticidae::DataStream; +using salticidae::MsgNetwork; +using salticidae::htole; +using salticidae::letoh; +using std::placeholders::_1; +using std::placeholders::_2; + +/** Hello Message. */ +struct MsgHello { + static const uint8_t opcode = 0x0; + DataStream serialized; + std::string name; + std::string text; + /** Defines how to serialize the msg. */ + MsgHello(const std::string &name, + const std::string &text) { + serialized << htole((uint32_t)name.length()); + serialized << name << text; + } + /** Defines how to parse the msg. */ + MsgHello(DataStream &&s) { + uint32_t len; + s >> len; + len = letoh(len); + name = std::string((const char *)s.get_data_inplace(len), len); + len = s.size(); + text = std::string((const char *)s.get_data_inplace(len), len); + } +}; + +/** Acknowledgement Message. */ +struct MsgAck { + static const uint8_t opcode = 0x1; + DataStream serialized; + MsgAck() {} + MsgAck(DataStream &&s) {} +}; + +const uint8_t MsgHello::opcode; +const uint8_t MsgAck::opcode; + +using MsgNetworkByteOp = MsgNetwork<uint8_t>; + +struct MyNet: public MsgNetworkByteOp { + const std::string name; + const salticidae::uint256_t peer_footprint; + const NetAddr peer; + + MyNet(const salticidae::EventContext &ec, + const std::string &name, + const std::string &peer_footprint_hex, + const NetAddr &peer): + MsgNetwork<uint8_t>(ec, MsgNetwork::Config( + ConnPool::Config() + .enable_tls(true) + .tls_cert_file(name + ".pem") + .tls_key_file(name + ".pem") + )), + name(name), + peer_footprint(salticidae::from_hex(peer_footprint_hex)), + peer(peer) { + /* message handler could be a bound method */ + reg_handler( + salticidae::generic_bind(&MyNet::on_receive_hello, this, _1, _2)); + + reg_conn_handler([this](const ConnPool::conn_t &conn, bool connected) { + bool res = true; + if (connected) + { + auto cert_der = salticidae::get_hash(conn->get_peer_cert()->get_der()); + res = peer_footprint == cert_der; + if (conn->get_mode() == ConnPool::Conn::ACTIVE) + { + printf("[%s] Connected, sending hello.\n", + this->name.c_str()); + /* send the first message through this connection */ + send_msg(MsgHello(this->name, "Hello there!"), + salticidae::static_pointer_cast<Conn>(conn)); + } + else + { + printf("[%s] Accepted, waiting for greetings.\n" + "The peer certificate footprint is %s (%s).\n", + this->name.c_str(), salticidae::get_hex(cert_der).c_str(), + res ? "ok" : "fail"); + } + } + else + { + printf("[%s] Disconnected, retrying.\n", this->name.c_str()); + /* try to reconnect to the same address */ + connect(conn->get_addr(), false); + } + return res; + }); + } + + void on_receive_hello(MsgHello &&msg, const MyNet::conn_t &conn) { + printf("[%s] %s says %s\n", + name.c_str(), + msg.name.c_str(), msg.text.c_str()); + /* send acknowledgement */ + send_msg(MsgAck(), conn); + } +}; + + +void on_receive_ack(MsgAck &&msg, const MyNet::conn_t &conn) { + auto net = static_cast<MyNet *>(conn->get_net()); + printf("[%s] the peer knows\n", net->name.c_str()); +} + +int main() { + salticidae::EventContext ec; + NetAddr alice_addr("127.0.0.1:12345"); + NetAddr bob_addr("127.0.0.1:12346"); + + /* test two nodes in the same main loop */ + MyNet alice(ec, "alice", "ed5a9a8c7429dcb235a88244bc69d43d16b35008ce49736b27aaa3042a674043", bob_addr); + MyNet bob(ec, "bob", "ef3bea4e72f4d0e85da7643545312e2ff6dded5e176560bdffb1e53b1cef4896", alice_addr); + + /* message handler could be a normal function */ + alice.reg_handler(on_receive_ack); + bob.reg_handler(on_receive_ack); + + /* start all threads */ + alice.start(); + bob.start(); + + /* accept incoming connections */ + alice.listen(alice_addr); + bob.listen(bob_addr); + + /* try to connect once */ + alice.connect(bob_addr); + bob.connect(alice_addr); + + /* the main loop can be shutdown by ctrl-c or kill */ + auto shutdown = [&](int) {ec.stop();}; + salticidae::SigEvent ev_sigint(ec, shutdown); + salticidae::SigEvent ev_sigterm(ec, shutdown); + ev_sigint.add(SIGINT); + ev_sigterm.add(SIGTERM); + + /* enter the main loop */ + ec.dispatch(); + return 0; +} |