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