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