1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#include <cstddef> 17da853ecaSopenharmony_ci#include <cstdint> 18da853ecaSopenharmony_ci#include "meta/meta.h" 19da853ecaSopenharmony_ci#include "common/native_mfmagic.h" 20da853ecaSopenharmony_ci#include "native_cencinfo.h" 21da853ecaSopenharmony_ci 22da853ecaSopenharmony_ci#define FUZZ_PROJECT_NAME "avcencinfo_fuzzer" 23da853ecaSopenharmony_ci 24da853ecaSopenharmony_ciusing namespace std; 25da853ecaSopenharmony_ciusing namespace OHOS::Media; 26da853ecaSopenharmony_ci 27da853ecaSopenharmony_ci#define AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cond, ret) \ 28da853ecaSopenharmony_ci do { \ 29da853ecaSopenharmony_ci if (!(cond)) { \ 30da853ecaSopenharmony_ci return ret; \ 31da853ecaSopenharmony_ci } \ 32da853ecaSopenharmony_ci } while (0) 33da853ecaSopenharmony_ci 34da853ecaSopenharmony_ci#define AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(cond, label) \ 35da853ecaSopenharmony_ci do { \ 36da853ecaSopenharmony_ci if (!(cond)) { \ 37da853ecaSopenharmony_ci goto label; \ 38da853ecaSopenharmony_ci } \ 39da853ecaSopenharmony_ci } while (0) 40da853ecaSopenharmony_ci 41da853ecaSopenharmony_cinamespace OHOS { 42da853ecaSopenharmony_cinamespace AvCencInfoFuzzer { 43da853ecaSopenharmony_ci 44da853ecaSopenharmony_cibool CencInfoCreateFuzzTest(const uint8_t *data, size_t size) 45da853ecaSopenharmony_ci{ 46da853ecaSopenharmony_ci (void)data; 47da853ecaSopenharmony_ci (void)size; 48da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 49da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 50da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 51da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 52da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 53da853ecaSopenharmony_ci return true; 54da853ecaSopenharmony_ci} 55da853ecaSopenharmony_ci 56da853ecaSopenharmony_cibool CencInfoDestroyFuzzTest(const uint8_t *data, size_t size) 57da853ecaSopenharmony_ci{ 58da853ecaSopenharmony_ci (void)data; 59da853ecaSopenharmony_ci (void)size; 60da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 61da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 62da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 63da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 64da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 65da853ecaSopenharmony_ci return true; 66da853ecaSopenharmony_ci} 67da853ecaSopenharmony_ci 68da853ecaSopenharmony_cibool CencInfoSetAlgorithm(void) 69da853ecaSopenharmony_ci{ 70da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 71da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 72da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 73da853ecaSopenharmony_ci 74da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_UNENCRYPTED); 75da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 76da853ecaSopenharmony_ci 77da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_AES_CTR); 78da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 79da853ecaSopenharmony_ci 80da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_AES_WV); 81da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 82da853ecaSopenharmony_ci 83da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_AES_CBC); 84da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 85da853ecaSopenharmony_ci 86da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_SM4_CBC); 87da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 88da853ecaSopenharmony_ci 89da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_SM4_CTR); 90da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 91da853ecaSopenharmony_ci 92da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, static_cast<enum DrmCencAlgorithm>(DRM_ALG_CENC_SM4_CTR + 1)); 93da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 94da853ecaSopenharmony_ci_EXIT: 95da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 96da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 97da853ecaSopenharmony_ci return true; 98da853ecaSopenharmony_ci} 99da853ecaSopenharmony_ci 100da853ecaSopenharmony_cibool CencInfoSetAlgorithmFuzzTest(const uint8_t *data, size_t size) 101da853ecaSopenharmony_ci{ 102da853ecaSopenharmony_ci (void)size; 103da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 104da853ecaSopenharmony_ci DrmCencAlgorithm algo = static_cast<enum DrmCencAlgorithm>(*data); 105da853ecaSopenharmony_ci static uint8_t cencInfoSetAlgorithmFuzzTestFlag = 0; 106da853ecaSopenharmony_ci if (cencInfoSetAlgorithmFuzzTestFlag == 0) { 107da853ecaSopenharmony_ci CencInfoSetAlgorithm(); 108da853ecaSopenharmony_ci cencInfoSetAlgorithmFuzzTestFlag = 1; 109da853ecaSopenharmony_ci } 110da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 111da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 112da853ecaSopenharmony_ci 113da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, algo); 114da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 115da853ecaSopenharmony_ci_EXIT: 116da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 117da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 118da853ecaSopenharmony_ci return true; 119da853ecaSopenharmony_ci} 120da853ecaSopenharmony_ci 121da853ecaSopenharmony_cibool CencInfoSetKeyIdAndIv(void) 122da853ecaSopenharmony_ci{ 123da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 124da853ecaSopenharmony_ci uint32_t keyIdLen = DRM_KEY_ID_SIZE; 125da853ecaSopenharmony_ci uint8_t keyId[] = { 126da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 127da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; 128da853ecaSopenharmony_ci uint32_t ivLen = DRM_KEY_IV_SIZE; 129da853ecaSopenharmony_ci uint8_t iv[] = { 130da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 131da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; 132da853ecaSopenharmony_ci 133da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 134da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 135da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetKeyIdAndIv(cencInfo, keyId, keyIdLen, iv, ivLen); 136da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 137da853ecaSopenharmony_ci_EXIT: 138da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 139da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 140da853ecaSopenharmony_ci return true; 141da853ecaSopenharmony_ci} 142da853ecaSopenharmony_ci 143da853ecaSopenharmony_cibool CencInfoSetKeyIdAndIvFuzzTest(const uint8_t *data, size_t size) 144da853ecaSopenharmony_ci{ 145da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 146da853ecaSopenharmony_ci static uint8_t cencInfoSetKeyIdAndIvFuzzTestFlag = 0; 147da853ecaSopenharmony_ci if (cencInfoSetKeyIdAndIvFuzzTestFlag == 0) { 148da853ecaSopenharmony_ci CencInfoSetKeyIdAndIv(); 149da853ecaSopenharmony_ci cencInfoSetKeyIdAndIvFuzzTestFlag = 1; 150da853ecaSopenharmony_ci } 151da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 152da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 153da853ecaSopenharmony_ci 154da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetKeyIdAndIv(cencInfo, const_cast<uint8_t *>(data), static_cast<uint32_t>(size), 155da853ecaSopenharmony_ci const_cast<uint8_t *>(data), static_cast<uint32_t>(size)); 156da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 157da853ecaSopenharmony_ci_EXIT: 158da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 159da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 160da853ecaSopenharmony_ci return true; 161da853ecaSopenharmony_ci} 162da853ecaSopenharmony_ci 163da853ecaSopenharmony_cibool CencInfoSetSubsampleInfo(void) 164da853ecaSopenharmony_ci{ 165da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 166da853ecaSopenharmony_ci uint32_t encryptedBlockCount = 0; 167da853ecaSopenharmony_ci uint32_t skippedBlockCount = 0; 168da853ecaSopenharmony_ci uint32_t firstEncryptedOffset = 0; 169da853ecaSopenharmony_ci uint32_t subsampleCount = 1; 170da853ecaSopenharmony_ci DrmSubsample subsamples[1] = { {0x10, 0x16} }; 171da853ecaSopenharmony_ci 172da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 173da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 174da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetSubsampleInfo(cencInfo, encryptedBlockCount, skippedBlockCount, firstEncryptedOffset, 175da853ecaSopenharmony_ci subsampleCount, subsamples); 176da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 177da853ecaSopenharmony_ci_EXIT: 178da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 179da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 180da853ecaSopenharmony_ci return true; 181da853ecaSopenharmony_ci} 182da853ecaSopenharmony_ci 183da853ecaSopenharmony_cibool CencInfoSetSubsampleInfoFuzzTest(const uint8_t *data, size_t size) 184da853ecaSopenharmony_ci{ 185da853ecaSopenharmony_ci (void)size; 186da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 187da853ecaSopenharmony_ci uint32_t encryptedBlockCount = static_cast<uint32_t>(*data); 188da853ecaSopenharmony_ci uint32_t skippedBlockCount = static_cast<uint32_t>(*data); 189da853ecaSopenharmony_ci uint32_t firstEncryptedOffset = static_cast<uint32_t>(*data); 190da853ecaSopenharmony_ci uint32_t subsampleCount = static_cast<uint32_t>(*data); 191da853ecaSopenharmony_ci DrmSubsample subsamples[DRM_KEY_MAX_SUB_SAMPLE_NUM]; 192da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(subsampleCount <= DRM_KEY_MAX_SUB_SAMPLE_NUM, false); 193da853ecaSopenharmony_ci for (uint32_t i = 0; i < subsampleCount; i++) { 194da853ecaSopenharmony_ci subsamples[i].clearHeaderLen = static_cast<uint32_t>(*data); 195da853ecaSopenharmony_ci subsamples[i].payLoadLen = static_cast<uint32_t>(*data); 196da853ecaSopenharmony_ci } 197da853ecaSopenharmony_ci static uint8_t cencInfoSetSubsampleInfoFuzzTestFlag = 0; 198da853ecaSopenharmony_ci if (cencInfoSetSubsampleInfoFuzzTestFlag == 0) { 199da853ecaSopenharmony_ci CencInfoSetSubsampleInfo(); 200da853ecaSopenharmony_ci cencInfoSetSubsampleInfoFuzzTestFlag = 1; 201da853ecaSopenharmony_ci } 202da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 203da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 204da853ecaSopenharmony_ci 205da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetSubsampleInfo(cencInfo, encryptedBlockCount, skippedBlockCount, firstEncryptedOffset, 206da853ecaSopenharmony_ci subsampleCount, subsamples); 207da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 208da853ecaSopenharmony_ci_EXIT: 209da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 210da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 211da853ecaSopenharmony_ci return true; 212da853ecaSopenharmony_ci} 213da853ecaSopenharmony_ci 214da853ecaSopenharmony_cibool CencInfoSetMode(void) 215da853ecaSopenharmony_ci{ 216da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 217da853ecaSopenharmony_ci 218da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 219da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 220da853ecaSopenharmony_ci 221da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET); 222da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 223da853ecaSopenharmony_ci 224da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET); 225da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 226da853ecaSopenharmony_ci 227da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, 228da853ecaSopenharmony_ci static_cast<enum DrmCencInfoMode>(DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET + 1)); 229da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 230da853ecaSopenharmony_ci_EXIT: 231da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 232da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 233da853ecaSopenharmony_ci return true; 234da853ecaSopenharmony_ci} 235da853ecaSopenharmony_ci 236da853ecaSopenharmony_cibool CencInfoSetModeFuzzTest(const uint8_t *data, size_t size) 237da853ecaSopenharmony_ci{ 238da853ecaSopenharmony_ci (void)size; 239da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 240da853ecaSopenharmony_ci DrmCencInfoMode mode = static_cast<enum DrmCencInfoMode>(*data); 241da853ecaSopenharmony_ci static uint8_t cencInfoSetModeFuzzTestFlag = 0; 242da853ecaSopenharmony_ci if (cencInfoSetModeFuzzTestFlag == 0) { 243da853ecaSopenharmony_ci CencInfoSetMode(); 244da853ecaSopenharmony_ci cencInfoSetModeFuzzTestFlag = 1; 245da853ecaSopenharmony_ci } 246da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 247da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(cencInfo != nullptr, false); 248da853ecaSopenharmony_ci 249da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, mode); 250da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 251da853ecaSopenharmony_ci_EXIT: 252da853ecaSopenharmony_ci errNo = OH_AVCencInfo_Destroy(cencInfo); 253da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(errNo == AV_ERR_OK, false); 254da853ecaSopenharmony_ci return true; 255da853ecaSopenharmony_ci} 256da853ecaSopenharmony_ci 257da853ecaSopenharmony_cibool CencInfoSetAVBuffer(void) 258da853ecaSopenharmony_ci{ 259da853ecaSopenharmony_ci uint32_t keyIdLen = DRM_KEY_ID_SIZE; 260da853ecaSopenharmony_ci uint8_t keyId[] = { 261da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 262da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; 263da853ecaSopenharmony_ci uint32_t ivLen = DRM_KEY_IV_SIZE; 264da853ecaSopenharmony_ci uint8_t iv[] = { 265da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 266da853ecaSopenharmony_ci 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; 267da853ecaSopenharmony_ci uint32_t encryptedBlockCount = 0; 268da853ecaSopenharmony_ci uint32_t skippedBlockCount = 0; 269da853ecaSopenharmony_ci uint32_t firstEncryptedOffset = 0; 270da853ecaSopenharmony_ci uint32_t subsampleCount = 1; 271da853ecaSopenharmony_ci DrmSubsample subsamples[1] = { {0x10, 0x16} }; 272da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 273da853ecaSopenharmony_ci MemoryFlag memFlag = MEMORY_READ_WRITE; 274da853ecaSopenharmony_ci 275da853ecaSopenharmony_ci std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag); 276da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false); 277da853ecaSopenharmony_ci 278da853ecaSopenharmony_ci std::shared_ptr<AVBuffer> inBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(DRM_KEY_ID_SIZE)); 279da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf != nullptr, false); 280da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf->memory_ != nullptr, false); 281da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf->memory_->GetCapacity() == DRM_KEY_ID_SIZE, false); 282da853ecaSopenharmony_ci 283da853ecaSopenharmony_ci struct OH_AVBuffer *buffer = new (std::nothrow) OH_AVBuffer(inBuf); 284da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(buffer != nullptr, false); 285da853ecaSopenharmony_ci 286da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 287da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(cencInfo != nullptr, _EXIT1); 288da853ecaSopenharmony_ci 289da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, DRM_ALG_CENC_AES_CTR); 290da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 291da853ecaSopenharmony_ci 292da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetKeyIdAndIv(cencInfo, keyId, keyIdLen, iv, ivLen); 293da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 294da853ecaSopenharmony_ci 295da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetSubsampleInfo(cencInfo, encryptedBlockCount, skippedBlockCount, firstEncryptedOffset, 296da853ecaSopenharmony_ci subsampleCount, subsamples); 297da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 298da853ecaSopenharmony_ci 299da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET); 300da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 301da853ecaSopenharmony_ci 302da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAVBuffer(cencInfo, buffer); 303da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 304da853ecaSopenharmony_ci_EXIT: 305da853ecaSopenharmony_ci (void)OH_AVCencInfo_Destroy(cencInfo); 306da853ecaSopenharmony_ci_EXIT1: 307da853ecaSopenharmony_ci delete buffer; 308da853ecaSopenharmony_ci return true; 309da853ecaSopenharmony_ci} 310da853ecaSopenharmony_ci 311da853ecaSopenharmony_cibool CencInfoSetAVBufferFuzzTest(const uint8_t *data, size_t size) 312da853ecaSopenharmony_ci{ 313da853ecaSopenharmony_ci OH_AVErrCode errNo = AV_ERR_OK; 314da853ecaSopenharmony_ci MemoryFlag memFlag = MEMORY_READ_WRITE; 315da853ecaSopenharmony_ci DrmCencAlgorithm algo = static_cast<enum DrmCencAlgorithm>(*data); 316da853ecaSopenharmony_ci DrmCencInfoMode mode = static_cast<enum DrmCencInfoMode>(*data); 317da853ecaSopenharmony_ci uint32_t encryptedBlockCount = static_cast<uint32_t>(*data); 318da853ecaSopenharmony_ci uint32_t skippedBlockCount = static_cast<uint32_t>(*data); 319da853ecaSopenharmony_ci uint32_t firstEncryptedOffset = static_cast<uint32_t>(*data); 320da853ecaSopenharmony_ci uint32_t subsampleCount = static_cast<uint32_t>(*data); 321da853ecaSopenharmony_ci DrmSubsample subsamples[DRM_KEY_MAX_SUB_SAMPLE_NUM]; 322da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(subsampleCount <= DRM_KEY_MAX_SUB_SAMPLE_NUM, false); 323da853ecaSopenharmony_ci for (uint32_t i = 0; i < subsampleCount; i++) { 324da853ecaSopenharmony_ci subsamples[i].clearHeaderLen = static_cast<uint32_t>(*data); 325da853ecaSopenharmony_ci subsamples[i].payLoadLen = static_cast<uint32_t>(*data); 326da853ecaSopenharmony_ci } 327da853ecaSopenharmony_ci static uint8_t cencInfoSetAVBufferFuzzTestFlag = 0; 328da853ecaSopenharmony_ci if (cencInfoSetAVBufferFuzzTestFlag == 0) { 329da853ecaSopenharmony_ci CencInfoSetAVBuffer(); 330da853ecaSopenharmony_ci cencInfoSetAVBufferFuzzTestFlag = 1; 331da853ecaSopenharmony_ci } 332da853ecaSopenharmony_ci 333da853ecaSopenharmony_ci std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag); 334da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false); 335da853ecaSopenharmony_ci 336da853ecaSopenharmony_ci std::shared_ptr<AVBuffer> inBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(DRM_KEY_ID_SIZE)); 337da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf != nullptr, false); 338da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf->memory_ != nullptr, false); 339da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(inBuf->memory_->GetCapacity() == DRM_KEY_ID_SIZE, false); 340da853ecaSopenharmony_ci 341da853ecaSopenharmony_ci struct OH_AVBuffer *buffer = new (std::nothrow) OH_AVBuffer(inBuf); 342da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_RETURN_RET(buffer != nullptr, false); 343da853ecaSopenharmony_ci 344da853ecaSopenharmony_ci OH_AVCencInfo *cencInfo = OH_AVCencInfo_Create(); 345da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(cencInfo != nullptr, _EXIT1); 346da853ecaSopenharmony_ci 347da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAlgorithm(cencInfo, algo); 348da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 349da853ecaSopenharmony_ci 350da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetKeyIdAndIv(cencInfo, const_cast<uint8_t *>(data), static_cast<uint32_t>(size), 351da853ecaSopenharmony_ci const_cast<uint8_t *>(data), static_cast<uint32_t>(size)); 352da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 353da853ecaSopenharmony_ci 354da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetSubsampleInfo(cencInfo, encryptedBlockCount, skippedBlockCount, firstEncryptedOffset, 355da853ecaSopenharmony_ci subsampleCount, subsamples); 356da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 357da853ecaSopenharmony_ci 358da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetMode(cencInfo, mode); 359da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 360da853ecaSopenharmony_ci 361da853ecaSopenharmony_ci errNo = OH_AVCencInfo_SetAVBuffer(cencInfo, buffer); 362da853ecaSopenharmony_ci AV_CENC_INFO_FUZZ_CHECK_AND_GOTO(errNo == AV_ERR_OK, _EXIT); 363da853ecaSopenharmony_ci_EXIT: 364da853ecaSopenharmony_ci (void)OH_AVCencInfo_Destroy(cencInfo); 365da853ecaSopenharmony_ci_EXIT1: 366da853ecaSopenharmony_ci delete buffer; 367da853ecaSopenharmony_ci return true; 368da853ecaSopenharmony_ci} 369da853ecaSopenharmony_ci 370da853ecaSopenharmony_ci} // namespace AvCencInfoFuzzer 371da853ecaSopenharmony_ci} // namespace OHOS 372da853ecaSopenharmony_ci 373da853ecaSopenharmony_ci/* Fuzzer entry point */ 374da853ecaSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 375da853ecaSopenharmony_ci{ 376da853ecaSopenharmony_ci /* Run your code on data */ 377da853ecaSopenharmony_ci if (data == nullptr) { 378da853ecaSopenharmony_ci return 0; 379da853ecaSopenharmony_ci } 380da853ecaSopenharmony_ci if (size < sizeof(int64_t)) { 381da853ecaSopenharmony_ci return 0; 382da853ecaSopenharmony_ci } 383da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoCreateFuzzTest(data, size); 384da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoDestroyFuzzTest(data, size); 385da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoSetAlgorithmFuzzTest(data, size); 386da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoSetKeyIdAndIvFuzzTest(data, size); 387da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoSetSubsampleInfoFuzzTest(data, size); 388da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoSetModeFuzzTest(data, size); 389da853ecaSopenharmony_ci OHOS::AvCencInfoFuzzer::CencInfoSetAVBufferFuzzTest(data, size); 390da853ecaSopenharmony_ci return 0; 391da853ecaSopenharmony_ci} 392