1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "net_address.h"
17 #include "secure_data.h"
18 #include "socket_error.h"
19 #include "socket_state_base.h"
20 #include "tls.h"
21 #include "tls_certificate.h"
22 #include "tls_configuration.h"
23 #include "tls_key.h"
24 #include "tls_socket.h"
25 #include "tls_utils_test.h"
26 
27 namespace OHOS {
28 namespace NetStack {
29 namespace TlsSocket {
MockNetAddress(Socket::NetAddress & address)30 void MockNetAddress(Socket::NetAddress &address)
31 {
32     address.SetAddress(TlsUtilsTest::GetIp(TlsUtilsTest::ChangeToFile(IP_ADDRESS)));
33     address.SetPort(std::atoi(TlsUtilsTest::ChangeToFile(PORT).c_str()));
34     address.SetFamilyBySaFamily(AF_INET);
35 }
36 
MockTlsSocketParamOptions(Socket::NetAddress & address,TLSSecureOptions & secureOption,TLSConnectOptions & options)37 void MockTlsSocketParamOptions(Socket::NetAddress &address, TLSSecureOptions &secureOption, TLSConnectOptions &options)
38 {
39     secureOption.SetKey(SecureData(TlsUtilsTest::ChangeToFile(PRIVATE_KEY_PEM)));
40     secureOption.SetCert(TlsUtilsTest::ChangeToFile(CLIENT_CRT));
41 
42     MockNetAddress(address);
43     options.SetTlsSecureOptions(secureOption);
44     options.SetNetAddress(address);
45 }
46 
SetSocketHwTestShortParam(TLSSocket & server)47 void SetSocketHwTestShortParam(TLSSocket &server)
48 {
49     TLSConnectOptions options;
50     Socket::NetAddress address;
51     TLSSecureOptions secureOption;
52     std::vector<std::string> caVec1 = {TlsUtilsTest::ChangeToFile(CA_DER)};
53     secureOption.SetCaChain(caVec1);
54     MockTlsSocketParamOptions(address, secureOption, options);
55 
56     server.Bind(address, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
57     server.Connect(options, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
58 }
59 
SetSocketHwTestLongParam(TLSSocket & server)60 void SetSocketHwTestLongParam(TLSSocket &server)
61 {
62     TLSConnectOptions options;
63     TLSSecureOptions secureOption;
64     secureOption.SetCipherSuite("AES256-SHA256");
65     std::string protocolV13 = "TLSv1.3";
66     std::vector<std::string> protocolVec = {protocolV13};
67     secureOption.SetProtocolChain(protocolVec);
68     std::vector<std::string> caVect = {TlsUtilsTest::ChangeToFile(CA_DER)};
69     secureOption.SetCaChain(caVect);
70     Socket::NetAddress address;
71     MockTlsSocketParamOptions(address, secureOption, options);
72 
73     server.Bind(address, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
74     server.Connect(options, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
75 }
76 
77 HWTEST_F(TlsSocketTest, bindInterface, testing::ext::TestSize.Level2)
78 {
79     if (!TlsUtilsTest::CheckCaFileExistence("bindInterface")) {
80         return;
81     }
82 
83     Socket::NetAddress address;
84     TLSSocket bindTestServer;
85     MockNetAddress(address);
__anon0295c29c0502(int32_t errCode) 86     bindTestServer.Bind(address, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
87 }
88 
89 HWTEST_F(TlsSocketTest, connectInterface, testing::ext::TestSize.Level2)
90 {
91     if (!TlsUtilsTest::CheckCaFileExistence("connectInterface")) {
92         return;
93     }
94     TLSSocket testService;
95     SetSocketHwTestShortParam(testService);
96 
97     const std::string data = "how do you do? this is connectInterface";
98     Socket::TCPSendOptions tcpSendOptions;
99     tcpSendOptions.SetData(data);
__anon0295c29c0602(int32_t errCode) 100     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
101     sleep(2);
102 
__anon0295c29c0702(int32_t errCode) 103     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
104     sleep(2);
105 }
106 
107 HWTEST_F(TlsSocketTest, startReadMessageInterface, testing::ext::TestSize.Level2)
108 {
109     if (!TlsUtilsTest::CheckCaFileExistence("startReadMessageInterface")) {
110         return;
111     }
112     TLSSocket testService;
113     SetSocketHwTestShortParam(testService);
114 
115     const std::string data = "how do you do? this is startReadMessageInterface";
116     Socket::TCPSendOptions tcpSendOptions;
117     tcpSendOptions.SetData(data);
__anon0295c29c0802(int32_t errCode) 118     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
119     sleep(2);
120 
__anon0295c29c0902(int32_t errCode) 121     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
122 }
123 
124 HWTEST_F(TlsSocketTest, readMessageInterface, testing::ext::TestSize.Level2)
125 {
126     if (!TlsUtilsTest::CheckCaFileExistence("readMessageInterface")) {
127         return;
128     }
129     TLSSocket testService;
130     SetSocketHwTestShortParam(testService);
131 
132     const std::string data = "how do you do? this is readMessageInterface";
133     Socket::TCPSendOptions tcpSendOptions;
134     tcpSendOptions.SetData(data);
__anon0295c29c0a02(int32_t errCode) 135     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
136     sleep(2);
137 
__anon0295c29c0b02(int32_t errCode) 138     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
139 }
140 
141 HWTEST_F(TlsSocketTest, closeInterface, testing::ext::TestSize.Level2)
142 {
143     if (!TlsUtilsTest::CheckCaFileExistence("closeInterface")) {
144         return;
145     }
146 
147     TLSSocket testService;
148     SetSocketHwTestShortParam(testService);
149 
150     const std::string data = "how do you do? this is closeInterface";
151     Socket::TCPSendOptions tcpSendOptions;
152     tcpSendOptions.SetData(data);
153 
__anon0295c29c0c02(int32_t errCode) 154     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
155     sleep(2);
156 
__anon0295c29c0d02(int32_t errCode) 157     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
158 }
159 
160 HWTEST_F(TlsSocketTest, sendInterface, testing::ext::TestSize.Level2)
161 {
162     if (!TlsUtilsTest::CheckCaFileExistence("sendInterface")) {
163         return;
164     }
165     TLSSocket testService;
166     SetSocketHwTestShortParam(testService);
167 
168     const std::string data = "how do you do? this is sendInterface";
169     Socket::TCPSendOptions tcpSendOptions;
170     tcpSendOptions.SetData(data);
171 
__anon0295c29c0e02(int32_t errCode) 172     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
173     sleep(2);
174 
__anon0295c29c0f02(int32_t errCode) 175     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
176 }
177 
178 HWTEST_F(TlsSocketTest, getRemoteAddressInterface, testing::ext::TestSize.Level2)
179 {
180     if (!TlsUtilsTest::CheckCaFileExistence("getRemoteAddressInterface")) {
181         return;
182     }
183 
184     TLSConnectOptions options;
185     TLSSocket testService;
186     TLSSecureOptions secureOption;
187     Socket::NetAddress address;
188     std::vector<std::string> caVec = {TlsUtilsTest::ChangeToFile(CA_DER)};
189     secureOption.SetCaChain(caVec);
190     MockTlsSocketParamOptions(address, secureOption, options);
191 
__anon0295c29c1002(int32_t errCode) 192     testService.Bind(address, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
__anon0295c29c1102(int32_t errCode) 193     testService.Connect(options, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
194 
195     Socket::NetAddress netAddress;
__anon0295c29c1202(int32_t errCode, const Socket::NetAddress &address) 196     testService.GetRemoteAddress([&netAddress](int32_t errCode, const Socket::NetAddress &address) {
197         EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS);
198         netAddress.SetAddress(address.GetAddress());
199         netAddress.SetFamilyBySaFamily(address.GetSaFamily());
200         netAddress.SetPort(address.GetPort());
201     });
202     EXPECT_STREQ(netAddress.GetAddress().c_str(), TlsUtilsTest::GetIp(TlsUtilsTest::ChangeToFile(IP_ADDRESS)).c_str());
203     EXPECT_EQ(address.GetPort(), std::atoi(TlsUtilsTest::ChangeToFile(PORT).c_str()));
204     EXPECT_EQ(netAddress.GetSaFamily(), AF_INET);
205 
206     const std::string data = "how do you do? this is getRemoteAddressInterface";
207     Socket::TCPSendOptions tcpSendOptions;
208     tcpSendOptions.SetData(data);
209 
__anon0295c29c1302(int32_t errCode) 210     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
211 
__anon0295c29c1402(int32_t errCode) 212     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
213 }
214 
215 HWTEST_F(TlsSocketTest, getStateInterface, testing::ext::TestSize.Level2)
216 {
217     if (!TlsUtilsTest::CheckCaFileExistence("getRemoteAddressInterface")) {
218         return;
219     }
220 
221     TLSSocket testService;
222     SetSocketHwTestShortParam(testService);
223 
224     Socket::SocketStateBase TlsSocketstate;
__anon0295c29c1502(int32_t errCode, const Socket::SocketStateBase &state) 225     testService.GetState([&TlsSocketstate](int32_t errCode, const Socket::SocketStateBase &state) {
226         EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS);
227         TlsSocketstate = state;
228     });
229     std::cout << "TlsSocketTest TlsSocketstate.IsClose(): " << TlsSocketstate.IsClose() << std::endl;
230     EXPECT_TRUE(TlsSocketstate.IsBound());
231     EXPECT_TRUE(!TlsSocketstate.IsClose());
232     EXPECT_TRUE(TlsSocketstate.IsConnected());
233 
234     const std::string tlsSocketTestData = "how do you do? this is getStateInterface";
235     Socket::TCPSendOptions tcpSendOptions;
236     tcpSendOptions.SetData(tlsSocketTestData);
__anon0295c29c1602(int32_t errCode) 237     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
238 
239     sleep(2);
240 
__anon0295c29c1702(int32_t errCode) 241     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
242 }
243 
244 HWTEST_F(TlsSocketTest, getCertificateInterface, testing::ext::TestSize.Level2)
245 {
246     if (!TlsUtilsTest::CheckCaFileExistence("getCertificateInterface")) {
247         return;
248     }
249     TLSSocket testService;
250     SetSocketHwTestShortParam(testService);
251 
252     const std::string data = "how do you do? This is UT test getCertificateInterface";
253     Socket::TCPSendOptions tcpSendOptions;
254     tcpSendOptions.SetData(data);
__anon0295c29c1802(int32_t errCode) 255     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
256 
257     testService.GetCertificate(
__anon0295c29c1902(int32_t errCode, const X509CertRawData &cert) 258         [](int32_t errCode, const X509CertRawData &cert) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
259 
260     sleep(2);
__anon0295c29c1a02(int32_t errCode) 261     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
262 }
263 
264 HWTEST_F(TlsSocketTest, getRemoteCertificateInterface, testing::ext::TestSize.Level2)
265 {
266     if (!TlsUtilsTest::CheckCaFileExistence("getRemoteCertificateInterface")) {
267         return;
268     }
269     TLSSocket testService;
270     SetSocketHwTestShortParam(testService);
271 
272     Socket::TCPSendOptions tcpSendOptions;
273     const std::string data = "how do you do? This is UT test getRemoteCertificateInterface";
274     tcpSendOptions.SetData(data);
275 
__anon0295c29c1b02(int32_t errCode) 276     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
277 
278     testService.GetRemoteCertificate(
__anon0295c29c1c02(int32_t errCode, const X509CertRawData &cert) 279         [](int32_t errCode, const X509CertRawData &cert) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
280 
281     sleep(2);
__anon0295c29c1d02(int32_t errCode) 282     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
283 }
284 
285 HWTEST_F(TlsSocketTest, protocolInterface, testing::ext::TestSize.Level2)
286 {
287     if (!TlsUtilsTest::CheckCaFileExistence("protocolInterface")) {
288         return;
289     }
290     TLSSocket testService;
291     SetSocketHwTestLongParam(testService);
292 
293     const std::string data = "how do you do? this is protocolInterface";
294     Socket::TCPSendOptions tcpSendOptions;
295     tcpSendOptions.SetData(data);
296 
__anon0295c29c1e02(int32_t errCode) 297     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
298     std::string protocolVal;
__anon0295c29c1f02(int32_t errCode, const std::string &protocol) 299     testService.GetProtocol([&protocolVal](int32_t errCode, const std::string &protocol) {
300         EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS);
301         protocolVal = protocol;
302     });
303     EXPECT_STREQ(protocolVal.c_str(), "TLSv1.3");
304 
305     Socket::SocketStateBase socketStateBase;
__anon0295c29c2002(int32_t errCode, Socket::SocketStateBase state) 306     testService.GetState([&socketStateBase](int32_t errCode, Socket::SocketStateBase state) {
307         if (errCode == TLSSOCKET_SUCCESS) {
308             EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS);
309             socketStateBase.SetIsBound(state.IsBound());
310             socketStateBase.SetIsClose(state.IsClose());
311             socketStateBase.SetIsConnected(state.IsConnected());
312         }
313     });
314     EXPECT_TRUE(socketStateBase.IsConnected());
315     sleep(2);
316 
__anon0295c29c2102(int32_t errCode) 317     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
318 }
319 
320 HWTEST_F(TlsSocketTest, getCipherSuiteInterface, testing::ext::TestSize.Level2)
321 {
322     if (!TlsUtilsTest::CheckCaFileExistence("getCipherSuiteInterface")) {
323         return;
324     }
325     TLSSocket testService;
326     SetSocketHwTestLongParam(testService);
327 
328     bool flag = false;
329     const std::string data = "how do you do? This is getCipherSuiteInterface";
330     Socket::TCPSendOptions tcpSendOptions;
331     tcpSendOptions.SetData(data);
__anon0295c29c2202(int32_t errCode) 332     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
333 
334     std::vector<std::string> cipherSuite;
__anon0295c29c2302(int32_t errCode, const std::vector<std::string> &suite) 335     testService.GetCipherSuite([&cipherSuite](int32_t errCode, const std::vector<std::string> &suite) {
336         if (errCode == TLSSOCKET_SUCCESS) {
337             cipherSuite = suite;
338         }
339     });
340 
341     for (auto const &iter : cipherSuite) {
342         if (iter == "AES256-SHA256") {
343             flag = true;
344         }
345     }
346 
347     EXPECT_TRUE(flag);
348     sleep(2);
349 
__anon0295c29c2402(int32_t errCode) 350     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
351 }
352 
353 HWTEST_F(TlsSocketTest, getSignatureAlgorithmsInterface, testing::ext::TestSize.Level2)
354 {
355     if (!TlsUtilsTest::CheckCaFileExistence("getSignatureAlgorithmsInterface")) {
356         return;
357     }
358     TLSSocket testService;
359     TLSConnectOptions options;
360     TLSSecureOptions secureOption;
361     Socket::NetAddress address;
362     std::string signatureAlgorithmVec = {"rsa_pss_rsae_sha256:ECDSA+SHA256"};
363     secureOption.SetSignatureAlgorithms(signatureAlgorithmVec);
364     std::string protocolV13 = "TLSv1.3";
365     std::vector<std::string> protocolVec = {protocolV13};
366     secureOption.SetProtocolChain(protocolVec);
367     std::vector<std::string> caVec = {TlsUtilsTest::ChangeToFile(CA_DER)};
368     secureOption.SetCaChain(caVec);
369     MockTlsSocketParamOptions(address, secureOption, options);
370 
__anon0295c29c2502(int32_t errCode) 371     testService.Bind(address, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
__anon0295c29c2602(int32_t errCode) 372     testService.Connect(options, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
373 
374     bool flag = false;
375     const std::string data = "how do you do? this is getSignatureAlgorithmsInterface";
376     Socket::TCPSendOptions tcpSendOptions;
377     tcpSendOptions.SetData(data);
__anon0295c29c2702(int32_t errCode) 378     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
379 
380     std::vector<std::string> signatureAlgorithms;
381     testService.GetSignatureAlgorithms(
__anon0295c29c2802(int32_t errCode, const std::vector<std::string> &algorithms) 382         [&signatureAlgorithms](int32_t errCode, const std::vector<std::string> &algorithms) {
383             if (errCode == TLSSOCKET_SUCCESS) {
384                 signatureAlgorithms = algorithms;
385             }
386         });
387 
388     for (auto const &iter : signatureAlgorithms) {
389         if (iter == "ECDSA+SHA256") {
390             flag = true;
391         }
392     }
393     EXPECT_TRUE(flag);
394     sleep(2);
__anon0295c29c2902(int32_t errCode) 395     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
396 }
397 
398 HWTEST_F(TlsSocketTest, onMessageDataInterface, testing::ext::TestSize.Level2)
399 {
400     if (!TlsUtilsTest::CheckCaFileExistence("tlsSocketOnMessageData")) {
401         return;
402     }
403     std::string getData = "server->client";
404     TLSSocket testService;
405     SetSocketHwTestLongParam(testService);
406 
__anon0295c29c2a02(const std::string &data, const Socket::SocketRemoteInfo &remoteInfo) 407     testService.OnMessage([&getData](const std::string &data, const Socket::SocketRemoteInfo &remoteInfo) {
408         if (data == getData) {
409             EXPECT_TRUE(true);
410         } else {
411             EXPECT_TRUE(false);
412         }
413     });
414 
415     const std::string data = "how do you do? this is tlsSocketOnMessageData";
416     Socket::TCPSendOptions tcpSendOptions;
417     tcpSendOptions.SetData(data);
__anon0295c29c2b02(int32_t errCode) 418     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
419 
420     sleep(2);
__anon0295c29c2c02(int32_t errCode) 421     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
422 }
423 
424 HWTEST_F(TlsSocketTest, upgradeInterface, testing::ext::TestSize.Level2)
425 {
426     if (!TlsUtilsTest::CheckCaFileExistence("upgradeInterface")) {
427         return;
428     }
429 
430     int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
431     EXPECT_TRUE(sock > 0);
432 
433     sockaddr_in addr4 = {0};
434     Socket::NetAddress address;
435     MockNetAddress(address);
436     addr4.sin_family = AF_INET;
437     addr4.sin_port = htons(address.GetPort());
438     addr4.sin_addr.s_addr = inet_addr(address.GetAddress().c_str());
439 
440     int ret = connect(sock, reinterpret_cast<sockaddr *>(&addr4), sizeof(sockaddr_in));
441     EXPECT_TRUE(ret >= 0);
442 
443     TLSSocket testService(sock);
444     SetSocketHwTestShortParam(testService);
445 
446     const std::string data = "how do you do? this is upgradeInterface";
447     Socket::TCPSendOptions tcpSendOptions;
448     tcpSendOptions.SetData(data);
__anon0295c29c2d02(int32_t errCode) 449     testService.Send(tcpSendOptions, [](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
450     sleep(2);
451 
__anon0295c29c2e02(int32_t errCode) 452     (void)testService.Close([](int32_t errCode) { EXPECT_TRUE(errCode == TLSSOCKET_SUCCESS); });
453     sleep(2);
454 }
455 } // namespace TlsSocket
456 } // namespace NetStack
457 } // namespace OHOS
458