1 /*
2 * Copyright (c) 2022-2023 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 "discoveryservice_fuzzer.h"
17
18 #include <cstddef>
19 #include <string>
20 #include "discovery_service.h"
21
22 namespace OHOS {
23 static std::string TEST_PACKAGE_NAME = "TestPackageName";
24
TestPublishSuccess(int publicId)25 static void TestPublishSuccess(int publicId) {}
TestPublishFail(int publishId,PublishFailReason reason)26 static void TestPublishFail(int publishId, PublishFailReason reason) {}
27 static IPublishCallback g_publishCallback = {
28 .OnPublishSuccess = TestPublishSuccess,
29 .OnPublishFail = TestPublishFail,
30 };
31
TestDeviceFound(const DeviceInfo * device)32 static void TestDeviceFound(const DeviceInfo *device) {}
TestDiscoverFailed(int subscribeId,DiscoveryFailReason failReason)33 static void TestDiscoverFailed(int subscribeId, DiscoveryFailReason failReason) {}
TestDiscoverySuccess(int subscribeId)34 static void TestDiscoverySuccess(int subscribeId) {}
35 static IDiscoveryCallback g_discoveryCallback = {
36 .OnDeviceFound = TestDeviceFound,
37 .OnDiscoverFailed = TestDiscoverFailed,
38 .OnDiscoverySuccess = TestDiscoverySuccess,
39 };
40
41 static PublishInfo g_publishInfo;
GenerateMode(uint8_t data)42 static DiscoverMode GenerateMode(uint8_t data)
43 {
44 if (data < UINT8_MAX / 2) {
45 return DISCOVER_MODE_ACTIVE;
46 }
47 return DISCOVER_MODE_PASSIVE;
48 }
49
GenerateMedium(uint8_t data)50 static ExchangeMedium GenerateMedium(uint8_t data)
51 {
52 if (data < UINT8_MAX / MEDIUM_BUTT) {
53 return AUTO;
54 }
55 if (data < UINT8_MAX / MEDIUM_BUTT * 2) {
56 return BLE;
57 }
58 if (data < UINT8_MAX / MEDIUM_BUTT * 3) {
59 return COAP;
60 }
61 if (data < UINT8_MAX / MEDIUM_BUTT * 4) {
62 return USB;
63 }
64 return COAP1;
65 }
66
GenerateFreq(uint8_t data)67 static ExchangeFreq GenerateFreq(uint8_t data)
68 {
69 if (data < UINT8_MAX / FREQ_BUTT) {
70 return LOW;
71 }
72 if (data < UINT8_MAX / FREQ_BUTT * 2) {
73 return MID;
74 }
75 if (data < UINT8_MAX / FREQ_BUTT * 3) {
76 return HIGH;
77 }
78 return SUPER_HIGH;
79 }
80
GeneratePublishInfo(const uint8_t * data,size_t size)81 static PublishInfo *GeneratePublishInfo(const uint8_t *data, size_t size)
82 {
83 if (size < sizeof(PublishInfo)) {
84 return &g_publishInfo;
85 }
86
87 g_publishInfo.publishId = *data++;
88 g_publishInfo.mode = GenerateMode(*data++);
89 g_publishInfo.medium = GenerateMedium(*data++);
90 g_publishInfo.freq = GenerateFreq(*data);
91
92 return &g_publishInfo;
93 }
94
95 static SubscribeInfo g_subscribeInfo;
GenerateSubscribeInfo(const uint8_t * data,size_t size)96 static SubscribeInfo *GenerateSubscribeInfo(const uint8_t *data, size_t size)
97 {
98 if (size < sizeof(SubscribeInfo)) {
99 return &g_subscribeInfo;
100 }
101
102 g_subscribeInfo.subscribeId = *data++;
103 g_subscribeInfo.mode = GenerateMode(*data++);
104 g_subscribeInfo.medium = GenerateMedium(*data++);
105 g_subscribeInfo.freq = GenerateFreq(*data++);
106 g_subscribeInfo.isSameAccount = *data++;
107 g_subscribeInfo.isWakeRemote = *data;
108
109 return &g_subscribeInfo;
110 }
111
DiscoveryServiceTest(const uint8_t * data,size_t size)112 void DiscoveryServiceTest(const uint8_t* data, size_t size)
113 {
114 PublishService(TEST_PACKAGE_NAME.c_str(), GeneratePublishInfo(data, size), &g_publishCallback);
115 UnPublishService(TEST_PACKAGE_NAME.c_str(), *data);
116 StartDiscovery(TEST_PACKAGE_NAME.c_str(), GenerateSubscribeInfo(data, size), &g_discoveryCallback);
117 StopDiscovery(TEST_PACKAGE_NAME.c_str(), *data);
118 }
119 } // namespace OHOS
120
121 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)122 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
123 {
124 if (data == nullptr || size < sizeof(int32_t)) {
125 return 0;
126 }
127 OHOS::DiscoveryServiceTest(data, size);
128 return 0;
129 }