11e934351Sopenharmony_ci/* 21e934351Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41e934351Sopenharmony_ci * you may not use this file except in compliance with the License. 51e934351Sopenharmony_ci * You may obtain a copy of the License at 61e934351Sopenharmony_ci * 71e934351Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81e934351Sopenharmony_ci * 91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e934351Sopenharmony_ci * See the License for the specific language governing permissions and 131e934351Sopenharmony_ci * limitations under the License. 141e934351Sopenharmony_ci */ 151e934351Sopenharmony_ci 161e934351Sopenharmony_ci#include <fstream> 171e934351Sopenharmony_ci#include <gtest/gtest.h> 181e934351Sopenharmony_ci#include <iostream> 191e934351Sopenharmony_ci#include <openssl/rsa.h> 201e934351Sopenharmony_ci#include <openssl/ssl.h> 211e934351Sopenharmony_ci#include <sstream> 221e934351Sopenharmony_ci#include <string> 231e934351Sopenharmony_ci#include <string_view> 241e934351Sopenharmony_ci#include <unistd.h> 251e934351Sopenharmony_ci#include <vector> 261e934351Sopenharmony_ci 271e934351Sopenharmony_ci#include "net_address.h" 281e934351Sopenharmony_ci#include "secure_data.h" 291e934351Sopenharmony_ci#include "socket_error.h" 301e934351Sopenharmony_ci#include "socket_state_base.h" 311e934351Sopenharmony_ci#include "tls.h" 321e934351Sopenharmony_ci#include "tls_certificate.h" 331e934351Sopenharmony_ci#include "tls_configuration.h" 341e934351Sopenharmony_ci#include "tls_key.h" 351e934351Sopenharmony_ci#include "tls_socket_server.h" 361e934351Sopenharmony_ci#include "tls_socket.h" 371e934351Sopenharmony_ci 381e934351Sopenharmony_cinamespace OHOS { 391e934351Sopenharmony_cinamespace NetStack { 401e934351Sopenharmony_cinamespace TlsSocketServer { 411e934351Sopenharmony_cinamespace { 421e934351Sopenharmony_ciconst std::string_view CA_DER = "/data/ClientCert/ca.crt"; 431e934351Sopenharmony_ciconst std::string_view IP_ADDRESS = "/data/Ip/address.txt"; 441e934351Sopenharmony_ciconst std::string_view PORT = "/data/Ip/port.txt"; 451e934351Sopenharmony_ci 461e934351Sopenharmony_ciinline bool CheckCaFileExistence(const char *function) 471e934351Sopenharmony_ci{ 481e934351Sopenharmony_ci if (access(CA_DER.data(), 0)) { 491e934351Sopenharmony_ci std::cout << "CA file does not exist! (" << function << ")"; 501e934351Sopenharmony_ci return false; 511e934351Sopenharmony_ci } 521e934351Sopenharmony_ci return true; 531e934351Sopenharmony_ci} 541e934351Sopenharmony_ci 551e934351Sopenharmony_cistd::string ChangeToFile(std::string_view fileName) 561e934351Sopenharmony_ci{ 571e934351Sopenharmony_ci std::ifstream file; 581e934351Sopenharmony_ci file.open(fileName); 591e934351Sopenharmony_ci std::stringstream ss; 601e934351Sopenharmony_ci ss << file.rdbuf(); 611e934351Sopenharmony_ci std::string infos = ss.str(); 621e934351Sopenharmony_ci file.close(); 631e934351Sopenharmony_ci return infos; 641e934351Sopenharmony_ci} 651e934351Sopenharmony_ci 661e934351Sopenharmony_ci 671e934351Sopenharmony_cistd::string GetIp(std::string ip) 681e934351Sopenharmony_ci{ 691e934351Sopenharmony_ci return ip.substr(0, ip.length() - 1); 701e934351Sopenharmony_ci} 711e934351Sopenharmony_ci 721e934351Sopenharmony_ci} // namespace 731e934351Sopenharmony_ciclass TlsSocketServerTest : public testing::Test { 741e934351Sopenharmony_cipublic: 751e934351Sopenharmony_ci static void SetUpTestCase() {} 761e934351Sopenharmony_ci 771e934351Sopenharmony_ci static void TearDownTestCase() {} 781e934351Sopenharmony_ci 791e934351Sopenharmony_ci virtual void SetUp() {} 801e934351Sopenharmony_ci 811e934351Sopenharmony_ci virtual void TearDown() {} 821e934351Sopenharmony_ci}; 831e934351Sopenharmony_ci 841e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, ListenInterface, testing::ext::TestSize.Level2) 851e934351Sopenharmony_ci{ 861e934351Sopenharmony_ci if (!CheckCaFileExistence("ListenInterface")) { 871e934351Sopenharmony_ci return; 881e934351Sopenharmony_ci } 891e934351Sopenharmony_ci TLSSocketServer server; 901e934351Sopenharmony_ci TlsSocket::TLSConnectOptions tlsListenOptions; 911e934351Sopenharmony_ci 921e934351Sopenharmony_ci server.Listen(tlsListenOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 931e934351Sopenharmony_ci} 941e934351Sopenharmony_ci 951e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, sendInterface, testing::ext::TestSize.Level2) 961e934351Sopenharmony_ci{ 971e934351Sopenharmony_ci if (!CheckCaFileExistence("sendInterface")) { 981e934351Sopenharmony_ci return; 991e934351Sopenharmony_ci } 1001e934351Sopenharmony_ci 1011e934351Sopenharmony_ci TLSSocketServer server; 1021e934351Sopenharmony_ci 1031e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 1041e934351Sopenharmony_ci 1051e934351Sopenharmony_ci const std::string data = "how do you do? this is sendInterface"; 1061e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 1071e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1081e934351Sopenharmony_ci} 1091e934351Sopenharmony_ci 1101e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, closeInterface, testing::ext::TestSize.Level2) 1111e934351Sopenharmony_ci{ 1121e934351Sopenharmony_ci if (!CheckCaFileExistence("closeInterface")) { 1131e934351Sopenharmony_ci return; 1141e934351Sopenharmony_ci } 1151e934351Sopenharmony_ci 1161e934351Sopenharmony_ci TLSSocketServer server; 1171e934351Sopenharmony_ci 1181e934351Sopenharmony_ci const std::string data = "how do you do? this is closeInterface"; 1191e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 1201e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 1211e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 1221e934351Sopenharmony_ci 1231e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1241e934351Sopenharmony_ci sleep(2); 1251e934351Sopenharmony_ci 1261e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1271e934351Sopenharmony_ci} 1281e934351Sopenharmony_ci 1291e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, stopInterface, testing::ext::TestSize.Level2) 1301e934351Sopenharmony_ci{ 1311e934351Sopenharmony_ci if (!CheckCaFileExistence("stopInterface")) { 1321e934351Sopenharmony_ci return; 1331e934351Sopenharmony_ci } 1341e934351Sopenharmony_ci 1351e934351Sopenharmony_ci TLSSocketServer server; 1361e934351Sopenharmony_ci 1371e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 1381e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 1391e934351Sopenharmony_ci 1401e934351Sopenharmony_ci 1411e934351Sopenharmony_ci const std::string data = "how do you do? this is stopInterface"; 1421e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 1431e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1441e934351Sopenharmony_ci sleep(2); 1451e934351Sopenharmony_ci 1461e934351Sopenharmony_ci 1471e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1481e934351Sopenharmony_ci sleep(2); 1491e934351Sopenharmony_ci 1501e934351Sopenharmony_ci 1511e934351Sopenharmony_ci server.Stop([](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1521e934351Sopenharmony_ci} 1531e934351Sopenharmony_ci 1541e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, getRemoteAddressInterface, testing::ext::TestSize.Level2) 1551e934351Sopenharmony_ci{ 1561e934351Sopenharmony_ci if (!CheckCaFileExistence("getRemoteAddressInterface")) { 1571e934351Sopenharmony_ci return; 1581e934351Sopenharmony_ci } 1591e934351Sopenharmony_ci 1601e934351Sopenharmony_ci TLSSocketServer server; 1611e934351Sopenharmony_ci 1621e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 1631e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 1641e934351Sopenharmony_ci Socket::NetAddress address; 1651e934351Sopenharmony_ci 1661e934351Sopenharmony_ci address.SetAddress(GetIp(ChangeToFile(IP_ADDRESS))); 1671e934351Sopenharmony_ci address.SetPort(std::atoi(ChangeToFile(PORT).c_str())); 1681e934351Sopenharmony_ci address.SetFamilyBySaFamily(AF_INET); 1691e934351Sopenharmony_ci 1701e934351Sopenharmony_ci Socket::NetAddress netAddress; 1711e934351Sopenharmony_ci server.GetRemoteAddress(socketFd, [&netAddress](int32_t errCode, 1721e934351Sopenharmony_ci const Socket::NetAddress &address) { 1731e934351Sopenharmony_ci EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); 1741e934351Sopenharmony_ci netAddress.SetAddress(address.GetAddress()); 1751e934351Sopenharmony_ci netAddress.SetPort(address.GetPort()); 1761e934351Sopenharmony_ci netAddress.SetFamilyBySaFamily(address.GetSaFamily()); 1771e934351Sopenharmony_ci }); 1781e934351Sopenharmony_ci 1791e934351Sopenharmony_ci const std::string data = "how do you do? this is getRemoteAddressInterface"; 1801e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 1811e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1821e934351Sopenharmony_ci sleep(2); 1831e934351Sopenharmony_ci 1841e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1851e934351Sopenharmony_ci sleep(2); 1861e934351Sopenharmony_ci 1871e934351Sopenharmony_ci server.Stop([](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 1881e934351Sopenharmony_ci} 1891e934351Sopenharmony_ci 1901e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, getRemoteCertificateInterface, testing::ext::TestSize.Level2) 1911e934351Sopenharmony_ci{ 1921e934351Sopenharmony_ci if (!CheckCaFileExistence("getRemoteCertificateInterface")) { 1931e934351Sopenharmony_ci return; 1941e934351Sopenharmony_ci } 1951e934351Sopenharmony_ci 1961e934351Sopenharmony_ci TLSSocketServer server; 1971e934351Sopenharmony_ci 1981e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 1991e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 2001e934351Sopenharmony_ci 2011e934351Sopenharmony_ci 2021e934351Sopenharmony_ci const std::string data = "how do you do? This is UT test getRemoteCertificateInterface"; 2031e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 2041e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { 2051e934351Sopenharmony_ci EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 2061e934351Sopenharmony_ci sleep(2); 2071e934351Sopenharmony_ci 2081e934351Sopenharmony_ci server.GetRemoteCertificate(socketFd, [](int32_t errCode, const TlsSocket::X509CertRawData &cert) { 2091e934351Sopenharmony_ci EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 2101e934351Sopenharmony_ci 2111e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 2121e934351Sopenharmony_ci sleep(2); 2131e934351Sopenharmony_ci 2141e934351Sopenharmony_ci server.Stop([](int32_t errCode) { EXPECT_TRUE(errCode == TlsSocket::TLSSOCKET_SUCCESS); }); 2151e934351Sopenharmony_ci} 2161e934351Sopenharmony_ci 2171e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, getCertificateInterface, testing::ext::TestSize.Level2) 2181e934351Sopenharmony_ci{ 2191e934351Sopenharmony_ci if (!CheckCaFileExistence("getCertificateInterface")) { 2201e934351Sopenharmony_ci return; 2211e934351Sopenharmony_ci } 2221e934351Sopenharmony_ci TLSSocketServer server; 2231e934351Sopenharmony_ci 2241e934351Sopenharmony_ci const std::string data = "how do you do? This is UT test getCertificateInterface"; 2251e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 2261e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 2271e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 2281e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2291e934351Sopenharmony_ci 2301e934351Sopenharmony_ci server.GetCertificate( 2311e934351Sopenharmony_ci [](int32_t errCode, const TlsSocket::X509CertRawData &cert) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2321e934351Sopenharmony_ci 2331e934351Sopenharmony_ci sleep(2); 2341e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2351e934351Sopenharmony_ci} 2361e934351Sopenharmony_ci 2371e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, protocolInterface, testing::ext::TestSize.Level2) 2381e934351Sopenharmony_ci{ 2391e934351Sopenharmony_ci if (!CheckCaFileExistence("protocolInterface")) { 2401e934351Sopenharmony_ci return; 2411e934351Sopenharmony_ci } 2421e934351Sopenharmony_ci TLSSocketServer server; 2431e934351Sopenharmony_ci 2441e934351Sopenharmony_ci const std::string data = "how do you do? this is protocolInterface"; 2451e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 2461e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 2471e934351Sopenharmony_ci 2481e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 2491e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2501e934351Sopenharmony_ci std::string getProtocolVal; 2511e934351Sopenharmony_ci server.GetProtocol([&getProtocolVal](int32_t errCode, const std::string &protocol) { 2521e934351Sopenharmony_ci EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); 2531e934351Sopenharmony_ci getProtocolVal = protocol; 2541e934351Sopenharmony_ci }); 2551e934351Sopenharmony_ci EXPECT_STREQ(getProtocolVal.c_str(), "TLSv1.3"); 2561e934351Sopenharmony_ci 2571e934351Sopenharmony_ci Socket::SocketStateBase stateBase; 2581e934351Sopenharmony_ci server.GetState([&stateBase](int32_t errCode, Socket::SocketStateBase state) { 2591e934351Sopenharmony_ci if (TlsSocket::TLSSOCKET_SUCCESS) { 2601e934351Sopenharmony_ci EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); 2611e934351Sopenharmony_ci stateBase.SetIsBound(state.IsBound()); 2621e934351Sopenharmony_ci stateBase.SetIsClose(state.IsClose()); 2631e934351Sopenharmony_ci stateBase.SetIsConnected(state.IsConnected()); 2641e934351Sopenharmony_ci } 2651e934351Sopenharmony_ci }); 2661e934351Sopenharmony_ci EXPECT_TRUE(stateBase.IsConnected()); 2671e934351Sopenharmony_ci sleep(2); 2681e934351Sopenharmony_ci 2691e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2701e934351Sopenharmony_ci} 2711e934351Sopenharmony_ci 2721e934351Sopenharmony_ciHWTEST_F(TlsSocketServerTest, getSignatureAlgorithmsInterface, testing::ext::TestSize.Level2) 2731e934351Sopenharmony_ci{ 2741e934351Sopenharmony_ci if (!CheckCaFileExistence("getSignatureAlgorithmsInterface")) { 2751e934351Sopenharmony_ci return; 2761e934351Sopenharmony_ci } 2771e934351Sopenharmony_ci 2781e934351Sopenharmony_ci TLSSocketServer server; 2791e934351Sopenharmony_ci TlsSocket::TLSSecureOptions secureOption; 2801e934351Sopenharmony_ci 2811e934351Sopenharmony_ci const std::string data = "how do you do? this is getSigntureAlgorithmsInterface"; 2821e934351Sopenharmony_ci TLSServerSendOptions tlsServerSendOptions; 2831e934351Sopenharmony_ci tlsServerSendOptions.SetSendData(data); 2841e934351Sopenharmony_ci 2851e934351Sopenharmony_ci int socketFd = tlsServerSendOptions.GetSocket(); 2861e934351Sopenharmony_ci server.Send(tlsServerSendOptions, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 2871e934351Sopenharmony_ci sleep(2); 2881e934351Sopenharmony_ci 2891e934351Sopenharmony_ci bool testFlag = false; 2901e934351Sopenharmony_ci std::string signatureAlgorithmVec = {"rsa_pss_rsae_sha256:ECDSA+SHA256"}; 2911e934351Sopenharmony_ci secureOption.SetSignatureAlgorithms(signatureAlgorithmVec); 2921e934351Sopenharmony_ci std::vector<std::string> testSignatureAlgorithms; 2931e934351Sopenharmony_ci server.GetSignatureAlgorithms(socketFd, [&testSignatureAlgorithms](int32_t errCode, 2941e934351Sopenharmony_ci const std::vector<std::string> &algorithms) { 2951e934351Sopenharmony_ci if (errCode == TlsSocket::TLSSOCKET_SUCCESS) { 2961e934351Sopenharmony_ci testSignatureAlgorithms = algorithms; 2971e934351Sopenharmony_ci } 2981e934351Sopenharmony_ci }); 2991e934351Sopenharmony_ci for (auto const &iter : testSignatureAlgorithms) { 3001e934351Sopenharmony_ci if (iter == "ECDSA+SHA256") { 3011e934351Sopenharmony_ci testFlag = true; 3021e934351Sopenharmony_ci } 3031e934351Sopenharmony_ci } 3041e934351Sopenharmony_ci EXPECT_TRUE(testFlag); 3051e934351Sopenharmony_ci sleep(2); 3061e934351Sopenharmony_ci 3071e934351Sopenharmony_ci 3081e934351Sopenharmony_ci (void)server.Close(socketFd, [](int32_t errCode) { EXPECT_TRUE(TlsSocket::TLSSOCKET_SUCCESS); }); 3091e934351Sopenharmony_ci} 3101e934351Sopenharmony_ci 3111e934351Sopenharmony_ci 3121e934351Sopenharmony_ci} //TlsSocketServer 3131e934351Sopenharmony_ci} //NetStack 3141e934351Sopenharmony_ci} //OHOS 315