1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "camera_host_fuzzer.h"
17094332d3Sopenharmony_ci#include "camera.h"
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_cinamespace OHOS::Camera {
20094332d3Sopenharmony_ciconst size_t THRESHOLD = 10;
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_cienum HostCmdId {
23094332d3Sopenharmony_ci    CAMERA_HOST_PRELAUNCH,
24094332d3Sopenharmony_ci    CAMERA_HOST_GET_CAMERA_ABILITY,
25094332d3Sopenharmony_ci    CAMERA_HOST_OPEN_CAMERA,
26094332d3Sopenharmony_ci    CAMERA_HOST_OPEN_CAMERA_V1_1,
27094332d3Sopenharmony_ci    CAMERA_HOST_SET_FLASH_LIGHTS,
28094332d3Sopenharmony_ci    CAMERA_HOST_SET_FLASH_LIGHTS_V1_2,
29094332d3Sopenharmony_ci    CAMERA_HOST_NOTIFY_DEVICE_STATE_CHANGE_INFO,
30094332d3Sopenharmony_ci    CAMERA_HOST_PRE_CAMERA_SWITCH,
31094332d3Sopenharmony_ci    CAMERA_HOST_PRELAUNCH_WITH_OPMODE,
32094332d3Sopenharmony_ci    CAMERA_HOST_OPEN_SECURECAMERA,
33094332d3Sopenharmony_ci    CAMERA_HOST_END, // Enumerated statistical value. The new enumerated value is added before
34094332d3Sopenharmony_ci};
35094332d3Sopenharmony_ci
36094332d3Sopenharmony_civoid FuncPrelaunch(const uint8_t *rawData, size_t size)
37094332d3Sopenharmony_ci{
38094332d3Sopenharmony_ci    if (size < sizeof(struct HDI::Camera::V1_1::PrelaunchConfig)) {
39094332d3Sopenharmony_ci        return;
40094332d3Sopenharmony_ci    }
41094332d3Sopenharmony_ci    cameraTest->prelaunchConfig = std::make_shared<OHOS::HDI::Camera::V1_1::PrelaunchConfig>();
42094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->cameraId = const_cast<char*>(reinterpret_cast<const char*>(rawData));
43094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->streamInfos_V1_1 = {};
44094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->setting.push_back(*rawData);
45094332d3Sopenharmony_ci    cameraTest->serviceV1_3->Prelaunch(*cameraTest->prelaunchConfig);
46094332d3Sopenharmony_ci}
47094332d3Sopenharmony_ci
48094332d3Sopenharmony_civoid FuncGetCameraAbility(const uint8_t *rawData, size_t size)
49094332d3Sopenharmony_ci{
50094332d3Sopenharmony_ci    cameraTest->serviceV1_3->GetCameraAbility(const_cast<char*>(reinterpret_cast<const char*>(rawData)),
51094332d3Sopenharmony_ci        cameraTest->abilityVec);
52094332d3Sopenharmony_ci}
53094332d3Sopenharmony_ci
54094332d3Sopenharmony_civoid FuncOpenCamera(const uint8_t *rawData, size_t size)
55094332d3Sopenharmony_ci{
56094332d3Sopenharmony_ci    sptr<HDI::Camera::V1_0::ICameraDevice> g_CameraDevice = nullptr;
57094332d3Sopenharmony_ci    const sptr<HDI::Camera::V1_0::ICameraDeviceCallback> callback =
58094332d3Sopenharmony_ci        new HdiCommon::DemoCameraDeviceCallback();
59094332d3Sopenharmony_ci    cameraTest->serviceV1_3->OpenCamera(
60094332d3Sopenharmony_ci        const_cast<char*>(reinterpret_cast<const char*>(rawData)), callback, g_CameraDevice);
61094332d3Sopenharmony_ci}
62094332d3Sopenharmony_ci
63094332d3Sopenharmony_civoid FuncOpenCamera_V1_1(const uint8_t *rawData, size_t size)
64094332d3Sopenharmony_ci{
65094332d3Sopenharmony_ci    sptr<HDI::Camera::V1_1::ICameraDevice> g_CameraDevice = nullptr;
66094332d3Sopenharmony_ci    const sptr<HDI::Camera::V1_0::ICameraDeviceCallback> callback =
67094332d3Sopenharmony_ci        new HdiCommon::DemoCameraDeviceCallback();
68094332d3Sopenharmony_ci    cameraTest->serviceV1_3->OpenCamera_V1_1(
69094332d3Sopenharmony_ci        const_cast<char*>(reinterpret_cast<const char*>(rawData)), callback, g_CameraDevice);
70094332d3Sopenharmony_ci}
71094332d3Sopenharmony_ci
72094332d3Sopenharmony_civoid FuncSetFlashlight(const uint8_t *rawData, size_t size)
73094332d3Sopenharmony_ci{
74094332d3Sopenharmony_ci    cameraTest->serviceV1_3->SetFlashlight(
75094332d3Sopenharmony_ci        const_cast<char*>(reinterpret_cast<const char*>(rawData)), true);
76094332d3Sopenharmony_ci}
77094332d3Sopenharmony_ci
78094332d3Sopenharmony_civoid FuncSetFlashlightV1_2(const uint8_t *rawData, size_t size)
79094332d3Sopenharmony_ci{
80094332d3Sopenharmony_ci    uint8_t *data = const_cast<uint8_t *>(rawData);
81094332d3Sopenharmony_ci    cameraTest->serviceV1_3->SetFlashlight_V1_2(*(reinterpret_cast<float *>(data)));
82094332d3Sopenharmony_ci}
83094332d3Sopenharmony_ci
84094332d3Sopenharmony_civoid FuncNotifyDeviceStateChangeInfo(const uint8_t *rawData, size_t size)
85094332d3Sopenharmony_ci{
86094332d3Sopenharmony_ci    int *data = const_cast<int *>(reinterpret_cast<const int *>(rawData));
87094332d3Sopenharmony_ci    cameraTest->serviceV1_3->NotifyDeviceStateChangeInfo(data[0], data[1]);
88094332d3Sopenharmony_ci}
89094332d3Sopenharmony_ci
90094332d3Sopenharmony_civoid FuncPreCameraSwitch(const uint8_t *rawData, size_t size)
91094332d3Sopenharmony_ci{
92094332d3Sopenharmony_ci    std::string cameraId = reinterpret_cast<const char*>(rawData);
93094332d3Sopenharmony_ci    cameraTest->serviceV1_3->PreCameraSwitch(cameraId);
94094332d3Sopenharmony_ci}
95094332d3Sopenharmony_ci
96094332d3Sopenharmony_civoid FuncPrelaunchWithOpMode(const uint8_t *rawData, size_t size)
97094332d3Sopenharmony_ci{
98094332d3Sopenharmony_ci    cameraTest->prelaunchConfig = std::make_shared<OHOS::HDI::Camera::V1_1::PrelaunchConfig>();
99094332d3Sopenharmony_ci    std::string cameraId = reinterpret_cast<const char*>(rawData);
100094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->cameraId = cameraId;
101094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->streamInfos_V1_1 = {};
102094332d3Sopenharmony_ci    cameraTest->prelaunchConfig->setting.push_back(*rawData);
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_ci    int *data = const_cast<int *>(reinterpret_cast<const int *>(rawData));
105094332d3Sopenharmony_ci
106094332d3Sopenharmony_ci    cameraTest->serviceV1_3->PrelaunchWithOpMode(*cameraTest->prelaunchConfig, data[0]);
107094332d3Sopenharmony_ci}
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_civoid FuncOpenSecureCamera(const uint8_t *rawData, size_t size)
110094332d3Sopenharmony_ci{
111094332d3Sopenharmony_ci    sptr<HDI::Camera::V1_3::ICameraDevice> g_CameraDevice = nullptr;
112094332d3Sopenharmony_ci    const sptr<HDI::Camera::V1_0::ICameraDeviceCallback> callback =
113094332d3Sopenharmony_ci        new HdiCommon::DemoCameraDeviceCallback();
114094332d3Sopenharmony_ci    cameraTest->serviceV1_3->OpenSecureCamera(
115094332d3Sopenharmony_ci        const_cast<char*>(reinterpret_cast<const char*>(rawData)), callback, g_CameraDevice);
116094332d3Sopenharmony_ci}
117094332d3Sopenharmony_ci
118094332d3Sopenharmony_cistatic void HostFuncSwitch(uint32_t cmd, const uint8_t *rawData, size_t size)
119094332d3Sopenharmony_ci{
120094332d3Sopenharmony_ci    switch (cmd) {
121094332d3Sopenharmony_ci        case CAMERA_HOST_PRELAUNCH: {
122094332d3Sopenharmony_ci            FuncPrelaunch(rawData, size);
123094332d3Sopenharmony_ci            break;
124094332d3Sopenharmony_ci        }
125094332d3Sopenharmony_ci        case CAMERA_HOST_GET_CAMERA_ABILITY: {
126094332d3Sopenharmony_ci            FuncGetCameraAbility(rawData, size);
127094332d3Sopenharmony_ci            break;
128094332d3Sopenharmony_ci        }
129094332d3Sopenharmony_ci        case CAMERA_HOST_OPEN_CAMERA: {
130094332d3Sopenharmony_ci            FuncOpenCamera(rawData, size);
131094332d3Sopenharmony_ci            break;
132094332d3Sopenharmony_ci        }
133094332d3Sopenharmony_ci        case CAMERA_HOST_OPEN_CAMERA_V1_1: {
134094332d3Sopenharmony_ci            FuncOpenCamera_V1_1(rawData, size);
135094332d3Sopenharmony_ci            break;
136094332d3Sopenharmony_ci        }
137094332d3Sopenharmony_ci        case CAMERA_HOST_SET_FLASH_LIGHTS: {
138094332d3Sopenharmony_ci            FuncSetFlashlight(rawData, size);
139094332d3Sopenharmony_ci            break;
140094332d3Sopenharmony_ci        }
141094332d3Sopenharmony_ci        case CAMERA_HOST_SET_FLASH_LIGHTS_V1_2: {
142094332d3Sopenharmony_ci            FuncSetFlashlightV1_2(rawData, size);
143094332d3Sopenharmony_ci            break;
144094332d3Sopenharmony_ci        }
145094332d3Sopenharmony_ci        case CAMERA_HOST_NOTIFY_DEVICE_STATE_CHANGE_INFO: {
146094332d3Sopenharmony_ci            FuncNotifyDeviceStateChangeInfo(rawData, size);
147094332d3Sopenharmony_ci            break;
148094332d3Sopenharmony_ci        }
149094332d3Sopenharmony_ci        case CAMERA_HOST_PRE_CAMERA_SWITCH: {
150094332d3Sopenharmony_ci            FuncPreCameraSwitch(rawData, size);
151094332d3Sopenharmony_ci            break;
152094332d3Sopenharmony_ci        }
153094332d3Sopenharmony_ci        case CAMERA_HOST_PRELAUNCH_WITH_OPMODE: {
154094332d3Sopenharmony_ci            FuncPrelaunchWithOpMode(rawData, size);
155094332d3Sopenharmony_ci            break;
156094332d3Sopenharmony_ci        }
157094332d3Sopenharmony_ci        case CAMERA_HOST_OPEN_SECURECAMERA: {
158094332d3Sopenharmony_ci            FuncOpenSecureCamera(rawData, size);
159094332d3Sopenharmony_ci            break;
160094332d3Sopenharmony_ci        }
161094332d3Sopenharmony_ci        default:
162094332d3Sopenharmony_ci            return;
163094332d3Sopenharmony_ci    }
164094332d3Sopenharmony_ci}
165094332d3Sopenharmony_ci
166094332d3Sopenharmony_cibool DoSomethingInterestingWithMyApi(const uint8_t *rawData, size_t size)
167094332d3Sopenharmony_ci{
168094332d3Sopenharmony_ci    if (rawData == nullptr) {
169094332d3Sopenharmony_ci        return false;
170094332d3Sopenharmony_ci    }
171094332d3Sopenharmony_ci
172094332d3Sopenharmony_ci    uint32_t cmd = 0;
173094332d3Sopenharmony_ci    rawData += sizeof(cmd);
174094332d3Sopenharmony_ci
175094332d3Sopenharmony_ci    cameraTest = std::make_shared<OHOS::Camera::HdiCommonV1_3>();
176094332d3Sopenharmony_ci    cameraTest->Init();
177094332d3Sopenharmony_ci    if (cameraTest->serviceV1_3 == nullptr) {
178094332d3Sopenharmony_ci        return false;
179094332d3Sopenharmony_ci    }
180094332d3Sopenharmony_ci    cameraTest->Open(DEVICE_0);
181094332d3Sopenharmony_ci    if (cameraTest->cameraDeviceV1_3 == nullptr) {
182094332d3Sopenharmony_ci        return false;
183094332d3Sopenharmony_ci    }
184094332d3Sopenharmony_ci
185094332d3Sopenharmony_ci    for (cmd = 0; cmd < CAMERA_HOST_END; cmd++) {
186094332d3Sopenharmony_ci        HostFuncSwitch(cmd, rawData, size);
187094332d3Sopenharmony_ci    }
188094332d3Sopenharmony_ci    cameraTest->Close();
189094332d3Sopenharmony_ci    return true;
190094332d3Sopenharmony_ci}
191094332d3Sopenharmony_ci
192094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
193094332d3Sopenharmony_ci{
194094332d3Sopenharmony_ci    if (size < THRESHOLD) {
195094332d3Sopenharmony_ci        return 0;
196094332d3Sopenharmony_ci    }
197094332d3Sopenharmony_ci
198094332d3Sopenharmony_ci    DoSomethingInterestingWithMyApi(data, size);
199094332d3Sopenharmony_ci    return 0;
200094332d3Sopenharmony_ci}
201094332d3Sopenharmony_ci} // namespace OHOS
202