summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/TLS')
-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}