11e934351Sopenharmony_ci/*
21e934351Sopenharmony_ci * Copyright (c) 2022 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 <gtest/gtest.h>
171e934351Sopenharmony_ci#include <iostream>
181e934351Sopenharmony_ci#include <string>
191e934351Sopenharmony_ci
201e934351Sopenharmony_ci#define private public
211e934351Sopenharmony_ci#include "tls.h"
221e934351Sopenharmony_ci#include "tls_key.h"
231e934351Sopenharmony_ci
241e934351Sopenharmony_cinamespace OHOS {
251e934351Sopenharmony_cinamespace NetStack {
261e934351Sopenharmony_cinamespace TlsSocket {
271e934351Sopenharmony_cinamespace {
281e934351Sopenharmony_ciusing namespace testing::ext;
291e934351Sopenharmony_ciconstexpr int FILE_READ_KEY_LEN = 4096;
301e934351Sopenharmony_cistatic char g_keyFile[] =
311e934351Sopenharmony_ci    "-----BEGIN RSA PRIVATE KEY-----\r\n"
321e934351Sopenharmony_ci    "MIIEowIBAAKCAQEAqVzrf6PkLu0uhp5yl2HPNm0vLyI1KLqgsdz5s+JvVdbPXNxD\r\n"
331e934351Sopenharmony_ci    "g6fmdwa64tJXZPKx7i1KwNs/Jx3xv1N6rqB0au+Ku0Zdq7zbMCqej63SbFW1XWvQ\r\n"
341e934351Sopenharmony_ci    "6RJ76GcitgrFMTlQN4AzfX0xLFaUJHRuDS4QC5UE9CmV3kD09BNgItu/hxPAHSwg\r\n"
351e934351Sopenharmony_ci    "q6myc1uufYCwCUIV3bzxd65M343zubTlwOSmsCSqQIl8C1Gd6NWT69tL4fq2hHc/\r\n"
361e934351Sopenharmony_ci    "09VAlcLvugztwM6NHwDCmRFEDz3RdRahAvCEde8OkY/Aor6UucYWzCJofLeyKVQg\r\n"
371e934351Sopenharmony_ci    "6J3CTsT/zUE6pdKTvuhQbpRCtWKWSa7qDv1WywIDAQABAoIBAFGpbCPvcmbuFjDy\r\n"
381e934351Sopenharmony_ci    "1W4Iy1EC9G1VoSwyUKlyUzRZSjWpjfLIggVJP+bEZ/hWU61pGEIvtIupK5pA5f/K\r\n"
391e934351Sopenharmony_ci    "0KzC0V9+gPYrx563QTjIVAwTVBLIgNq60dCQCQ7WK/Z62voRGIyqVCl94+ftFyE8\r\n"
401e934351Sopenharmony_ci    "wpO4UiRDhk/0fT7dMz882G32ZzNJmY9eHu+yOaRctJW2gRBROHpQfDGBCz7w8s2j\r\n"
411e934351Sopenharmony_ci    "ulIcnvwGOrvVllsL+vgY95M0LOq0W8ObbUSlawTnNTSRxFL68Hz5EaVJ19EYvEcC\r\n"
421e934351Sopenharmony_ci    "eWnpEqIfF8OhQ+mYbdrAutXCkqJLz3rdu5P2Lbk5Ht5ETfr7rtUzvb4+ExIcxVOs\r\n"
431e934351Sopenharmony_ci    "eys8EgECgYEA29tTxJOy2Cb4DKB9KwTErD1sFt9Ed+Z/A3RGmnM+/h75DHccqS8n\r\n"
441e934351Sopenharmony_ci    "g9DpvHVMcMWYFVYGlEHC1F+bupM9CgxqQcVhGk/ysJ5kXF6lSTnOQxORnku3HXnV\r\n"
451e934351Sopenharmony_ci    "4QzgKtLfHbukW1Y2RZM3aCz+Hg+bJrpacWyWZ4tRWNYsO58JRaubZjsCgYEAxTSP\r\n"
461e934351Sopenharmony_ci    "yUBleQejl5qO76PGUUs2W8+GPr492NJGb63mEiM1zTYLVN0uuDJ2JixzHb6o1NXZ\r\n"
471e934351Sopenharmony_ci    "6i00pSksT3+s0eiBTRnF6BJ0y/8J07ZnfQQXRAP8ypiZtd3jdOnUxEHfBw2QaIdP\r\n"
481e934351Sopenharmony_ci    "tVdUc2mpIhosAYT9sWpHYvlUqTCdeLwhkYfgeLECgYBoajjVcmQM3i0OKiZoCOKy\r\n"
491e934351Sopenharmony_ci    "/pTYI/8rho+p/04MylEPdXxIXEWDYD6/DrgDZh4ArQc2kt2bCcRTAnk+WfEyVYUd\r\n"
501e934351Sopenharmony_ci    "aXVdfry+/uqhJ94N8eMw3hlZeZIk8JkQQgIwtGd8goJjUoWB85Hr6vphIn5IHVcY\r\n"
511e934351Sopenharmony_ci    "6T5hPLxMmaL2SeioawDpwwKBgQCFXjDH6Hc3zQTEKND2HIqou/b9THH7yOlG056z\r\n"
521e934351Sopenharmony_ci    "NKZeKdXe/OfY8uT/yZDB7FnGCgVgO2huyTfLYvcGpNAZ/eZEYGPJuYGn3MmmlruS\r\n"
531e934351Sopenharmony_ci    "fsvFQfUahu2dY3zKusEcIXhV6sR5DNnJSFBi5VhvKcgNFwYDkF7K/thUu/4jgwgo\r\n"
541e934351Sopenharmony_ci    "xf33YQKBgDQffkP1jWqT/pzlVLFtF85/3eCC/uedBfxXknVMrWE+CM/Vsx9cvBZw\r\n"
551e934351Sopenharmony_ci    "hi15LA5+hEdbgvj87hmMiCOc75e0oz2Rd12ZoRlBVfbncH9ngfqBNQElM7Bueqoc\r\n"
561e934351Sopenharmony_ci    "JOpKV+gw0gQtiu4beIdFnYsdZoZwrTjC4rW7OI0WYoLJabMFFh3I\r\n"
571e934351Sopenharmony_ci    "-----END RSA PRIVATE KEY-----\r\n";
581e934351Sopenharmony_ci} // namespace
591e934351Sopenharmony_ci
601e934351Sopenharmony_ciclass TlsKeyTest : public testing::Test {
611e934351Sopenharmony_cipublic:
621e934351Sopenharmony_ci    static void SetUpTestCase() {}
631e934351Sopenharmony_ci
641e934351Sopenharmony_ci    static void TearDownTestCase() {}
651e934351Sopenharmony_ci
661e934351Sopenharmony_ci    virtual void SetUp() {}
671e934351Sopenharmony_ci
681e934351Sopenharmony_ci    virtual void TearDown() {}
691e934351Sopenharmony_ci};
701e934351Sopenharmony_ci
711e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, AlgorithmTest, TestSize.Level2)
721e934351Sopenharmony_ci{
731e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
741e934351Sopenharmony_ci    std::string keyPassStr = "";
751e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
761e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
771e934351Sopenharmony_ci    KeyAlgorithm algorithm = tlsKey.Algorithm();
781e934351Sopenharmony_ci    EXPECT_EQ(algorithm, ALGORITHM_RSA);
791e934351Sopenharmony_ci}
801e934351Sopenharmony_ci
811e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, DecodePemTest, TestSize.Level2)
821e934351Sopenharmony_ci{
831e934351Sopenharmony_ci    std::string fileName = "";
841e934351Sopenharmony_ci    std::string keyPassStr = "";
851e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
861e934351Sopenharmony_ci    TLSKey tlsKey1 = TLSKey(fileName, ALGORITHM_RSA, keyPass);
871e934351Sopenharmony_ci    TLSKey tlsKey2 = TLSKey(fileName, ALGORITHM_RSA, keyPass, EncodingFormat::DER);
881e934351Sopenharmony_ci    std::string fileName2 = "/system/lib";
891e934351Sopenharmony_ci    TLSKey tlsKey3 = TLSKey(fileName2, ALGORITHM_RSA, keyPass);
901e934351Sopenharmony_ci    TLSKey tlsKey4 = TLSKey(fileName2, ALGORITHM_RSA, keyPass, EncodingFormat::DER);
911e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
921e934351Sopenharmony_ci    structureData.length_ = sizeof(g_keyFile);
931e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
941e934351Sopenharmony_ci    EXPECT_EQ(tlsKey.keyIsNull_, false);
951e934351Sopenharmony_ci}
961e934351Sopenharmony_ci
971e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, CopyConstruction, TestSize.Level2)
981e934351Sopenharmony_ci{
991e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1001e934351Sopenharmony_ci    std::string keyPassStr = "";
1011e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1021e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1031e934351Sopenharmony_ci    TLSKey tlsKeyCopy = TLSKey(tlsKey);
1041e934351Sopenharmony_ci    KeyAlgorithm algorithm = tlsKeyCopy.Algorithm();
1051e934351Sopenharmony_ci    EXPECT_EQ(algorithm, ALGORITHM_RSA);
1061e934351Sopenharmony_ci}
1071e934351Sopenharmony_ci
1081e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, AssignmentConstruction, TestSize.Level2)
1091e934351Sopenharmony_ci{
1101e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1111e934351Sopenharmony_ci    std::string keyPassStr = "";
1121e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1131e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1141e934351Sopenharmony_ci    TLSKey key = tlsKey;
1151e934351Sopenharmony_ci    KeyAlgorithm algorithm = key.Algorithm();
1161e934351Sopenharmony_ci    EXPECT_EQ(algorithm, ALGORITHM_RSA);
1171e934351Sopenharmony_ci}
1181e934351Sopenharmony_ci
1191e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, HandleTest, TestSize.Level2)
1201e934351Sopenharmony_ci{
1211e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1221e934351Sopenharmony_ci    std::string keyPassStr = "";
1231e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1241e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1251e934351Sopenharmony_ci    Handle handle = tlsKey.handle();
1261e934351Sopenharmony_ci    EXPECT_NE(handle, nullptr);
1271e934351Sopenharmony_ci    tlsKey.Clear(true);
1281e934351Sopenharmony_ci    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
1291e934351Sopenharmony_ci    Handle handleDsa = tlsKeyDsa.handle();
1301e934351Sopenharmony_ci    EXPECT_EQ(handleDsa, nullptr);
1311e934351Sopenharmony_ci    tlsKeyDsa.Clear(true);
1321e934351Sopenharmony_ci    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
1331e934351Sopenharmony_ci    Handle handleEc = tlsKeyEc.handle();
1341e934351Sopenharmony_ci    EXPECT_EQ(handleEc, nullptr);
1351e934351Sopenharmony_ci    tlsKeyEc.Clear(true);
1361e934351Sopenharmony_ci    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
1371e934351Sopenharmony_ci    Handle handleDh = tlsKeyDh.handle();
1381e934351Sopenharmony_ci    EXPECT_EQ(handleDh, nullptr);
1391e934351Sopenharmony_ci    tlsKeyDh.Clear(true);
1401e934351Sopenharmony_ci    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
1411e934351Sopenharmony_ci    Handle handleOpaque = tlsKeyOpaque.handle();
1421e934351Sopenharmony_ci    EXPECT_EQ(handleOpaque, nullptr);
1431e934351Sopenharmony_ci    tlsKeyOpaque.Clear(true);
1441e934351Sopenharmony_ci    TLSKey keyOpaque = tlsKeyOpaque;
1451e934351Sopenharmony_ci    EXPECT_NE(handle, nullptr);
1461e934351Sopenharmony_ci}
1471e934351Sopenharmony_ci
1481e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, GetKeyPassTest, TestSize.Level2)
1491e934351Sopenharmony_ci{
1501e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1511e934351Sopenharmony_ci    std::string keyPassStr = "";
1521e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1531e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1541e934351Sopenharmony_ci    SecureData getKeyPass = tlsKey.GetKeyPass();
1551e934351Sopenharmony_ci    EXPECT_EQ(getKeyPass.Length(), keyPass.Length());
1561e934351Sopenharmony_ci}
1571e934351Sopenharmony_ci
1581e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, GetKeyDataTest, TestSize.Level2)
1591e934351Sopenharmony_ci{
1601e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1611e934351Sopenharmony_ci    std::string keyPassStr = "";
1621e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1631e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1641e934351Sopenharmony_ci    SecureData getKeyData = tlsKey.GetKeyData();
1651e934351Sopenharmony_ci    EXPECT_EQ(getKeyData.Length(), structureData.Length());
1661e934351Sopenharmony_ci}
1671e934351Sopenharmony_ci
1681e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, AlgorithmTest2, TestSize.Level2)
1691e934351Sopenharmony_ci{
1701e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1711e934351Sopenharmony_ci    std::string keyPassStr = "";
1721e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1731e934351Sopenharmony_ci    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
1741e934351Sopenharmony_ci    TLSKey keyDsa = tlsKeyDsa;
1751e934351Sopenharmony_ci    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
1761e934351Sopenharmony_ci    TLSKey keyEc = tlsKeyEc;
1771e934351Sopenharmony_ci    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
1781e934351Sopenharmony_ci    TLSKey keyDh = tlsKeyDh;
1791e934351Sopenharmony_ci    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
1801e934351Sopenharmony_ci    TLSKey keyOpaque = tlsKeyOpaque;
1811e934351Sopenharmony_ci    SecureData getKeyData = tlsKeyDsa.GetKeyData();
1821e934351Sopenharmony_ci    EXPECT_EQ(getKeyData.Length(), structureData.Length());
1831e934351Sopenharmony_ci}
1841e934351Sopenharmony_ci
1851e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, SwitchAlgorithmTest, TestSize.Level2)
1861e934351Sopenharmony_ci{
1871e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
1881e934351Sopenharmony_ci    std::string keyPassStr = "";
1891e934351Sopenharmony_ci
1901e934351Sopenharmony_ci    KeyType typePublic = KeyType::PUBLIC_KEY;
1911e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
1921e934351Sopenharmony_ci    KeyType typePrivate = KeyType::PRIVATE_KEY;
1931e934351Sopenharmony_ci    char privateKey[FILE_READ_KEY_LEN] = {0};
1941e934351Sopenharmony_ci    const char *privateKeyData = static_cast<const char *>(privateKey);
1951e934351Sopenharmony_ci    BIO *bio = BIO_new_mem_buf(privateKeyData, -1);
1961e934351Sopenharmony_ci    TLSKey tlsKeyRsa = TLSKey(structureData, ALGORITHM_RSA, keyPass);
1971e934351Sopenharmony_ci    tlsKeyRsa.SwitchAlgorithm(typePrivate, ALGORITHM_RSA, bio);
1981e934351Sopenharmony_ci    tlsKeyRsa.SwitchAlgorithm(typePublic, ALGORITHM_RSA, bio);
1991e934351Sopenharmony_ci    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
2001e934351Sopenharmony_ci    tlsKeyDsa.SwitchAlgorithm(typePrivate, ALGORITHM_DSA, bio);
2011e934351Sopenharmony_ci    tlsKeyDsa.SwitchAlgorithm(typePublic, ALGORITHM_DSA, bio);
2021e934351Sopenharmony_ci    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
2031e934351Sopenharmony_ci    tlsKeyEc.SwitchAlgorithm(typePrivate, ALGORITHM_EC, bio);
2041e934351Sopenharmony_ci    tlsKeyEc.SwitchAlgorithm(typePublic, ALGORITHM_EC, bio);
2051e934351Sopenharmony_ci    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
2061e934351Sopenharmony_ci    tlsKeyDh.SwitchAlgorithm(typePrivate, ALGORITHM_DH, bio);
2071e934351Sopenharmony_ci    tlsKeyDh.SwitchAlgorithm(typePublic, ALGORITHM_DH, bio);
2081e934351Sopenharmony_ci    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
2091e934351Sopenharmony_ci    tlsKeyOpaque.SwitchAlgorithm(typePrivate, OPAQUE, bio);
2101e934351Sopenharmony_ci    tlsKeyOpaque.SwitchAlgorithm(typePublic, OPAQUE, bio);
2111e934351Sopenharmony_ci    SecureData getKeyData = tlsKeyDsa.GetKeyData();
2121e934351Sopenharmony_ci    EXPECT_EQ(getKeyData.Length(), structureData.Length());
2131e934351Sopenharmony_ci}
2141e934351Sopenharmony_ci
2151e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, ClearTest, TestSize.Level2)
2161e934351Sopenharmony_ci{
2171e934351Sopenharmony_ci    SecureData structureData(g_keyFile);
2181e934351Sopenharmony_ci    std::string keyPassStr = "";
2191e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
2201e934351Sopenharmony_ci    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
2211e934351Sopenharmony_ci    tlsKeyDsa.dsa_ = DSA_new();
2221e934351Sopenharmony_ci    tlsKeyDsa.Clear(true);
2231e934351Sopenharmony_ci    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
2241e934351Sopenharmony_ci    tlsKeyDh.dh_ = DH_new();
2251e934351Sopenharmony_ci    tlsKeyDh.Clear(true);
2261e934351Sopenharmony_ci    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
2271e934351Sopenharmony_ci    tlsKeyEc.ec_ = EC_KEY_new();
2281e934351Sopenharmony_ci    tlsKeyEc.Clear(true);
2291e934351Sopenharmony_ci    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
2301e934351Sopenharmony_ci    tlsKeyOpaque.genericKey_ = EVP_PKEY_new();
2311e934351Sopenharmony_ci    tlsKeyOpaque.Clear(true);
2321e934351Sopenharmony_ci    EXPECT_EQ(tlsKeyOpaque.keyIsNull_, true);
2331e934351Sopenharmony_ci}
2341e934351Sopenharmony_ci
2351e934351Sopenharmony_ciHWTEST_F(TlsKeyTest, DecodeDataTest, TestSize.Level2)
2361e934351Sopenharmony_ci{
2371e934351Sopenharmony_ci    SecureData data;
2381e934351Sopenharmony_ci    std::string keyPassStr = "";
2391e934351Sopenharmony_ci    SecureData keyPass(keyPassStr);
2401e934351Sopenharmony_ci    TLSKey tlsKey = TLSKey(data, ALGORITHM_DSA, keyPass);
2411e934351Sopenharmony_ci    tlsKey.DecodeData(data, ALGORITHM_DSA, keyPass);
2421e934351Sopenharmony_ci    SecureData getKeyData = tlsKey.GetKeyData();
2431e934351Sopenharmony_ci    EXPECT_EQ(getKeyData.Length(), data.Length());
2441e934351Sopenharmony_ci}
2451e934351Sopenharmony_ci} // namespace TlsSocket
2461e934351Sopenharmony_ci} // namespace NetStack
2471e934351Sopenharmony_ci} // namespace OHOS