1/*
2 * Copyright (c) 2022 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 <gtest/gtest.h>
17#include <iostream>
18#include <string>
19
20#define private public
21#include "tls.h"
22#include "tls_key.h"
23
24namespace OHOS {
25namespace NetStack {
26namespace TlsSocket {
27namespace {
28using namespace testing::ext;
29constexpr int FILE_READ_KEY_LEN = 4096;
30static char g_keyFile[] =
31    "-----BEGIN RSA PRIVATE KEY-----\r\n"
32    "MIIEowIBAAKCAQEAqVzrf6PkLu0uhp5yl2HPNm0vLyI1KLqgsdz5s+JvVdbPXNxD\r\n"
33    "g6fmdwa64tJXZPKx7i1KwNs/Jx3xv1N6rqB0au+Ku0Zdq7zbMCqej63SbFW1XWvQ\r\n"
34    "6RJ76GcitgrFMTlQN4AzfX0xLFaUJHRuDS4QC5UE9CmV3kD09BNgItu/hxPAHSwg\r\n"
35    "q6myc1uufYCwCUIV3bzxd65M343zubTlwOSmsCSqQIl8C1Gd6NWT69tL4fq2hHc/\r\n"
36    "09VAlcLvugztwM6NHwDCmRFEDz3RdRahAvCEde8OkY/Aor6UucYWzCJofLeyKVQg\r\n"
37    "6J3CTsT/zUE6pdKTvuhQbpRCtWKWSa7qDv1WywIDAQABAoIBAFGpbCPvcmbuFjDy\r\n"
38    "1W4Iy1EC9G1VoSwyUKlyUzRZSjWpjfLIggVJP+bEZ/hWU61pGEIvtIupK5pA5f/K\r\n"
39    "0KzC0V9+gPYrx563QTjIVAwTVBLIgNq60dCQCQ7WK/Z62voRGIyqVCl94+ftFyE8\r\n"
40    "wpO4UiRDhk/0fT7dMz882G32ZzNJmY9eHu+yOaRctJW2gRBROHpQfDGBCz7w8s2j\r\n"
41    "ulIcnvwGOrvVllsL+vgY95M0LOq0W8ObbUSlawTnNTSRxFL68Hz5EaVJ19EYvEcC\r\n"
42    "eWnpEqIfF8OhQ+mYbdrAutXCkqJLz3rdu5P2Lbk5Ht5ETfr7rtUzvb4+ExIcxVOs\r\n"
43    "eys8EgECgYEA29tTxJOy2Cb4DKB9KwTErD1sFt9Ed+Z/A3RGmnM+/h75DHccqS8n\r\n"
44    "g9DpvHVMcMWYFVYGlEHC1F+bupM9CgxqQcVhGk/ysJ5kXF6lSTnOQxORnku3HXnV\r\n"
45    "4QzgKtLfHbukW1Y2RZM3aCz+Hg+bJrpacWyWZ4tRWNYsO58JRaubZjsCgYEAxTSP\r\n"
46    "yUBleQejl5qO76PGUUs2W8+GPr492NJGb63mEiM1zTYLVN0uuDJ2JixzHb6o1NXZ\r\n"
47    "6i00pSksT3+s0eiBTRnF6BJ0y/8J07ZnfQQXRAP8ypiZtd3jdOnUxEHfBw2QaIdP\r\n"
48    "tVdUc2mpIhosAYT9sWpHYvlUqTCdeLwhkYfgeLECgYBoajjVcmQM3i0OKiZoCOKy\r\n"
49    "/pTYI/8rho+p/04MylEPdXxIXEWDYD6/DrgDZh4ArQc2kt2bCcRTAnk+WfEyVYUd\r\n"
50    "aXVdfry+/uqhJ94N8eMw3hlZeZIk8JkQQgIwtGd8goJjUoWB85Hr6vphIn5IHVcY\r\n"
51    "6T5hPLxMmaL2SeioawDpwwKBgQCFXjDH6Hc3zQTEKND2HIqou/b9THH7yOlG056z\r\n"
52    "NKZeKdXe/OfY8uT/yZDB7FnGCgVgO2huyTfLYvcGpNAZ/eZEYGPJuYGn3MmmlruS\r\n"
53    "fsvFQfUahu2dY3zKusEcIXhV6sR5DNnJSFBi5VhvKcgNFwYDkF7K/thUu/4jgwgo\r\n"
54    "xf33YQKBgDQffkP1jWqT/pzlVLFtF85/3eCC/uedBfxXknVMrWE+CM/Vsx9cvBZw\r\n"
55    "hi15LA5+hEdbgvj87hmMiCOc75e0oz2Rd12ZoRlBVfbncH9ngfqBNQElM7Bueqoc\r\n"
56    "JOpKV+gw0gQtiu4beIdFnYsdZoZwrTjC4rW7OI0WYoLJabMFFh3I\r\n"
57    "-----END RSA PRIVATE KEY-----\r\n";
58} // namespace
59
60class TlsKeyTest : public testing::Test {
61public:
62    static void SetUpTestCase() {}
63
64    static void TearDownTestCase() {}
65
66    virtual void SetUp() {}
67
68    virtual void TearDown() {}
69};
70
71HWTEST_F(TlsKeyTest, AlgorithmTest, TestSize.Level2)
72{
73    SecureData structureData(g_keyFile);
74    std::string keyPassStr = "";
75    SecureData keyPass(keyPassStr);
76    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
77    KeyAlgorithm algorithm = tlsKey.Algorithm();
78    EXPECT_EQ(algorithm, ALGORITHM_RSA);
79}
80
81HWTEST_F(TlsKeyTest, DecodePemTest, TestSize.Level2)
82{
83    std::string fileName = "";
84    std::string keyPassStr = "";
85    SecureData keyPass(keyPassStr);
86    TLSKey tlsKey1 = TLSKey(fileName, ALGORITHM_RSA, keyPass);
87    TLSKey tlsKey2 = TLSKey(fileName, ALGORITHM_RSA, keyPass, EncodingFormat::DER);
88    std::string fileName2 = "/system/lib";
89    TLSKey tlsKey3 = TLSKey(fileName2, ALGORITHM_RSA, keyPass);
90    TLSKey tlsKey4 = TLSKey(fileName2, ALGORITHM_RSA, keyPass, EncodingFormat::DER);
91    SecureData structureData(g_keyFile);
92    structureData.length_ = sizeof(g_keyFile);
93    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
94    EXPECT_EQ(tlsKey.keyIsNull_, false);
95}
96
97HWTEST_F(TlsKeyTest, CopyConstruction, TestSize.Level2)
98{
99    SecureData structureData(g_keyFile);
100    std::string keyPassStr = "";
101    SecureData keyPass(keyPassStr);
102    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
103    TLSKey tlsKeyCopy = TLSKey(tlsKey);
104    KeyAlgorithm algorithm = tlsKeyCopy.Algorithm();
105    EXPECT_EQ(algorithm, ALGORITHM_RSA);
106}
107
108HWTEST_F(TlsKeyTest, AssignmentConstruction, TestSize.Level2)
109{
110    SecureData structureData(g_keyFile);
111    std::string keyPassStr = "";
112    SecureData keyPass(keyPassStr);
113    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
114    TLSKey key = tlsKey;
115    KeyAlgorithm algorithm = key.Algorithm();
116    EXPECT_EQ(algorithm, ALGORITHM_RSA);
117}
118
119HWTEST_F(TlsKeyTest, HandleTest, TestSize.Level2)
120{
121    SecureData structureData(g_keyFile);
122    std::string keyPassStr = "";
123    SecureData keyPass(keyPassStr);
124    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
125    Handle handle = tlsKey.handle();
126    EXPECT_NE(handle, nullptr);
127    tlsKey.Clear(true);
128    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
129    Handle handleDsa = tlsKeyDsa.handle();
130    EXPECT_EQ(handleDsa, nullptr);
131    tlsKeyDsa.Clear(true);
132    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
133    Handle handleEc = tlsKeyEc.handle();
134    EXPECT_EQ(handleEc, nullptr);
135    tlsKeyEc.Clear(true);
136    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
137    Handle handleDh = tlsKeyDh.handle();
138    EXPECT_EQ(handleDh, nullptr);
139    tlsKeyDh.Clear(true);
140    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
141    Handle handleOpaque = tlsKeyOpaque.handle();
142    EXPECT_EQ(handleOpaque, nullptr);
143    tlsKeyOpaque.Clear(true);
144    TLSKey keyOpaque = tlsKeyOpaque;
145    EXPECT_NE(handle, nullptr);
146}
147
148HWTEST_F(TlsKeyTest, GetKeyPassTest, TestSize.Level2)
149{
150    SecureData structureData(g_keyFile);
151    std::string keyPassStr = "";
152    SecureData keyPass(keyPassStr);
153    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
154    SecureData getKeyPass = tlsKey.GetKeyPass();
155    EXPECT_EQ(getKeyPass.Length(), keyPass.Length());
156}
157
158HWTEST_F(TlsKeyTest, GetKeyDataTest, TestSize.Level2)
159{
160    SecureData structureData(g_keyFile);
161    std::string keyPassStr = "";
162    SecureData keyPass(keyPassStr);
163    TLSKey tlsKey = TLSKey(structureData, ALGORITHM_RSA, keyPass);
164    SecureData getKeyData = tlsKey.GetKeyData();
165    EXPECT_EQ(getKeyData.Length(), structureData.Length());
166}
167
168HWTEST_F(TlsKeyTest, AlgorithmTest2, TestSize.Level2)
169{
170    SecureData structureData(g_keyFile);
171    std::string keyPassStr = "";
172    SecureData keyPass(keyPassStr);
173    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
174    TLSKey keyDsa = tlsKeyDsa;
175    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
176    TLSKey keyEc = tlsKeyEc;
177    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
178    TLSKey keyDh = tlsKeyDh;
179    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
180    TLSKey keyOpaque = tlsKeyOpaque;
181    SecureData getKeyData = tlsKeyDsa.GetKeyData();
182    EXPECT_EQ(getKeyData.Length(), structureData.Length());
183}
184
185HWTEST_F(TlsKeyTest, SwitchAlgorithmTest, TestSize.Level2)
186{
187    SecureData structureData(g_keyFile);
188    std::string keyPassStr = "";
189
190    KeyType typePublic = KeyType::PUBLIC_KEY;
191    SecureData keyPass(keyPassStr);
192    KeyType typePrivate = KeyType::PRIVATE_KEY;
193    char privateKey[FILE_READ_KEY_LEN] = {0};
194    const char *privateKeyData = static_cast<const char *>(privateKey);
195    BIO *bio = BIO_new_mem_buf(privateKeyData, -1);
196    TLSKey tlsKeyRsa = TLSKey(structureData, ALGORITHM_RSA, keyPass);
197    tlsKeyRsa.SwitchAlgorithm(typePrivate, ALGORITHM_RSA, bio);
198    tlsKeyRsa.SwitchAlgorithm(typePublic, ALGORITHM_RSA, bio);
199    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
200    tlsKeyDsa.SwitchAlgorithm(typePrivate, ALGORITHM_DSA, bio);
201    tlsKeyDsa.SwitchAlgorithm(typePublic, ALGORITHM_DSA, bio);
202    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
203    tlsKeyEc.SwitchAlgorithm(typePrivate, ALGORITHM_EC, bio);
204    tlsKeyEc.SwitchAlgorithm(typePublic, ALGORITHM_EC, bio);
205    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
206    tlsKeyDh.SwitchAlgorithm(typePrivate, ALGORITHM_DH, bio);
207    tlsKeyDh.SwitchAlgorithm(typePublic, ALGORITHM_DH, bio);
208    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
209    tlsKeyOpaque.SwitchAlgorithm(typePrivate, OPAQUE, bio);
210    tlsKeyOpaque.SwitchAlgorithm(typePublic, OPAQUE, bio);
211    SecureData getKeyData = tlsKeyDsa.GetKeyData();
212    EXPECT_EQ(getKeyData.Length(), structureData.Length());
213}
214
215HWTEST_F(TlsKeyTest, ClearTest, TestSize.Level2)
216{
217    SecureData structureData(g_keyFile);
218    std::string keyPassStr = "";
219    SecureData keyPass(keyPassStr);
220    TLSKey tlsKeyDsa = TLSKey(structureData, ALGORITHM_DSA, keyPass);
221    tlsKeyDsa.dsa_ = DSA_new();
222    tlsKeyDsa.Clear(true);
223    TLSKey tlsKeyDh = TLSKey(structureData, ALGORITHM_DH, keyPass);
224    tlsKeyDh.dh_ = DH_new();
225    tlsKeyDh.Clear(true);
226    TLSKey tlsKeyEc = TLSKey(structureData, ALGORITHM_EC, keyPass);
227    tlsKeyEc.ec_ = EC_KEY_new();
228    tlsKeyEc.Clear(true);
229    TLSKey tlsKeyOpaque = TLSKey(structureData, OPAQUE, keyPass);
230    tlsKeyOpaque.genericKey_ = EVP_PKEY_new();
231    tlsKeyOpaque.Clear(true);
232    EXPECT_EQ(tlsKeyOpaque.keyIsNull_, true);
233}
234
235HWTEST_F(TlsKeyTest, DecodeDataTest, TestSize.Level2)
236{
237    SecureData data;
238    std::string keyPassStr = "";
239    SecureData keyPass(keyPassStr);
240    TLSKey tlsKey = TLSKey(data, ALGORITHM_DSA, keyPass);
241    tlsKey.DecodeData(data, ALGORITHM_DSA, keyPass);
242    SecureData getKeyData = tlsKey.GetKeyData();
243    EXPECT_EQ(getKeyData.Length(), data.Length());
244}
245} // namespace TlsSocket
246} // namespace NetStack
247} // namespace OHOS