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