1 /*
2  * Copyright (c) 2021-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 
19 #include "file_ex.h"
20 #include "hks_ability.h"
21 #include "hks_config.h"
22 #include "hks_crypto_hal.h"
23 #include "hks_crypto_hal_common.h"
24 #include "hks_mem.h"
25 
26 using namespace testing::ext;
27 namespace OHOS {
28 namespace Security {
29 namespace Huks {
30 namespace UnitTest {
31 namespace {
32 constexpr uint32_t DSA_SIZE_512 = 512;
33 const uint32_t SIGNATURE_SIZE = 1024;
34 const uint32_t PUB_KEY_SIZE = 1024;
35 const HksUsageSpec HKS_CRYPTO_HAL_DSA_SIGN_001_SPEC = {
36     .algType = HKS_ALG_DSA,
37     .mode = HKS_MODE_ECB,
38     .padding = HKS_PADDING_NONE,
39     .digest = HKS_DIGEST_SHA1,
40     .purpose = HKS_KEY_PURPOSE_SIGN | HKS_KEY_PURPOSE_VERIFY,
41 };
42 
43 const HksUsageSpec HKS_CRYPTO_HAL_DSA_SIGN_002_SPEC = {
44     .algType = HKS_ALG_DSA,
45     .mode = HKS_MODE_ECB,
46     .padding = HKS_PADDING_NONE,
47     .digest = HKS_DIGEST_SHA224,
48     .purpose = HKS_KEY_PURPOSE_SIGN | HKS_KEY_PURPOSE_VERIFY,
49 };
50 
51 const HksUsageSpec HKS_CRYPTO_HAL_DSA_SIGN_003_SPEC = {
52     .algType = HKS_ALG_DSA,
53     .mode = HKS_MODE_ECB,
54     .padding = HKS_PADDING_NONE,
55     .digest = HKS_DIGEST_SHA256,
56     .purpose = HKS_KEY_PURPOSE_SIGN | HKS_KEY_PURPOSE_VERIFY,
57 };
58 
59 const HksUsageSpec HKS_CRYPTO_HAL_DSA_SIGN_004_SPEC = {
60     .algType = HKS_ALG_DSA,
61     .mode = HKS_MODE_ECB,
62     .padding = HKS_PADDING_NONE,
63     .digest = HKS_DIGEST_SHA384,
64     .purpose = HKS_KEY_PURPOSE_SIGN | HKS_KEY_PURPOSE_VERIFY,
65 };
66 
67 const HksUsageSpec HKS_CRYPTO_HAL_DSA_SIGN_005_SPEC = {
68     .algType = HKS_ALG_DSA,
69     .mode = HKS_MODE_ECB,
70     .padding = HKS_PADDING_NONE,
71     .digest = HKS_DIGEST_SHA512,
72     .purpose = HKS_KEY_PURPOSE_SIGN | HKS_KEY_PURPOSE_VERIFY,
73 };
74 }  // namespace
75 
76 class HksCryptoHalDsaSign : public HksCryptoHalCommon, public testing::Test {
77 public:
78     static void SetUpTestCase(void);
79     static void TearDownTestCase(void);
80     void SetUp();
81     void TearDown();
82 protected:
RunTestCase(const HksUsageSpec & hksUsageSpec) const83     void RunTestCase(const HksUsageSpec &hksUsageSpec) const
84     {
85         HksKeySpec spec = {
86             .algType = HKS_ALG_DSA,
87             .keyLen = DSA_SIZE_512,
88             .algParam = nullptr,
89         };
90 
91         HksBlob key = { .size = 0, .data = nullptr };
92 
93 #if defined(_USE_MBEDTLS_)
94         EXPECT_EQ(HksCryptoHalGenerateKey(&spec, &key), HKS_ERROR_NOT_SUPPORTED);
95         return;
96 #endif
97 #if defined(_USE_OPENSSL_)
98         EXPECT_EQ(HksCryptoHalGenerateKey(&spec, &key), HKS_SUCCESS);
99 #endif
100 
101         const char *hexData = "00112233445566778899aabbccddeeff";
102         uint32_t dataLen = strlen(hexData) / HKS_COUNT_OF_HALF;
103 
104         HksBlob message = { .size = dataLen, .data = (uint8_t *)HksMalloc(dataLen) };
105         ASSERT_NE(message.data, nullptr);
106         for (uint32_t ii = 0; ii < dataLen; ii++) {
107             message.data[ii] = ReadHex((const uint8_t *)&hexData[HKS_COUNT_OF_HALF * ii]);
108         }
109 
110         uint8_t hashData[HKS_HMAC_DIGEST_SHA512_LEN] = {0};
111         struct HksBlob hash = { HKS_HMAC_DIGEST_SHA512_LEN, hashData };
112         EXPECT_EQ(HksCryptoHalHash(hksUsageSpec.digest, &message, &hash), HKS_SUCCESS);
113 
114         struct HksBlob signature = { .size = SIGNATURE_SIZE, .data = (uint8_t *)HksMalloc(SIGNATURE_SIZE) };
115         ASSERT_NE(signature.data, nullptr);
116 
117         EXPECT_EQ(HksCryptoHalSign(&key, &hksUsageSpec, &hash, &signature), HKS_SUCCESS);
118 
119         struct HksBlob pubKey = { .size = PUB_KEY_SIZE, .data = (uint8_t *)HksMalloc(PUB_KEY_SIZE) };
120         ASSERT_NE(pubKey.data, nullptr);
121 
122         EXPECT_EQ(HksCryptoHalGetPubKey(&key, &pubKey), HKS_SUCCESS);
123 
124         EXPECT_EQ(HksCryptoHalVerify(&pubKey, &hksUsageSpec, &hash, &signature), HKS_SUCCESS);
125 
126         HKS_FREE(key.data);
127         HKS_FREE(message.data);
128         HKS_FREE(signature.data);
129         HKS_FREE(pubKey.data);
130     }
131 };
132 
SetUpTestCase(void)133 void HksCryptoHalDsaSign::SetUpTestCase(void)
134 {
135 }
136 
TearDownTestCase(void)137 void HksCryptoHalDsaSign::TearDownTestCase(void)
138 {
139 }
140 
SetUp()141 void HksCryptoHalDsaSign::SetUp()
142 {
143     EXPECT_EQ(HksCryptoAbilityInit(), 0);
144 }
145 
TearDown()146 void HksCryptoHalDsaSign::TearDown()
147 {
148 }
149 
150 /**
151  * @tc.number    : HksCryptoHalDsaSign_001
152  * @tc.name      : HksCryptoHalDsaSign_001
153  * @tc.desc      : Using HksCryptoHalSign Sign DSA-SHA1 key.
154  */
155 HWTEST_F(HksCryptoHalDsaSign, HksCryptoHalDsaSign_001, Function | SmallTest | Level0)
156 {
157     RunTestCase(HKS_CRYPTO_HAL_DSA_SIGN_001_SPEC);
158 }
159 
160 /**
161  * @tc.number    : HksCryptoHalDsaSign_002
162  * @tc.name      : HksCryptoHalDsaSign_002
163  * @tc.desc      : Using HksCryptoHalSign Sign DSA-SHA224 key.
164  */
165 HWTEST_F(HksCryptoHalDsaSign, HksCryptoHalDsaSign_002, Function | SmallTest | Level0)
166 {
167     RunTestCase(HKS_CRYPTO_HAL_DSA_SIGN_002_SPEC);
168 }
169 
170 /**
171  * @tc.number    : HksCryptoHalDsaSign_003
172  * @tc.name      : HksCryptoHalDsaSign_003
173  * @tc.desc      : Using HksCryptoHalSign Sign DSA-SHA256 key.
174  */
175 HWTEST_F(HksCryptoHalDsaSign, HksCryptoHalDsaSign_003, Function | SmallTest | Level0)
176 {
177     RunTestCase(HKS_CRYPTO_HAL_DSA_SIGN_003_SPEC);
178 }
179 
180 /**
181  * @tc.number    : HksCryptoHalDsaSign_004
182  * @tc.name      : HksCryptoHalDsaSign_004
183  * @tc.desc      : Using HksCryptoHalSign Sign DSA-SHA384 key.
184  */
185 HWTEST_F(HksCryptoHalDsaSign, HksCryptoHalDsaSign_004, Function | SmallTest | Level0)
186 {
187     RunTestCase(HKS_CRYPTO_HAL_DSA_SIGN_004_SPEC);
188 }
189 
190 /**
191  * @tc.number    : HksCryptoHalDsaSign_005
192  * @tc.name      : HksCryptoHalDsaSign_005
193  * @tc.desc      : Using HksCryptoHalSign Sign DSA-SHA512 key.
194  */
195 HWTEST_F(HksCryptoHalDsaSign, HksCryptoHalDsaSign_005, Function | SmallTest | Level0)
196 {
197     RunTestCase(HKS_CRYPTO_HAL_DSA_SIGN_005_SPEC);
198 }
199 }  // namespace UnitTest
200 }  // namespace Huks
201 }  // namespace Security
202 }  // namespace OHOS