1 /*
2 * Copyright (c) 2021-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 "camera_device_fuzzer.h"
17 #include "camera.h"
18 #include "v1_1/icamera_device.h"
19
20 namespace OHOS {
21 const size_t RAW_DATA_SIZE_MAX = 256;
22 const size_t THRESHOLD = 10;
23
24 enum DeviceCmdId {
25 CAMERA_DEVICE_GET_DEFAULT_SETTINGS,
26 CAMERA_DEVICE_GET_STREAM_V1_1,
27 CAMERA_DEVICE_UPDATE_SETTINGS,
28 CAMERA_DEVICE_SET_RESULT_MODE,
29 CAMERA_DEVICE_GET_ENABLED_RESULTS,
30 CAMERA_DEVICE_ENABLE_RESULT,
31 CAMERA_DEVICE_DISABLE_RESULT,
32 CAMERA_DEVICE_GET_STATUS,
33 CAMERA_DEVICE_GET_SECURECAMERASEQ,
34 CAMERA_DEVICE_END, // Enumerated statistical value. The new enumerated value is added before
35 };
36
FuncGetDefaultSettings(const uint8_t * rawData,size_t size)37 void FuncGetDefaultSettings(const uint8_t *rawData, size_t size)
38 {
39 if (size >= RAW_DATA_SIZE_MAX) {
40 return;
41 }
42 std::vector<uint8_t> abilityVec = {};
43 uint8_t *data = const_cast<uint8_t *>(rawData);
44 abilityVec.push_back(*data);
45 cameraTest->cameraDeviceV1_1->GetDefaultSettings(abilityVec);
46 }
47
FuncGetStreamOperator_V1_1(const uint8_t * rawData,size_t size)48 void FuncGetStreamOperator_V1_1(const uint8_t *rawData, size_t size)
49 {
50 (void)size;
51 sptr<HDI::Camera::V1_0::IStreamOperatorCallback> g_callback =
52 new OHOS::Camera::CameraManager::TestStreamOperatorCallback();
53 sptr<HDI::Camera::V1_1::IStreamOperator> g_StreamOperator = nullptr;
54 cameraTest->cameraDeviceV1_1->GetStreamOperator_V1_1(g_callback, g_StreamOperator);
55 }
56
FuncUpdateSettings(const uint8_t * rawData,size_t size)57 void FuncUpdateSettings(const uint8_t *rawData, size_t size)
58 {
59 if (size >= RAW_DATA_SIZE_MAX) {
60 return;
61 }
62 float *data = const_cast<float *>(reinterpret_cast<const float *>(rawData));
63 std::shared_ptr<Camera::CameraMetadata> meta = std::make_shared<Camera::CameraMetadata>(
64 cameraTest->itemCapacity, cameraTest->dataCapacity);
65 meta->addEntry(OHOS_CONTROL_ZOOM_RATIO, &data[0], cameraTest->dataCount);
66 std::vector<uint8_t> metaVec;
67 Camera::MetadataUtils::ConvertMetadataToVec(meta, metaVec);
68 cameraTest->cameraDeviceV1_1->UpdateSettings(metaVec);
69 }
70
FuncSetResultMode(const uint8_t * rawData,size_t size)71 void FuncSetResultMode(const uint8_t *rawData, size_t size)
72 {
73 (void)size;
74 cameraTest->cameraDeviceV1_1->SetResultMode(
75 *reinterpret_cast<const HDI::Camera::V1_0::ResultCallbackMode *>(rawData));
76 }
77
FuncGetEnabledResults(const uint8_t * rawData,size_t size)78 void FuncGetEnabledResults(const uint8_t *rawData, size_t size)
79 {
80 (void)size;
81 std::vector<int32_t> result = {};
82 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
83 result.push_back(*data);
84 cameraTest->cameraDeviceV1_1->GetEnabledResults(result);
85 }
86
FuncEnableResult(const uint8_t * rawData,size_t size)87 void FuncEnableResult(const uint8_t *rawData, size_t size)
88 {
89 (void)size;
90 std::vector<int32_t> result = {};
91 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
92 result.push_back(*data);
93 cameraTest->cameraDeviceV1_1->EnableResult(result);
94 }
95
FuncDisableResult(const uint8_t * rawData,size_t size)96 void FuncDisableResult(const uint8_t *rawData, size_t size)
97 {
98 (void)size;
99 std::vector<int32_t> result = {};
100 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
101 result.push_back(*data);
102 cameraTest->cameraDeviceV1_1->DisableResult(result);
103 }
104
FuncGetStatus(const uint8_t * rawData,size_t size)105 void FuncGetStatus(const uint8_t *rawData, size_t size)
106 {
107 (void)size;
108 std::vector<uint8_t> resultOut = {};
109 float *data = const_cast<float *>(reinterpret_cast<const float *>(rawData));
110 std::shared_ptr<Camera::CameraMetadata> meta = std::make_shared<Camera::CameraMetadata>(
111 cameraTest->itemCapacity, cameraTest->dataCapacity);
112 meta->addEntry(OHOS_CONTROL_ZOOM_RATIO, &data[0], cameraTest->dataCount);
113 std::vector<uint8_t> metaVec;
114 Camera::MetadataUtils::ConvertMetadataToVec(meta, metaVec);
115 if (nullptr == cameraTest->cameraDeviceV1_2) {
116 return;
117 }
118 cameraTest->cameraDeviceV1_2->GetStatus(metaVec, resultOut);
119 }
120
FuncGetSecureCameraSeq(const uint8_t * rawData,size_t size)121 void FuncGetSecureCameraSeq(const uint8_t *rawData, size_t size)
122 {
123 (void)size;
124 if (nullptr == cameraTest->cameraDeviceV1_3) {
125 return;
126 }
127 uint64_t SeqId;
128 // Output do not need fuzz
129 cameraTest->cameraDeviceV1_3->GetSecureCameraSeq(SeqId);
130 }
131
DeviceFuncSwitch(uint32_t cmd,const uint8_t * rawData,size_t size)132 static void DeviceFuncSwitch(uint32_t cmd, const uint8_t *rawData, size_t size)
133 {
134 CAMERA_LOGI("DeviceFuncSwitch start, the cmd is:%{public}u", cmd);
135 switch (cmd) {
136 case CAMERA_DEVICE_GET_DEFAULT_SETTINGS: {
137 FuncGetDefaultSettings(rawData, size);
138 break;
139 }
140 case CAMERA_DEVICE_GET_STREAM_V1_1: {
141 FuncGetStreamOperator_V1_1(rawData, size);
142 break;
143 }
144
145 case CAMERA_DEVICE_UPDATE_SETTINGS: {
146 FuncUpdateSettings(rawData, size);
147 break;
148 }
149 case CAMERA_DEVICE_SET_RESULT_MODE: {
150 FuncSetResultMode(rawData, size);
151 break;
152 }
153 case CAMERA_DEVICE_GET_ENABLED_RESULTS: {
154 FuncGetEnabledResults(rawData, size);
155 break;
156 }
157 case CAMERA_DEVICE_ENABLE_RESULT: {
158 FuncEnableResult(rawData, size);
159 break;
160 }
161 case CAMERA_DEVICE_DISABLE_RESULT: {
162 FuncDisableResult(rawData, size);
163 break;
164 }
165 case CAMERA_DEVICE_GET_STATUS: {
166 FuncGetStatus(rawData, size);
167 break;
168 }
169 case CAMERA_DEVICE_GET_SECURECAMERASEQ: {
170 FuncGetSecureCameraSeq(rawData, size);
171 break;
172 }
173 default: {
174 CAMERA_LOGW("The interfaces is not tested, the cmd is:%{public}u", cmd);
175 return;
176 }
177 }
178 }
179
DoSomethingInterestingWithMyApi(const uint8_t * rawData,size_t size)180 bool DoSomethingInterestingWithMyApi(const uint8_t *rawData, size_t size)
181 {
182 if (rawData == nullptr) {
183 return false;
184 }
185
186 uint32_t cmd = 0;
187 rawData += sizeof(cmd);
188
189 cameraTest = std::make_shared<OHOS::Camera::CameraManager>();
190 cameraTest->InitV1_3();
191 if (cameraTest->serviceV1_1 == nullptr) {
192 return false;
193 }
194 cameraTest->OpenV1_3();
195 if (cameraTest->cameraDeviceV1_1 == nullptr) {
196 return false;
197 }
198
199 for (cmd = 0; cmd < CAMERA_DEVICE_END; cmd++) {
200 DeviceFuncSwitch(cmd, rawData, size);
201 }
202 cameraTest->Close();
203 return true;
204 }
205
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)206 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
207 {
208 if (size < OHOS::THRESHOLD) {
209 CAMERA_LOGW("Fuzz test input is invalid. The size is smaller than %{public}zu", OHOS::THRESHOLD);
210 return 0;
211 }
212
213 OHOS::DoSomethingInterestingWithMyApi(data, size);
214 return 0;
215 }
216 } // namespace OHOS
217