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