From ca7e679cc056dc2b4585725b2420234127e9773b Mon Sep 17 00:00:00 2001 From: lichaochen_huawei Date: Mon, 25 Aug 2025 11:03:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=91=98=E8=A6=81=E7=AE=97=E6=B3=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0sha3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lichaochen_huawei --- frameworks/crypto_operation/md.c | 3 + .../common/inc/openssl_adapter.h | 3 + .../common/src/openssl_adapter.c | 15 + .../crypto_operation/md/src/md_openssl.c | 6 + test/unittest/BUILD.gn | 1 + test/unittest/src/crypto_md_sha3_test.cpp | 334 ++++++++++++++++++ .../src/native/native_digest_test.cpp | 33 ++ test/unittest/src/openssl_adapter_mock.c | 24 ++ 8 files changed, 419 insertions(+) create mode 100644 test/unittest/src/crypto_md_sha3_test.cpp diff --git a/frameworks/crypto_operation/md.c b/frameworks/crypto_operation/md.c index 4d5afe2..def2786 100644 --- a/frameworks/crypto_operation/md.c +++ b/frameworks/crypto_operation/md.c @@ -58,6 +58,9 @@ static const HcfMdAbility MD_ABILITY_SET[] = { { "SHA256", OpensslMdSpiCreate }, { "SHA384", OpensslMdSpiCreate }, { "SHA512", OpensslMdSpiCreate }, + { "SHA3-224", OpensslMdSpiCreate }, + { "SHA3-256", OpensslMdSpiCreate }, + { "SHA3-384", OpensslMdSpiCreate }, { "MD5", OpensslMdSpiCreate }, { "SM3", OpensslMdSpiCreate }, #endif diff --git a/plugin/openssl_plugin/common/inc/openssl_adapter.h b/plugin/openssl_plugin/common/inc/openssl_adapter.h index f830458..f47a81a 100644 --- a/plugin/openssl_plugin/common/inc/openssl_adapter.h +++ b/plugin/openssl_plugin/common/inc/openssl_adapter.h @@ -235,6 +235,9 @@ int OpensslRandPrivBytes(unsigned char *buf, int num); void OpensslRandSeed(const void *buf, int num); const EVP_MD *OpensslEvpSha1(void); +const EVP_MD *OpensslEvpSha3224(void); +const EVP_MD *OpensslEvpSha3256(void); +const EVP_MD *OpensslEvpSha3384(void); const EVP_MD *OpensslEvpSha224(void); const EVP_MD *OpensslEvpSha256(void); const EVP_MD *OpensslEvpSha384(void); diff --git a/plugin/openssl_plugin/common/src/openssl_adapter.c b/plugin/openssl_plugin/common/src/openssl_adapter.c index f4ec918..8d6e078 100644 --- a/plugin/openssl_plugin/common/src/openssl_adapter.c +++ b/plugin/openssl_plugin/common/src/openssl_adapter.c @@ -869,6 +869,21 @@ const EVP_MD *OpensslEvpSha1(void) return EVP_sha1(); } +const EVP_MD *OpensslEvpSha3224(void) +{ + return EVP_sha3_224(); +} + +const EVP_MD *OpensslEvpSha3256(void) +{ + return EVP_sha3_256(); +} + +const EVP_MD *OpensslEvpSha3384(void) +{ + return EVP_sha3_384(); +} + const EVP_MD *OpensslEvpSha224(void) { return EVP_sha224(); diff --git a/plugin/openssl_plugin/crypto_operation/md/src/md_openssl.c b/plugin/openssl_plugin/crypto_operation/md/src/md_openssl.c index ff48a8b..cfe9f78 100644 --- a/plugin/openssl_plugin/crypto_operation/md/src/md_openssl.c +++ b/plugin/openssl_plugin/crypto_operation/md/src/md_openssl.c @@ -49,6 +49,12 @@ static const EVP_MD *OpensslGetMdAlgoFromString(const char *mdName) { if (strcmp(mdName, "SHA1") == 0) { return OpensslEvpSha1(); + } else if (strcmp(mdName, "SHA3-224") == 0) { + return OpensslEvpSha3224(); + } else if (strcmp(mdName, "SHA3-256") == 0) { + return OpensslEvpSha3256(); + } else if (strcmp(mdName, "SHA3-384") == 0) { + return OpensslEvpSha3384(); } else if (strcmp(mdName, "SHA224") == 0) { return OpensslEvpSha224(); } else if (strcmp(mdName, "SHA256") == 0) { diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index dc9bfb0..5c40278 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -70,6 +70,7 @@ ohos_unittest("crypto_framework_test") { "src/crypto_hkdf_test.cpp", "src/crypto_key_utils_test.cpp", "src/crypto_mac_test.cpp", + "src/crypto_md_sha3_test.cpp", "src/crypto_md_sm3_test.cpp", "src/crypto_md_test.cpp", "src/crypto_openssl_common_test.cpp", diff --git a/test/unittest/src/crypto_md_sha3_test.cpp b/test/unittest/src/crypto_md_sha3_test.cpp new file mode 100644 index 0000000..ef22689 --- /dev/null +++ b/test/unittest/src/crypto_md_sha3_test.cpp @@ -0,0 +1,334 @@ +/* + * Copyright (C) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "securec.h" + +#include "md.h" +#include "md_openssl.h" + +#include "log.h" +#include "memory.h" + +using namespace std; +using namespace testing::ext; + +namespace { +class CryptoMdSha3Test : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +constexpr uint32_t MAX_MD_BLOB_LEN = 5000; +constexpr uint32_t SHA3_224_LEN = 28; +constexpr uint32_t SHA3_256_LEN = 32; +constexpr uint32_t SHA3_384_LEN = 48; + +static char g_testBigData[] = "VqRH5dzdeeturr5zN5vE77DtqjV7kNKbDJqk4mNqyYRTXymhjR\r\n" +"Yz8c2pNvJiCxyFwvLvWfPh2Y2eDAuxbdm2Dt4UzKJtNqEpNYKVZLiyH4a4MhR4BpFhvhJVHy2ALbYq2rW\r\n" +"LqJfNzA6v8kHNaFypNDMgX35kifyCiYkq85XUKDJCdewUzCZ2N8twC8Z9kL37K67bkL35VYFZSXyrNTdV\r\n" +"pB6kqPjwZYrjx5tXzMMgJW8ePqmAhZUVjtPGXTLVt8BUnaVRuWjD97xjS3VH9EwFeyrqJ46B92rkuGexY\r\n" +"cjXuvhHTnQNPbYfake7KMEWG2wgGLmZmjnakULhFgjt6TQhvCWMJAHYn8Zgczd3C3HkPrQgUXJgAiwf3r\r\n" +"jJbgbBpQkkbcfMBZZ3SSLe2J9jw6MkdEf3eBQX9rFVQSgBQgZ9KEW8XLb5kCTcyhRZPBbiHD4qQRyrwKT\r\n" +"mnGZqP5Aru6GDkhFk78jfjtk35HyB7AY7UZXkczRfVYAxa5Mk256MhAHkE3uAvPZTyY7N3qk9U7cLTrce\r\n" +"wJLH6wrymrMvQWgpvrBevMghnURZUcZAWUznDn56WnwGAzYAWmJqdXqAfcvgZwCFTjxdiaEZGpEyUrcS8\r\n" +"nr48ZeXS5aytz5Y7RnU5SxcHbgF8PerWVdftxmghPAvGkQ6f3dcXr9w9bbGqg5KJHyQCxabp8bjZpyFdb\r\n" +"VTq8DpQ6AJjxdjn8cuLTf9giGFxDjtQncicUdqP7YvVDr5AFgWc83cddyryVLZEBGAFfqbbKWF9KnPjRZ\r\n" +"AbuZ7SqrkxhQHu87Hxh3xHUHB8Lb3DGZ4vhnqaLnJBxFK8Ve4F2FfbgfHfQtALFDUWp6dSz8Hvdpj4CGw\r\n" +"FaSb8b5hTemaQRguYAqaUwJVvZ7G2AwkFnV9PHUngmybAFxg8HMAT3K7yAiQJWWqPxdGq8jXPAqZFNkGu\r\n" +"2mnJ5xfnY3z63PFk6TXU9Ga2YmHvtycXxwqMBEctQRa3zVWGVSrh3NF6jXa\r\n"; + +void CryptoMdSha3Test::SetUpTestCase() {} +void CryptoMdSha3Test::TearDownTestCase() {} + +void CryptoMdSha3Test::SetUp() // add init here, this will be called before test. +{ +} + +void CryptoMdSha3Test::TearDown() // add destroy here, this will be called when test case done. +{ +} + +static void PrintfBlobInHex(uint8_t *data, size_t dataLen) +{ + for (size_t i = 0; i < dataLen; i++) { + printf("%02hhX", data[i]); + } + printf("\n"); +} + +/** + * @tc.name: CryptoFrameworkMdTest.CryptoFrameworkMdCreateTest001 + * @tc.desc: Verify that the creation of the SHA1 Md obj is normal. + * @tc.type: FUNC + * @tc.require: I5QWEM + */ + + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdSha3Test001, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdSha3Test002, TestSize.Level0) +{ + // create a SHA3_256 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-256", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdSha3Test003, TestSize.Level0) +{ + // create a SHA3_384 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-384", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoNameTest001, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + // test api functions + const char *algoName = mdObj->getAlgoName(mdObj); + int32_t cmpRes = strcmp(algoName, "SHA3-224"); + EXPECT_EQ(cmpRes, HCF_SUCCESS); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoNameTest002, TestSize.Level0) +{ + // create a SHA3_256 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-256", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + // test api functions + const char *algoName = mdObj->getAlgoName(mdObj); + int32_t cmpRes = strcmp(algoName, "SHA3-256"); + EXPECT_EQ(cmpRes, HCF_SUCCESS); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoNameTest003, TestSize.Level0) +{ + // create a SHA3_384 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-384", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + ASSERT_NE(mdObj, nullptr); + // test api functions + const char *algoName = mdObj->getAlgoName(mdObj); + int32_t cmpRes = strcmp(algoName, "SHA3-384"); + EXPECT_EQ(cmpRes, HCF_SUCCESS); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdUpdateTest001, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + HcfBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdDoFinalTest001, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdDoFinalTest002, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + HcfBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdDoFinalTest003, TestSize.Level0) +{ + // create a SHA3_224 obj + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // define input and output data in blob form + HcfBlob inBlob = { .data = nullptr, .len = 0 }; + inBlob.data = reinterpret_cast(g_testBigData); + inBlob.len = strnlen(g_testBigData, MAX_MD_BLOB_LEN); + HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + PrintfBlobInHex(outBlob.data, outBlob.len); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdLenTest001, TestSize.Level0) +{ + // create a API obj with SHA3_224 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // test api functions + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_224_LEN); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdLenTest002, TestSize.Level0) +{ + // create a API obj with SHA3_256 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-256", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // test api functions + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_256_LEN); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdLenTest003, TestSize.Level0) +{ + // create a API obj with SHA3_384 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-384", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // test api functions + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_384_LEN); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoTest001, TestSize.Level0) +{ + // create a API obj with SHA3_384 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-384", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + struct HcfBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + struct HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_384_LEN); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoTest002, TestSize.Level0) +{ + // create a API obj with SHA3_256 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-256", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + struct HcfBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + struct HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_256_LEN); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} + +HWTEST_F(CryptoMdSha3Test, CryptoFrameworkMdAlgoTest003, TestSize.Level0) +{ + // create a API obj with SHA3_224 + HcfMd *mdObj = nullptr; + HcfResult ret = HcfMdCreate("SHA3-224", &mdObj); + ASSERT_EQ(ret, HCF_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + struct HcfBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + struct HcfBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = mdObj->update(mdObj, &inBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + ret = mdObj->doFinal(mdObj, &outBlob); + EXPECT_EQ(ret, HCF_SUCCESS); + uint32_t len = mdObj->getMdLength(mdObj); + EXPECT_EQ(len, SHA3_224_LEN); + // destroy the API obj and blob data + HcfBlobDataClearAndFree(&outBlob); + HcfObjDestroy(mdObj); +} +} \ No newline at end of file diff --git a/test/unittest/src/native/native_digest_test.cpp b/test/unittest/src/native/native_digest_test.cpp index b3c69ce..4a8ad9b 100644 --- a/test/unittest/src/native/native_digest_test.cpp +++ b/test/unittest/src/native/native_digest_test.cpp @@ -91,4 +91,37 @@ HWTEST_F(NativeDigestTest, NativeDigestTest003, TestSize.Level0) OH_DigestCrypto_Destroy(mdObj); } +HWTEST_F(NativeDigestTest, NativeDigestTest004, TestSize.Level0) +{ + OH_CryptoDigest *mdObj = nullptr; + OH_Crypto_ErrCode ret = OH_CryptoDigest_Create("SHA3-224", &mdObj); + ASSERT_EQ(ret, CRYPTO_SUCCESS); + // set input and output buf + uint8_t testData[] = "My test data"; + // define input and output data in blob form + Crypto_DataBlob inBlob = {.data = reinterpret_cast(testData), .len = sizeof(testData)}; + Crypto_DataBlob outBlob = { .data = nullptr, .len = 0 }; + // test api functions + ret = OH_CryptoDigest_Update(mdObj, &inBlob); + EXPECT_EQ(ret, CRYPTO_SUCCESS); + ret = OH_CryptoDigest_Final(mdObj, &outBlob); + EXPECT_EQ(ret, CRYPTO_SUCCESS); + // destroy the API obj and blob data + OH_Crypto_FreeDataBlob(&outBlob); + OH_DigestCrypto_Destroy(mdObj); +} + +HWTEST_F(NativeDigestTest, NativeDigestTest005, TestSize.Level0) +{ + // create a SHA3_256 obj + OH_CryptoDigest *mdObj = nullptr; + OH_Crypto_ErrCode ret = OH_CryptoDigest_Create("SHA3-256", &mdObj); + ASSERT_EQ(ret, CRYPTO_SUCCESS); + ASSERT_NE(mdObj, nullptr); + // test api functions + const char *algoName = OH_CryptoDigest_GetAlgoName(mdObj); + int32_t cmpRes = strcmp(algoName, "SHA3-256"); + EXPECT_EQ(cmpRes, CRYPTO_SUCCESS); + OH_DigestCrypto_Destroy(mdObj); +} } \ No newline at end of file diff --git a/test/unittest/src/openssl_adapter_mock.c b/test/unittest/src/openssl_adapter_mock.c index 3d18180..1356472 100644 --- a/test/unittest/src/openssl_adapter_mock.c +++ b/test/unittest/src/openssl_adapter_mock.c @@ -1287,6 +1287,30 @@ const EVP_MD *OpensslEvpSha512(void) return EVP_sha512(); } +const EVP_MD *OpensslEvpSha3224(void) +{ + if (IsNeedMock()) { + return NULL; + } + return EVP_sha3_224(); +} + +const EVP_MD *OpensslEvpSha3256(void) +{ + if (IsNeedMock()) { + return NULL; + } + return EVP_sha3_256(); +} + +const EVP_MD *OpensslEvpSha3384(void) +{ + if (IsNeedMock()) { + return NULL; + } + return EVP_sha3_384(); +} + const EVP_MD *OpensslEvpMd5(void) { if (IsNeedMock()) { -- Gitee