diff --git a/test/dslm_fuzz_test/dslm_fuzzer/BUILD.gn b/test/dslm_fuzz_test/dslm_fuzzer/BUILD.gn index e59f7a621b16984152abbbe44c3116c00ce88a20..090ae8620fd3ed02c36858bd7ea3bc29d5d193f2 100644 --- a/test/dslm_fuzz_test/dslm_fuzzer/BUILD.gn +++ b/test/dslm_fuzz_test/dslm_fuzzer/BUILD.gn @@ -25,22 +25,34 @@ if (os_level == "standard") { "-fno-omit-frame-pointer", ] + defines = [ + "MAX_SEND_TIMES=5", + "SEND_MSG_TIMEOUT_LEN=40000", + "L2_STANDARD", + ] + + defines += [ "UT_ENABLE=1" ] + include_dirs = [ "../../../baselib/utils/include", "../../../baselib/msglib/include", "../../../baselib/msglib/src/utils", "../../../baselib/msglib/src/common", "../../../baselib/msglib/src/standard", + "../../../baselib/msglib/src/utils", + "../../../baselib/utils/include", "../../../common/include", "../../../interfaces/inner_api/src/standard", "../../../oem_property/include", "../../../oem_property/ohos/common", "../../../oem_property/ohos/standard", "../../../oem_property/ohos/standard/impl", + "../../../services/dslm", "../../../services/sa/common", "../../../services/sa/standard", "../../../services/include", "../../../services/dslm", + "../../../test/dslm_unit_test", "../mock", ] @@ -49,33 +61,66 @@ if (os_level == "standard") { "../../../baselib/msglib/src/standard/messenger_device_socket_manager.c", "../../../baselib/msglib/src/standard/messenger_device_status_manager.cpp", "../../../baselib/msglib/src/standard/messenger_impl.c", + "../../../baselib/msglib/src/utils/messenger_utils.c", + "../../../baselib/utils/src/utils_base64.c", + "../../../baselib/utils/src/utils_datetime.c", + "../../../baselib/utils/src/utils_hexstring.c", + "../../../baselib/utils/src/utils_json.c", + "../../../baselib/utils/src/utils_mem.c", + "../../../baselib/utils/src/utils_state_machine.c", + "../../../baselib/utils/src/utils_timer.cpp", + "../../../baselib/utils/src/utils_tlv.c", + "../../../baselib/utils/src/utils_work_queue.c", + "../../../oem_property/common/dslm_credential_utils.c", + "../../../oem_property/common/dslm_credential.c", + "../../../oem_property/ohos/common/dslm_ohos_request.c", + "../../../oem_property/ohos/common/dslm_ohos_verify.c", + "../../../oem_property/ohos/common/external_interface_adapter.c", + "../../../oem_property/ohos/common/hks_adapter.c", + "../../../oem_property/ohos/standard/impl/dslm_ohos_init.c", + "../../../oem_property/ohos/standard/dslm_ohos_credential.c", + ] + + sources += [ + "../../../services/common/dslm_crypto.c", + "../../../services/common/dslm_msg_serialize.c", + "../../../services/dfx/dslm_bigdata.cpp", + "../../../services/dfx/dslm_hidumper.c", + "../../../services/dfx/dslm_hitrace.cpp", + "../../../services/dslm/dslm_core_process.c", + "../../../services/dslm/dslm_device_list.c", + "../../../services/dslm/dslm_dfx_default.c", + "../../../services/dslm/dslm_fsm_process.c", + "../../../services/dslm/dslm_hievent.c", + "../../../services/dslm/dslm_inner_process.c", + "../../../services/dslm/dslm_msg_utils.c", + "../../../services/msg/dslm_messenger_wrapper.c", "../../../services/sa/common/dslm_rpc_process.c", "../../../services/sa/standard/dslm_callback_proxy.cpp", "../../../services/sa/standard/dslm_ipc_process.cpp", "../../../services/sa/standard/dslm_service.cpp", - "../mock/mock.cpp", + "../../../test/dslm_unit_test/device_manager.cpp", + "../../../test/dslm_unit_test/device_manager_mock.cpp", + "../mock/mock.c", "dslm_fuzzer.cpp", ] - deps = [ - "../../../baselib/utils:utils_static", - "../../../oem_property:dslm_oem_ext", - "../../../services/common:service_common_obj", - "../../../services/dfx:dslm_extension_dfx", - "../../../services/dslm:service_dslm_obj", - "../../../services/msg:service_msg_obj", - ] external_deps = [ "c_utils:utils", - "device_manager:devicemanagersdk", "device_security_level:dslm_sdk", - "dsoftbus:softbus_client", "hilog:libhilog", "huks:libhukssdk", "ipc:ipc_core", "safwk:system_ability_fwk", "samgr:samgr_proxy", + "cJSON:cjson", + "openssl:libcrypto_shared", + "device_auth:deviceauth_sdk", + "hisysevent:libhisysevent", + "hitrace:hitrace_meter", + "googletest:gmock", + "googletest:gtest", ] } } diff --git a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp index e254f28e3d7b32ac2d462e6c0163a03e5b175aef..2a634c6cb2ef41d8adc971af13b6ed5ccb70d94e 100644 --- a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp +++ b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp @@ -38,6 +38,11 @@ #include "utils_base64.h" #include "utils_mem.h" #include "utils_tlv.h" +#include "hks_param.h" +#include "hks_type.h" +#include "external_interface_adapter.h" +#include "hks_adapter.h" +#include "dslm_test_link.h" #define CNT 1000 #define ITEMSTATE 4 @@ -314,12 +319,64 @@ void ReportHiEventTest(DeviceIdentify *deviceIdentify, Parcel &parcel) info = nullptr; } +void ConstructHksCertChainTest(DeviceIdentify *deviceIdentify, Parcel &parcel) +{ + struct HksCertChain *chain = nullptr; + + { + (void)ConstructHksCertChain(&chain, nullptr); + } + + { + struct HksCertChainInitParams param; + param.certChainExist = false; + param.certCountValid = true; + param.certDataExist = true; + + (void)ConstructHksCertChain(&chain, ¶m); + } + + { + struct HksCertChainInitParams param; + param.certChainExist = true; + param.certCountValid = false; + param.certDataExist = true; + + (void)ConstructHksCertChain(&chain, ¶m); + } + + { + struct HksCertChainInitParams param; + param.certChainExist = true; + param.certCountValid = true; + param.certDataExist = false; + + (void)ConstructHksCertChain(&chain, ¶m); + } +} + +void FillHksParamSetTest(DeviceIdentify *deviceIdentify, Parcel &parcel) +{ + struct HksParamSet *paramSet = nullptr; + struct HksParam *param = nullptr; + int32_t paramNums = 0; + (void)FillHksParamSet(¶mSet, param, paramNums); +} + +void HksGenerateKeyAdapterTest(DeviceIdentify *deviceIdentify, Parcel &parcel) +{ + const HksBlob *keyAlias1 = nullptr; + + (void)HksGenerateKeyAdapter(keyAlias1); +} + DslmFuzzerTable g_fuzzerTable[] = {{0, OnPeerMsgReceivedTest1}, {1, OnPeerMsgReceivedTest2}, {2, OnPeerMsgReceivedTest3}, {3, ServiceTest}, {4, OnSendResultNotifierTest}, {5, VerifyDslmCredentialTest}, {6, MessengerSendMsgToTest}, {7, OnPeerStatusReceiverTest}, {8, DslmDumperTest}, {9, VerifyOhosDslmCredTest}, {10, RequestDeviceSecurityInfoTest}, {11, GetPeerDeviceOnlineStatusTest}, {12, Base64EncodeAppTest}, {13, SerializeTest}, {14, BufferToHksCertChainTest}, {15, DestroyHksCertChainTest}, {16, DefaultInitDslmCredTest}, - {17, BuildDeviceSecInfoResponseTest}, {18, ReportHiEventTest}}; + {17, BuildDeviceSecInfoResponseTest}, {18, ReportHiEventTest}, {19, FillHksParamSetTest}, + {20, HksGenerateKeyAdapterTest}, {21, ConstructHksCertChainTest}}; void OnPeerMsgReceivedFuzzer(Parcel &parcel) { @@ -340,7 +397,7 @@ void OnPeerMsgReceivedFuzzer(Parcel &parcel) } } - uint32_t a = parcel.ReadUint32() % 19; + uint32_t a = parcel.ReadUint32() % 22; for (uint32_t i = 0; i < sizeof(g_fuzzerTable) / sizeof(DslmFuzzerTable); ++i) { if (g_fuzzerTable[i].code == a) { g_fuzzerTable[i].process(&deviceIdentify, parcel); @@ -387,6 +444,22 @@ void OnRemoteRequestFuzzer(Parcel &parcel) SECURITY_LOG_INFO("end"); } +void UtServerOnShutdownFuzz() +{ + DeviceIdentify idt {.length = 1, .identity = {'a'}}; + + char dummy[] = {'a', 0}; + PeerSocketInfo peer = {.name = dummy, .networkId = dummy}; + UtServerOnBind(1, peer); + UtClientOnBind(1, &idt); + + UtCreateOrRestartSocketCloseTimerWithLock(0); + UtCreateOrRestartSocketCloseTimerWithLock(1); + + UtServerOnBytes(1, dummy, 1); + UtClientOnBytes(1, dummy, 1); +} + void DslmFuzzTest(const uint8_t *data, size_t size) { Parcel parcel; @@ -397,6 +470,7 @@ void DslmFuzzTest(const uint8_t *data, size_t size) } else { OnRemoteRequestFuzzer(parcel); } + UtServerOnShutdownFuzz(); } } // namespace } // namespace DeviceSecurityLevel diff --git a/test/dslm_fuzz_test/mock/mock.cpp b/test/dslm_fuzz_test/mock/mock.c similarity index 81% rename from test/dslm_fuzz_test/mock/mock.cpp rename to test/dslm_fuzz_test/mock/mock.c index 409c5b2bfc57dc1d3b50b7d9d039c2782a5a4cc7..4277ea7031ac2e3418de77997d67e180a2c6b207 100644 --- a/test/dslm_fuzz_test/mock/mock.cpp +++ b/test/dslm_fuzz_test/mock/mock.c @@ -33,4 +33,14 @@ int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISock void Shutdown(int32_t socket) { +} + +int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener) +{ + return 0; +} + +int32_t SendBytes(int32_t socket, const void *data, uint32_t len) +{ + return 0; } \ No newline at end of file diff --git a/test/dslm_fuzz_test/mock/socket.h b/test/dslm_fuzz_test/mock/socket.h new file mode 100644 index 0000000000000000000000000000000000000000..3dc060f1eaaeaeaf3ada68d8bb0e0c79ab646b5e --- /dev/null +++ b/test/dslm_fuzz_test/mock/socket.h @@ -0,0 +1,55 @@ +/* + * 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. + */ + +#ifndef SOCKET_H +#define SOCKET_H + +#include +#include +#include "trans_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + QOS_SATISFIED, /**< Feedback on satisfied quality */ + QOS_NOT_SATISFIED, /**< Feedback on not satisfied quality */ +} QoSEvent; + +typedef struct { + void (*OnBind)(int32_t socket, PeerSocketInfo info); + + void (*OnShutdown)(int32_t socket, ShutdownReason reason); + + void (*OnBytes)(int32_t socket, const void *data, uint32_t dataLen); + + void (*OnMessage)(int32_t socket, const void *data, uint32_t dataLen); +} ISocketListener; + +int32_t Socket(SocketInfo info); + +int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener); + +int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener); + +int32_t SendBytes(int32_t socket, const void *data, uint32_t len); + +void Shutdown(int32_t socket); + +#ifdef __cplusplus +} +#endif +#endif // SOCKET_H diff --git a/test/dslm_fuzz_test/mock/trans_type.h b/test/dslm_fuzz_test/mock/trans_type.h new file mode 100644 index 0000000000000000000000000000000000000000..93229a919d4fc5d85a310bc0a27de46c15a195d3 --- /dev/null +++ b/test/dslm_fuzz_test/mock/trans_type.h @@ -0,0 +1,71 @@ +/* + * 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. + */ + +#ifndef SOCKET_TYPE_H +#define SOCKET_TYPE_H +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_MAC_LEN 18 +#define MAX_IP_LEN 46 +#define MAX_PATH_LEN 4096 +#define DEVICE_ID_LEN_MAX 65 +#define ACCOUNT_UID_LEN_MAX 65 +#define EXTRA_ACCESS_INFO_LEN_MAX 256 + +typedef enum { + DATA_TYPE_BYTES, /**< Bytes */ + DATA_TYPE_BUTT, +} TransDataType; + +typedef struct { + char *name; /**< My socket name, maximum length 255 bytes */ + char *peerName; /**< Peer socket name, maximum length 255 bytes */ + char *peerNetworkId; /**< Peer network ID, maximum length 64 bytes */ + char *pkgName; /**< Package name, maximum length 64 bytes */ + TransDataType dataType; /**< Data type */ +} SocketInfo; + +typedef struct { + char *name; /**< Peer socket name, maximum length 255 bytes */ + char *networkId; /**< Peer network ID, maximum length 64 bytes */ + char *pkgName; /**< Peer package name, maximum length 64 bytes */ + TransDataType dataType; /**< Data type of peer socket*/ +} PeerSocketInfo; + +typedef enum { + SHUTDOWN_REASON_LOCAL, /**< Shutdown by local process */ +} ShutdownReason; + +typedef enum { + QOS_TYPE_MIN_BW, /**< Minimum bandwidth. */ + QOS_TYPE_MAX_LATENCY = 1, /**< Maximum latency. */ + QOS_TYPE_MIN_LATENCY, /**< Minimum latency. */ + QOS_TYPE_MAX_IDLE_TIMEOUT, /**< Maximum idle time. */ + QOS_TYPE_BUTT, +} QosType; + +typedef struct { + QosType qos; /**< Qos type {@link QosType} */ + int32_t value; /**< Value of Qos types */ +} QosTV; + +#ifdef __cplusplus +} +#endif +#endif // SOCKET_TYPE_H \ No newline at end of file diff --git a/test/dslm_unit_test/BUILD.gn b/test/dslm_unit_test/BUILD.gn index 59d37af4bb4cab1f8afc4d275ecf7550c0101930..11a519cc323beb8bfac58fdbf139e723773f4d51 100644 --- a/test/dslm_unit_test/BUILD.gn +++ b/test/dslm_unit_test/BUILD.gn @@ -105,7 +105,7 @@ if (os_level == "standard") { ] external_deps = [ - "access_token:libnativetoken", + "access_token:libnativetoken_shared", "access_token:libtoken_setproc", "c_utils:utils", "device_security_level:dslm_sdk", @@ -115,7 +115,6 @@ if (os_level == "standard") { "hisysevent:libhisysevent", "hitrace:hitrace_meter", "huks:libhukssdk", - "selinux_adapter:librestorecon", ] } @@ -188,7 +187,7 @@ if (os_level == "standard") { ] external_deps = [ - "access_token:libnativetoken", + "access_token:libnativetoken_shared", "access_token:libtoken_setproc", "c_utils:utils", "device_security_level:dslm_sdk", diff --git a/test/dslm_unit_test/dslm_test_link.h b/test/dslm_unit_test/dslm_test_link.h index 7d9d3312db699aa784faa59373f77eac70891eeb..e8df77990b80f23b8451b2a43c14d4a3a8552882 100644 --- a/test/dslm_unit_test/dslm_test_link.h +++ b/test/dslm_unit_test/dslm_test_link.h @@ -23,6 +23,7 @@ #endif #include "messenger_device_socket_manager.h" +#include "socket.h" #ifdef __cplusplus extern "C" {