• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "devattestservicestub_fuzzer.h"
17 
18 #include <string>
19 #include <securec.h>
20 #include "devattest_service_stub.h"
21 
22 using namespace std;
23 using namespace OHOS::DevAttest;
24 
25 namespace OHOS {
26     const uint8_t *g_baseFuzzData = nullptr;
27     size_t g_baseFuzzSize = 0;
28     size_t g_baseFuzzPos;
29 
30     class DevattestServiceStubFuzzer : public DevAttestServiceStub {
31     public:
32         DevattestServiceStubFuzzer() = default;
33         virtual ~DevattestServiceStubFuzzer() = default;
GetAttestStatus(AttestResultInfo & attestResultInfo)34         int32_t GetAttestStatus(AttestResultInfo &attestResultInfo) override
35         {
36             return 0;
37         }
DelayUnloadTask()38         void DelayUnloadTask() override
39         {}
40     };
41 
42     template <class T>
GetData()43     T GetData()
44     {
45         T object {};
46         size_t objectSize = sizeof(object);
47         if (g_baseFuzzData == nullptr || objectSize > g_baseFuzzSize - g_baseFuzzPos) {
48             return object;
49         }
50         errno_t ret = memcpy_s(&object, objectSize, g_baseFuzzData + g_baseFuzzPos, objectSize);
51         if (ret != EOK) {
52             return {};
53         }
54         g_baseFuzzPos += objectSize;
55         return object;
56     }
57 
OnRemoteRequest(const uint8_t * data,size_t size)58     static void OnRemoteRequest(const uint8_t* data, size_t size)
59     {
60         g_baseFuzzData = data;
61         g_baseFuzzSize = size;
62         g_baseFuzzPos = 0;
63         uint32_t code = GetData<uint32_t>();
64         MessageParcel datas;
65         datas.WriteInterfaceToken(DevAttestServiceStub::GetDescriptor());
66         datas.WriteBuffer(g_baseFuzzData + g_baseFuzzPos, g_baseFuzzSize - g_baseFuzzPos);
67         datas.RewindRead(0);
68         MessageParcel reply;
69         MessageOption option;
70         std::shared_ptr<DevAttestServiceStub> devattestservicestub = std::make_shared<DevattestServiceStubFuzzer>();
71         (void)devattestservicestub->OnRemoteRequest(code, datas, reply, option);
72     }
73 
DevattestServiceStubFuzzTest(const uint8_t * data,size_t size)74     void DevattestServiceStubFuzzTest(const uint8_t* data, size_t size)
75     {
76         int32_t demandSize = sizeof(uint32_t);
77         if (static_cast<int32_t>(size) >= demandSize) {
78             OnRemoteRequest(data, size);
79         }
80         return;
81     }
82 }
83 
84 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)85 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
86 {
87     /* Run your code on data */
88     OHOS::DevattestServiceStubFuzzTest(data, size);
89     return 0;
90 }
91