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