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_device_fuzzer.h"
17094332d3Sopenharmony_ci#include "camera.h"
18094332d3Sopenharmony_ci#include "v1_1/icamera_device.h"
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_cinamespace OHOS::Camera {
21094332d3Sopenharmony_ciconst size_t RAW_DATA_SIZE_MAX = 256;
22094332d3Sopenharmony_ciconst size_t THRESHOLD = 10;
23094332d3Sopenharmony_ci
24094332d3Sopenharmony_cienum DeviceCmdId {
25094332d3Sopenharmony_ci    CAMERA_DEVICE_GET_DEFAULT_SETTINGS,
26094332d3Sopenharmony_ci    CAMERA_DEVICE_GET_STREAM_V1_1,
27094332d3Sopenharmony_ci    CAMERA_DEVICE_UPDATE_SETTINGS,
28094332d3Sopenharmony_ci    CAMERA_DEVICE_SET_RESULT_MODE,
29094332d3Sopenharmony_ci    CAMERA_DEVICE_GET_ENABLED_RESULTS,
30094332d3Sopenharmony_ci    CAMERA_DEVICE_ENABLE_RESULT,
31094332d3Sopenharmony_ci    CAMERA_DEVICE_DISABLE_RESULT,
32094332d3Sopenharmony_ci    CAMERA_DEVICE_GET_STATUS,
33094332d3Sopenharmony_ci    CAMERA_DEVICE_GET_SECURECAMERASEQ,
34094332d3Sopenharmony_ci    CAMERA_DEVICE_END, // Enumerated statistical value. The new enumerated value is added before
35094332d3Sopenharmony_ci};
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_civoid FuncGetDefaultSettings(const uint8_t *rawData, size_t size)
38094332d3Sopenharmony_ci{
39094332d3Sopenharmony_ci    if (size >= RAW_DATA_SIZE_MAX) {
40094332d3Sopenharmony_ci        return;
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci    std::vector<uint8_t> abilityVec = {};
43094332d3Sopenharmony_ci    uint8_t *data = const_cast<uint8_t *>(rawData);
44094332d3Sopenharmony_ci    abilityVec.push_back(*data);
45094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->GetDefaultSettings(abilityVec);
46094332d3Sopenharmony_ci}
47094332d3Sopenharmony_ci
48094332d3Sopenharmony_civoid FuncGetStreamOperator_V1_1(const uint8_t *rawData, size_t size)
49094332d3Sopenharmony_ci{
50094332d3Sopenharmony_ci    (void)size;
51094332d3Sopenharmony_ci    sptr<HDI::Camera::V1_0::IStreamOperatorCallback> g_callback =
52094332d3Sopenharmony_ci        new OHOS::Camera::HdiCommon::TestStreamOperatorCallback();
53094332d3Sopenharmony_ci    sptr<HDI::Camera::V1_1::IStreamOperator> g_StreamOperator = nullptr;
54094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->GetStreamOperator_V1_1(g_callback, g_StreamOperator);
55094332d3Sopenharmony_ci}
56094332d3Sopenharmony_ci
57094332d3Sopenharmony_civoid FuncUpdateSettings(const uint8_t *rawData, size_t size)
58094332d3Sopenharmony_ci{
59094332d3Sopenharmony_ci    if (size >= RAW_DATA_SIZE_MAX) {
60094332d3Sopenharmony_ci        return;
61094332d3Sopenharmony_ci    }
62094332d3Sopenharmony_ci    float *data = const_cast<float *>(reinterpret_cast<const float *>(rawData));
63094332d3Sopenharmony_ci    std::shared_ptr<CameraMetadata> meta = std::make_shared<CameraMetadata>(
64094332d3Sopenharmony_ci        cameraTest->itemCapacity, cameraTest->dataCapacity);
65094332d3Sopenharmony_ci    meta->addEntry(OHOS_CONTROL_ZOOM_RATIO, &data[0], cameraTest->dataCount);
66094332d3Sopenharmony_ci    std::vector<uint8_t> metaVec;
67094332d3Sopenharmony_ci    MetadataUtils::ConvertMetadataToVec(meta, metaVec);
68094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->UpdateSettings(metaVec);
69094332d3Sopenharmony_ci}
70094332d3Sopenharmony_ci
71094332d3Sopenharmony_civoid FuncSetResultMode(const uint8_t *rawData, size_t size)
72094332d3Sopenharmony_ci{
73094332d3Sopenharmony_ci    (void)size;
74094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->SetResultMode(
75094332d3Sopenharmony_ci        *reinterpret_cast<const HDI::Camera::V1_0::ResultCallbackMode *>(rawData));
76094332d3Sopenharmony_ci}
77094332d3Sopenharmony_ci
78094332d3Sopenharmony_civoid FuncGetEnabledResults(const uint8_t *rawData, size_t size)
79094332d3Sopenharmony_ci{
80094332d3Sopenharmony_ci    (void)size;
81094332d3Sopenharmony_ci    std::vector<int32_t> result = {};
82094332d3Sopenharmony_ci    int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
83094332d3Sopenharmony_ci    result.push_back(*data);
84094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->GetEnabledResults(result);
85094332d3Sopenharmony_ci}
86094332d3Sopenharmony_ci
87094332d3Sopenharmony_civoid FuncEnableResult(const uint8_t *rawData, size_t size)
88094332d3Sopenharmony_ci{
89094332d3Sopenharmony_ci    (void)size;
90094332d3Sopenharmony_ci    std::vector<int32_t> result = {};
91094332d3Sopenharmony_ci    int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
92094332d3Sopenharmony_ci    result.push_back(*data);
93094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->EnableResult(result);
94094332d3Sopenharmony_ci}
95094332d3Sopenharmony_ci
96094332d3Sopenharmony_civoid FuncDisableResult(const uint8_t *rawData, size_t size)
97094332d3Sopenharmony_ci{
98094332d3Sopenharmony_ci    (void)size;
99094332d3Sopenharmony_ci    std::vector<int32_t> result = {};
100094332d3Sopenharmony_ci    int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
101094332d3Sopenharmony_ci    result.push_back(*data);
102094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->DisableResult(result);
103094332d3Sopenharmony_ci}
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_civoid FuncGetStatus(const uint8_t *rawData, size_t size)
106094332d3Sopenharmony_ci{
107094332d3Sopenharmony_ci    (void)size;
108094332d3Sopenharmony_ci    std::vector<uint8_t> resultOut = {};
109094332d3Sopenharmony_ci    float *data = const_cast<float *>(reinterpret_cast<const float *>(rawData));
110094332d3Sopenharmony_ci    std::shared_ptr<CameraMetadata> meta = std::make_shared<CameraMetadata>(
111094332d3Sopenharmony_ci        cameraTest->itemCapacity, cameraTest->dataCapacity);
112094332d3Sopenharmony_ci    meta->addEntry(OHOS_CONTROL_ZOOM_RATIO, &data[0], cameraTest->dataCount);
113094332d3Sopenharmony_ci    std::vector<uint8_t> metaVec;
114094332d3Sopenharmony_ci    MetadataUtils::ConvertMetadataToVec(meta, metaVec);
115094332d3Sopenharmony_ci    if (nullptr == cameraTest->cameraDeviceV1_3) {
116094332d3Sopenharmony_ci        return;
117094332d3Sopenharmony_ci    }
118094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->GetStatus(metaVec, resultOut);
119094332d3Sopenharmony_ci}
120094332d3Sopenharmony_ci
121094332d3Sopenharmony_civoid FuncGetSecureCameraSeq(const uint8_t *rawData, size_t size)
122094332d3Sopenharmony_ci{
123094332d3Sopenharmony_ci    (void)size;
124094332d3Sopenharmony_ci    if (nullptr == cameraTest->cameraDeviceV1_3) {
125094332d3Sopenharmony_ci        return;
126094332d3Sopenharmony_ci    }
127094332d3Sopenharmony_ci    uint64_t SeqId;
128094332d3Sopenharmony_ci    // Output do not need fuzz
129094332d3Sopenharmony_ci    cameraTest->cameraDeviceV1_3->GetSecureCameraSeq(SeqId);
130094332d3Sopenharmony_ci}
131094332d3Sopenharmony_ci
132094332d3Sopenharmony_cistatic void DeviceFuncSwitch(uint32_t cmd, const uint8_t *rawData, size_t size)
133094332d3Sopenharmony_ci{
134094332d3Sopenharmony_ci    CAMERA_LOGI("DeviceFuncSwitch start, the cmd is:%{public}u", cmd);
135094332d3Sopenharmony_ci    switch (cmd) {
136094332d3Sopenharmony_ci        case CAMERA_DEVICE_GET_DEFAULT_SETTINGS: {
137094332d3Sopenharmony_ci            FuncGetDefaultSettings(rawData, size);
138094332d3Sopenharmony_ci            break;
139094332d3Sopenharmony_ci        }
140094332d3Sopenharmony_ci        case CAMERA_DEVICE_GET_STREAM_V1_1: {
141094332d3Sopenharmony_ci            FuncGetStreamOperator_V1_1(rawData, size);
142094332d3Sopenharmony_ci            break;
143094332d3Sopenharmony_ci        }
144094332d3Sopenharmony_ci
145094332d3Sopenharmony_ci        case CAMERA_DEVICE_UPDATE_SETTINGS: {
146094332d3Sopenharmony_ci            FuncUpdateSettings(rawData, size);
147094332d3Sopenharmony_ci            break;
148094332d3Sopenharmony_ci        }
149094332d3Sopenharmony_ci        case CAMERA_DEVICE_SET_RESULT_MODE: {
150094332d3Sopenharmony_ci            FuncSetResultMode(rawData, size);
151094332d3Sopenharmony_ci            break;
152094332d3Sopenharmony_ci        }
153094332d3Sopenharmony_ci        case CAMERA_DEVICE_GET_ENABLED_RESULTS: {
154094332d3Sopenharmony_ci            FuncGetEnabledResults(rawData, size);
155094332d3Sopenharmony_ci            break;
156094332d3Sopenharmony_ci        }
157094332d3Sopenharmony_ci        case CAMERA_DEVICE_ENABLE_RESULT: {
158094332d3Sopenharmony_ci            FuncEnableResult(rawData, size);
159094332d3Sopenharmony_ci            break;
160094332d3Sopenharmony_ci        }
161094332d3Sopenharmony_ci        case CAMERA_DEVICE_DISABLE_RESULT: {
162094332d3Sopenharmony_ci            FuncDisableResult(rawData, size);
163094332d3Sopenharmony_ci            break;
164094332d3Sopenharmony_ci        }
165094332d3Sopenharmony_ci        case CAMERA_DEVICE_GET_STATUS: {
166094332d3Sopenharmony_ci            FuncGetStatus(rawData, size);
167094332d3Sopenharmony_ci            break;
168094332d3Sopenharmony_ci        }
169094332d3Sopenharmony_ci        case CAMERA_DEVICE_GET_SECURECAMERASEQ: {
170094332d3Sopenharmony_ci            FuncGetSecureCameraSeq(rawData, size);
171094332d3Sopenharmony_ci            break;
172094332d3Sopenharmony_ci        }
173094332d3Sopenharmony_ci        default: {
174094332d3Sopenharmony_ci            CAMERA_LOGW("The interfaces is not tested, the cmd is:%{public}u", cmd);
175094332d3Sopenharmony_ci            return;
176094332d3Sopenharmony_ci        }
177094332d3Sopenharmony_ci    }
178094332d3Sopenharmony_ci}
179094332d3Sopenharmony_ci
180094332d3Sopenharmony_cibool DoSomethingInterestingWithMyApi(const uint8_t *rawData, size_t size)
181094332d3Sopenharmony_ci{
182094332d3Sopenharmony_ci    if (rawData == nullptr) {
183094332d3Sopenharmony_ci        return false;
184094332d3Sopenharmony_ci    }
185094332d3Sopenharmony_ci
186094332d3Sopenharmony_ci    uint32_t cmd = 0;
187094332d3Sopenharmony_ci    rawData += sizeof(cmd);
188094332d3Sopenharmony_ci
189094332d3Sopenharmony_ci    cameraTest = std::make_shared<OHOS::Camera::HdiCommonV1_3>();
190094332d3Sopenharmony_ci    cameraTest->Init();
191094332d3Sopenharmony_ci    if (cameraTest->serviceV1_3 == nullptr) {
192094332d3Sopenharmony_ci        return false;
193094332d3Sopenharmony_ci    }
194094332d3Sopenharmony_ci    cameraTest->Open(DEVICE_0);
195094332d3Sopenharmony_ci    if (cameraTest->cameraDeviceV1_3 == nullptr) {
196094332d3Sopenharmony_ci        return false;
197094332d3Sopenharmony_ci    }
198094332d3Sopenharmony_ci
199094332d3Sopenharmony_ci    for (cmd = 0; cmd < CAMERA_DEVICE_END; cmd++) {
200094332d3Sopenharmony_ci        DeviceFuncSwitch(cmd, rawData, size);
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci    cameraTest->Close();
203094332d3Sopenharmony_ci    return true;
204094332d3Sopenharmony_ci}
205094332d3Sopenharmony_ci
206094332d3Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
207094332d3Sopenharmony_ci{
208094332d3Sopenharmony_ci    if (size < THRESHOLD) {
209094332d3Sopenharmony_ci        CAMERA_LOGW("Fuzz test input is invalid. The size is smaller than %{public}zu", THRESHOLD);
210094332d3Sopenharmony_ci        return 0;
211094332d3Sopenharmony_ci    }
212094332d3Sopenharmony_ci
213094332d3Sopenharmony_ci    DoSomethingInterestingWithMyApi(data, size);
214094332d3Sopenharmony_ci    return 0;
215094332d3Sopenharmony_ci}
216094332d3Sopenharmony_ci} // namespace OHOS
217