diff options
Diffstat (limited to 'Swiften/TLS')
| -rw-r--r-- | Swiften/TLS/OpenSSL/OpenSSLContext.cpp | 4 | ||||
| -rw-r--r-- | Swiften/TLS/UnitTest/ClientServerTest.cpp | 83 |
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 | ||
| 414 | class TLSEventToStringVisitor : public boost::static_visitor<std::string> { | 413 | class 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 | ||
| 613 | TEST(ClientServerTest, testClientServerBasicCommunicationEncryptedPrivateKeyRightPassword) { | 629 | TEST(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 | ||
| 643 | TEST(ClientServerTest, testClientServerBasicCommunicationWithChainedCert) { | 659 | TEST(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 | ||
| 752 | TEST(ClientServerTest, testClientServerSNIRequestedHostUnavailable) { | 769 | TEST(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 | ||
| 836 | TEST(ClientServerTest, testClientServerBasicCommunicationWith1024BitDHParams) { | 853 | TEST(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 | } |
Swift