summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2019-01-21 13:01:53 (GMT)
committerTobias Markmann <tm@ayena.de>2019-01-21 13:01:53 (GMT)
commit54c71ab51b6c8d94492168e9cf6cf6045d7794f3 (patch)
tree4b8cde2ada29274c91de760568741d2cc084338f
parent68dd665d51c925a118cfced4583942b7157b59de (diff)
downloadswift-54c71ab51b6c8d94492168e9cf6cf6045d7794f3.zip
swift-54c71ab51b6c8d94492168e9cf6cf6045d7794f3.tar.bz2
Fix OpenSSLContext to work correctly with OpenSSL 1.1.1
The previous code only worked with 1.1.0j or older. Now the code works with 1.1.0j and OpenSSL 1.1.1. Adjusted ClientServerTest to be more graceful in case of errors, i.e. failing tests instead of crashing. Test-Information: Tested that without the changes, the tests pass with OpenSSL 1.1.0j and test fail or crash with OpenSSL 1.1.1 and OpenSSL 1.1.1a. Tested that with the changes, the tests pass with OpenSSL 1.1.0j, OpenSSL 1.1.1, and OpenSSL 1.1.1a. Tested on macOS 10.14.2 with system clang. Change-Id: Ic63774049727f6d949153166f63a8545e9a24892
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLContext.cpp4
-rw-r--r--Swiften/TLS/UnitTest/ClientServerTest.cpp83
2 files changed, 54 insertions, 33 deletions
diff --git a/Swiften/TLS/OpenSSL/OpenSSLContext.cpp b/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
index e9889bc..5692e74 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
+++ b/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
@@ -229,6 +229,7 @@ void OpenSSLContext::doAccept() {
229 onConnected(); 229 onConnected();
230 // The following call is important so the client knowns the handshake is finished. 230 // The following call is important so the client knowns the handshake is finished.
231 sendPendingDataToNetwork(); 231 sendPendingDataToNetwork();
232 sendPendingDataToApplication();
232 break; 233 break;
233 } 234 }
234 case SSL_ERROR_WANT_READ: 235 case SSL_ERROR_WANT_READ:
@@ -254,6 +255,9 @@ void OpenSSLContext::doConnect() {
254 //const char* comp = SSL_get_current_compression(handle_.get()); 255 //const char* comp = SSL_get_current_compression(handle_.get());
255 //std::cout << "Compression: " << SSL_COMP_get_name(comp) << std::endl; 256 //std::cout << "Compression: " << SSL_COMP_get_name(comp) << std::endl;
256 onConnected(); 257 onConnected();
258 // The following is needed since OpenSSL 1.1.1 for the server to be able to calculate the
259 // TLS finish message.
260 sendPendingDataToNetwork();
257 break; 261 break;
258 } 262 }
259 case SSL_ERROR_WANT_READ: 263 case SSL_ERROR_WANT_READ:
diff --git a/Swiften/TLS/UnitTest/ClientServerTest.cpp b/Swiften/TLS/UnitTest/ClientServerTest.cpp
index 24bd7c5..a356dcf 100644
--- a/Swiften/TLS/UnitTest/ClientServerTest.cpp
+++ b/Swiften/TLS/UnitTest/ClientServerTest.cpp
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2010-2018 Isode Limited. 2 * Copyright (c) 2010-2019 Isode Limited.
3 * All rights reserved. 3 * All rights reserved.
4 * See the COPYING file for more information. 4 * See the COPYING file for more information.
5 */ 5 */
@@ -408,7 +408,6 @@ class TLSEventToSafeByteArrayVisitor : public boost::static_visitor<SafeByteArra
408 SafeByteArray operator()(const TLSServerNameRequested&) const { 408 SafeByteArray operator()(const TLSServerNameRequested&) const {
409 return createSafeByteArray(""); 409 return createSafeByteArray("");
410 } 410 }
411
412}; 411};
413 412
414class TLSEventToStringVisitor : public boost::static_visitor<std::string> { 413class TLSEventToStringVisitor : public boost::static_visitor<std::string> {
@@ -459,6 +458,23 @@ class TLSClientServerEventHistory {
459 } 458 }
460 } 459 }
461 460
461 template<class TLSEventType>
462 boost::optional<TLSEventType> getEvent(const std::string& peer, size_t number = 0) {
463 for (const auto& pair : events) {
464 if (pair.first == peer) {
465 if (pair.second.type() == typeid(TLSEventType)) {
466 if (number == 0) {
467 return boost::optional<TLSEventType>(boost::get<TLSEventType>(pair.second));
468 }
469 else {
470 number--;
471 }
472 }
473 }
474 }
475 return {};
476 }
477
462 private: 478 private:
463 void connectContext(const std::string& name, TLSContext* context) { 479 void connectContext(const std::string& name, TLSContext* context) {
464 connections_.push_back(context->onDataForNetwork.connect([=](const SafeByteArray& data) { 480 connections_.push_back(context->onDataForNetwork.connect([=](const SafeByteArray& data) {
@@ -602,12 +618,12 @@ TEST(ClientServerTest, testClientServerBasicCommunication) {
602 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client.")); 618 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
603 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server.")); 619 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
604 620
605 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 621 auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
606 return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication)); 622 ASSERT_EQ(true, firstMessageFromClient.is_initialized());
607 })->second))); 623 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
608 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 624 auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
609 return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication)); 625 ASSERT_EQ(true, firstMessageFromServer.is_initialized());
610 })->second))); 626 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
611} 627}
612 628
613TEST(ClientServerTest, testClientServerBasicCommunicationEncryptedPrivateKeyRightPassword) { 629TEST(ClientServerTest, testClientServerBasicCommunicationEncryptedPrivateKeyRightPassword) {
@@ -632,12 +648,12 @@ TEST(ClientServerTest, testClientServerBasicCommunicationEncryptedPrivateKeyRigh
632 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client.")); 648 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
633 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server.")); 649 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
634 650
635 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 651 auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
636 return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication)); 652 ASSERT_EQ(true, firstMessageFromClient.is_initialized());
637 })->second))); 653 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
638 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 654 auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
639 return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication)); 655 ASSERT_EQ(true, firstMessageFromServer.is_initialized());
640 })->second))); 656 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
641} 657}
642 658
643TEST(ClientServerTest, testClientServerBasicCommunicationWithChainedCert) { 659TEST(ClientServerTest, testClientServerBasicCommunicationWithChainedCert) {
@@ -739,14 +755,15 @@ TEST(ClientServerTest, testClientServerSNIRequestedHostAvailable) {
739 755
740 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client.")); 756 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
741 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server.")); 757 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
742 ASSERT_EQ("This is a test message from the client.", safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){
743 return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication));
744 })->second)));
745 ASSERT_EQ("This is a test message from the server.", safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){
746 return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication));
747 })->second)));
748 758
749 ASSERT_EQ("/CN=montague.example", boost::get<TLSConnected>(events.events[5].second).chain[0]->getSubjectName()); 759 auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
760 ASSERT_EQ(true, firstMessageFromClient.is_initialized());
761 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
762 auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
763 ASSERT_EQ(true, firstMessageFromServer.is_initialized());
764 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
765
766 ASSERT_EQ("/CN=montague.example", events.getEvent<TLSConnected>("client")->chain[0]->getSubjectName());
750} 767}
751 768
752TEST(ClientServerTest, testClientServerSNIRequestedHostUnavailable) { 769TEST(ClientServerTest, testClientServerSNIRequestedHostUnavailable) {
@@ -825,12 +842,12 @@ TEST(ClientServerTest, testClientServerBasicCommunicationWith2048BitDHParams) {
825 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client.")); 842 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
826 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server.")); 843 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
827 844
828 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 845 auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
829 return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication)); 846 ASSERT_EQ(true, firstMessageFromClient.is_initialized());
830 })->second))); 847 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
831 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 848 auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
832 return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication)); 849 ASSERT_EQ(true, firstMessageFromServer.is_initialized());
833 })->second))); 850 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
834} 851}
835 852
836TEST(ClientServerTest, testClientServerBasicCommunicationWith1024BitDHParams) { 853TEST(ClientServerTest, testClientServerBasicCommunicationWith1024BitDHParams) {
@@ -857,10 +874,10 @@ TEST(ClientServerTest, testClientServerBasicCommunicationWith1024BitDHParams) {
857 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client.")); 874 clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
858 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server.")); 875 serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
859 876
860 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 877 auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
861 return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication)); 878 ASSERT_EQ(true, firstMessageFromClient.is_initialized());
862 })->second))); 879 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
863 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){ 880 auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
864 return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication)); 881 ASSERT_EQ(true, firstMessageFromServer.is_initialized());
865 })->second))); 882 ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
866} 883}