• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 <cstddef>
17 #include <cstdint>
18 #include "codec_drm_decrypt.h"
19 #include "securec.h"
20 #ifdef SUPPORT_DRM
21 #include "i_keysession_service.h"
22 #endif
23 
24 #define FUZZ_PROJECT_NAME "drmdecryptor_fuzzer"
25 
26 using namespace std;
27 using namespace OHOS::MediaAVCodec;
28 using namespace OHOS::Media;
29 
30 #define DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(cond, ret)                  \
31     do {                                                                    \
32         if (!(cond)) {                                                      \
33             return ret;                                                     \
34         }                                                                   \
35     } while (0)
36 
37 namespace {
38 const uint32_t KEY_ID_LEN = 16;
39 const uint32_t IV_LEN = 16;
40 
41 // for H264
42 const uint8_t DRM_H264_KEY_ID[] = {
43     0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53,
44     0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x37};
45 const uint8_t DRM_H264_IV[] = {
46     0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53,
47     0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x37};
48 uint32_t DRM_H264_ENCRYPTED_BUFFER_SIZE = 418;
49 const uint8_t DRM_H264_SM4C_ENCRYPTED_BUFFER[] = {
50     0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1f, 0xac, 0xd3,
51     0x01, 0xe0, 0x08, 0x9f, 0x97, 0x01, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03,
52     0xce, 0x64, 0x00, 0x01, 0x31, 0x2d, 0x00, 0x00, 0x2f, 0xaf, 0x0a, 0x27, 0x28, 0x07, 0x8c, 0x18,
53     0x9c, 0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0xac, 0xb2, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x05,
54     0x98, 0xb8, 0x00, 0xaf, 0xd4, 0x80, 0x00, 0x00, 0x01, 0x06, 0x05, 0x26, 0xdc, 0x45, 0xe9, 0xbd,
55     0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x73, 0x75, 0x6d, 0x61,
56     0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2c, 0x76, 0x32, 0x30, 0x31, 0x36, 0x20, 0x2d, 0x31, 0x34,
57     0x38, 0x00, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x01, 0x06,
58     0x05, 0xc8, 0x70, 0xc1, 0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69,
59     0x4b, 0x66, 0xf0, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
60     0x5f, 0x30, 0x37, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
61     0x5f, 0x30, 0x37, 0x10, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49,
62     0x44, 0x5f, 0x30, 0x37, 0xc0, 0x84, 0x43, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73,
63     0x68, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43,
64     0xdd, 0x3c, 0x6e, 0x72, 0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72,
65     0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f,
66     0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x43,
67     0x31, 0x7a, 0x62, 0x54, 0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c,
68     0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68,
69     0x65, 0x6d, 0x61, 0x22, 0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74,
70     0x73, 0x22, 0x3a, 0x22, 0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x34, 0x22, 0x7d, 0x80, 0x00, 0x00,
71     0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0xff, 0x9f, 0x97, 0x12, 0x77, 0x06, 0xff, 0x81, 0x48, 0xf0,
72     0x84, 0xc3, 0xfb, 0x35, 0x95, 0x4d, 0x40, 0x94, 0x6e, 0x1a, 0xd3, 0x6f, 0xb0, 0xc3, 0xae, 0x35,
73     0x01, 0x6f, 0x46, 0x26, 0xae, 0x2b, 0x46, 0x6b, 0x81, 0x9f, 0xc1, 0xf9, 0x46, 0x86, 0x5b, 0x62,
74     0xaa, 0x0d, 0x2a, 0x39, 0xc0, 0xae, 0x2d, 0x52, 0xef, 0x97, 0x6e, 0xd5, 0x78, 0xec, 0xa4, 0x25,
75     0xee, 0xa7, 0xa6, 0xae, 0xed, 0xf3, 0xe7, 0xdf, 0xef, 0xd8, 0x84, 0xb4, 0x45, 0xd4, 0xfb, 0x67,
76     0x8c, 0x6c}; //418
77 const uint8_t DRM_H264_SM4S_ENCRYPTED_BUFFER[] = {
78     0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1f, 0xac, 0xd3,
79     0x01, 0xe0, 0x08, 0x9f, 0x97, 0x01, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03,
80     0xce, 0x64, 0x00, 0x01, 0x31, 0x2d, 0x00, 0x00, 0x2f, 0xaf, 0x0a, 0x27, 0x28, 0x07, 0x8c, 0x18,
81     0x9c, 0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0xac, 0xb2, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x05,
82     0x98, 0xb8, 0x00, 0xaf, 0xd4, 0x80, 0x00, 0x00, 0x01, 0x06, 0x05, 0x26, 0xdc, 0x45, 0xe9, 0xbd,
83     0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x73, 0x75, 0x6d, 0x61,
84     0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2c, 0x76, 0x32, 0x30, 0x31, 0x36, 0x20, 0x2d, 0x31, 0x34,
85     0x38, 0x00, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x01, 0x06,
86     0x05, 0xc8, 0x70, 0xc1, 0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69,
87     0x4b, 0x66, 0xf0, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
88     0x5f, 0x30, 0x37, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
89     0x5f, 0x30, 0x37, 0x10, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49,
90     0x44, 0x5f, 0x30, 0x37, 0xc0, 0x84, 0x41, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73,
91     0x68, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43,
92     0xdd, 0x3c, 0x6e, 0x72, 0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72,
93     0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f,
94     0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x43,
95     0x31, 0x7a, 0x62, 0x54, 0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c,
96     0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68,
97     0x65, 0x6d, 0x61, 0x22, 0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74,
98     0x73, 0x22, 0x3a, 0x22, 0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x34, 0x22, 0x7d, 0x80, 0x00, 0x00,
99     0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0xff, 0x9f, 0x97, 0x12, 0x77, 0x06, 0xff, 0x81, 0x48, 0xf0,
100     0x84, 0xc3, 0xfb, 0x35, 0x95, 0x4d, 0x40, 0x94, 0x6e, 0x1a, 0xd3, 0x6f, 0xb0, 0xc3, 0xae, 0x35,
101     0x01, 0x6f, 0x46, 0x26, 0xae, 0x2b, 0x46, 0x6b, 0x81, 0x9f, 0xc1, 0xf9, 0x46, 0x86, 0x5b, 0x62,
102     0xaa, 0x0d, 0x2a, 0x39, 0xc0, 0xae, 0x2d, 0x52, 0xef, 0x97, 0x6e, 0xd5, 0x78, 0xec, 0xa4, 0x25,
103     0xee, 0xa7, 0xa6, 0xae, 0xed, 0xf3, 0xe7, 0xdf, 0xef, 0xd8, 0x84, 0xb4, 0x45, 0xd4, 0xfb, 0x67,
104     0x8c, 0x6c}; //418
105 const uint8_t DRM_H264_CBC1_ENCRYPTED_BUFFER[] = {
106     0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1f, 0xac, 0xd3,
107     0x01, 0xe0, 0x08, 0x9f, 0x97, 0x01, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03,
108     0xce, 0x64, 0x00, 0x01, 0x31, 0x2d, 0x00, 0x00, 0x2f, 0xaf, 0x0a, 0x27, 0x28, 0x07, 0x8c, 0x18,
109     0x9c, 0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0xac, 0xb2, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x05,
110     0x98, 0xb8, 0x00, 0xaf, 0xd4, 0x80, 0x00, 0x00, 0x01, 0x06, 0x05, 0x26, 0xdc, 0x45, 0xe9, 0xbd,
111     0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x73, 0x75, 0x6d, 0x61,
112     0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2c, 0x76, 0x32, 0x30, 0x31, 0x36, 0x20, 0x2d, 0x31, 0x34,
113     0x38, 0x00, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x01, 0x06,
114     0x05, 0xc8, 0x70, 0xc1, 0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69,
115     0x4b, 0x66, 0xf0, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
116     0x5f, 0x30, 0x37, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
117     0x5f, 0x30, 0x37, 0x10, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49,
118     0x44, 0x5f, 0x30, 0x37, 0xc0, 0x84, 0x45, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73,
119     0x68, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43,
120     0xdd, 0x3c, 0x6e, 0x72, 0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72,
121     0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f,
122     0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x43,
123     0x31, 0x7a, 0x62, 0x54, 0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c,
124     0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68,
125     0x65, 0x6d, 0x61, 0x22, 0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74,
126     0x73, 0x22, 0x3a, 0x22, 0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x34, 0x22, 0x7d, 0x80, 0x00, 0x00,
127     0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0xff, 0x9f, 0x97, 0x12, 0x77, 0x06, 0xff, 0x81, 0x48, 0xf0,
128     0x84, 0xc3, 0xfb, 0x35, 0x95, 0x4d, 0x40, 0x94, 0x6e, 0x1a, 0xd3, 0x6f, 0xb0, 0xc3, 0xae, 0x35,
129     0x01, 0x6f, 0x46, 0x26, 0xae, 0x2b, 0x46, 0x6b, 0x81, 0x9f, 0xc1, 0xf9, 0x46, 0x86, 0x5b, 0x62,
130     0xaa, 0x0d, 0x2a, 0x39, 0xc0, 0xae, 0x2d, 0x52, 0xef, 0x97, 0x6e, 0xd5, 0x78, 0xec, 0xa4, 0x25,
131     0xee, 0xa7, 0xa6, 0xae, 0xed, 0xf3, 0xe7, 0xdf, 0xef, 0xd8, 0x84, 0xb4, 0x45, 0xd4, 0xfb, 0x67,
132     0x8c, 0x6c}; //418
133 const uint8_t DRM_H264_CBCS_ENCRYPTED_BUFFER[] = {
134     0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1f, 0xac, 0xd3,
135     0x01, 0xe0, 0x08, 0x9f, 0x97, 0x01, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03,
136     0xce, 0x64, 0x00, 0x01, 0x31, 0x2d, 0x00, 0x00, 0x2f, 0xaf, 0x0a, 0x27, 0x28, 0x07, 0x8c, 0x18,
137     0x9c, 0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0xac, 0xb2, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x05,
138     0x98, 0xb8, 0x00, 0xaf, 0xd4, 0x80, 0x00, 0x00, 0x01, 0x06, 0x05, 0x26, 0xdc, 0x45, 0xe9, 0xbd,
139     0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x73, 0x75, 0x6d, 0x61,
140     0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2c, 0x76, 0x32, 0x30, 0x31, 0x36, 0x20, 0x2d, 0x31, 0x34,
141     0x38, 0x00, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x01, 0x06,
142     0x05, 0xc8, 0x70, 0xc1, 0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69,
143     0x4b, 0x66, 0xf0, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
144     0x5f, 0x30, 0x37, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
145     0x5f, 0x30, 0x37, 0x10, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49,
146     0x44, 0x5f, 0x30, 0x37, 0xc0, 0x84, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73,
147     0x68, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43,
148     0xdd, 0x3c, 0x6e, 0x72, 0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72,
149     0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f,
150     0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x43,
151     0x31, 0x7a, 0x62, 0x54, 0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c,
152     0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68,
153     0x65, 0x6d, 0x61, 0x22, 0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74,
154     0x73, 0x22, 0x3a, 0x22, 0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x34, 0x22, 0x7d, 0x80, 0x00, 0x00,
155     0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0xff, 0x9f, 0x97, 0x12, 0x77, 0x06, 0xff, 0x81, 0x48, 0xf0,
156     0x84, 0xc3, 0xfb, 0x35, 0x95, 0x4d, 0x40, 0x94, 0x6e, 0x1a, 0xd3, 0x6f, 0xb0, 0xc3, 0xae, 0x35,
157     0x01, 0x6f, 0x46, 0x26, 0xae, 0x2b, 0x46, 0x6b, 0x81, 0x9f, 0xc1, 0xf9, 0x46, 0x86, 0x5b, 0x62,
158     0xaa, 0x0d, 0x2a, 0x39, 0xc0, 0xae, 0x2d, 0x52, 0xef, 0x97, 0x6e, 0xd5, 0x78, 0xec, 0xa4, 0x25,
159     0xee, 0xa7, 0xa6, 0xae, 0xed, 0xf3, 0xe7, 0xdf, 0xef, 0xd8, 0x84, 0xb4, 0x45, 0xd4, 0xfb, 0x67,
160     0x8c, 0x6c}; //418
161 const uint8_t DRM_H264_NONE_ENCRYPTED_BUFFER[] = {
162     0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x1f, 0xac, 0xd3,
163     0x01, 0xe0, 0x08, 0x9f, 0x97, 0x01, 0x10, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03,
164     0xce, 0x64, 0x00, 0x01, 0x31, 0x2d, 0x00, 0x00, 0x2f, 0xaf, 0x0a, 0x27, 0x28, 0x07, 0x8c, 0x18,
165     0x9c, 0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0xac, 0xb2, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x05,
166     0x98, 0xb8, 0x00, 0xaf, 0xd4, 0x80, 0x00, 0x00, 0x01, 0x06, 0x05, 0x26, 0xdc, 0x45, 0xe9, 0xbd,
167     0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x73, 0x75, 0x6d, 0x61,
168     0x20, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2c, 0x76, 0x32, 0x30, 0x31, 0x36, 0x20, 0x2d, 0x31, 0x34,
169     0x38, 0x00, 0x80, 0x00, 0x00, 0x01, 0x06, 0x01, 0x02, 0x00, 0x0a, 0x80, 0x00, 0x00, 0x01, 0x06,
170     0x05, 0xc8, 0x70, 0xc1, 0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69,
171     0x4b, 0x66, 0xf0, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
172     0x5f, 0x30, 0x37, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44,
173     0x5f, 0x30, 0x37, 0x10, 0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49,
174     0x44, 0x5f, 0x30, 0x37, 0xc0, 0x84, 0x40, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73,
175     0x68, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43,
176     0xdd, 0x3c, 0x6e, 0x72, 0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72,
177     0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f,
178     0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x43,
179     0x31, 0x7a, 0x62, 0x54, 0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c,
180     0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68,
181     0x65, 0x6d, 0x61, 0x22, 0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74,
182     0x73, 0x22, 0x3a, 0x22, 0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x34, 0x22, 0x7d, 0x80, 0x00, 0x00,
183     0x00, 0x01, 0x65, 0x88, 0x84, 0x00, 0xff, 0x9f, 0x97, 0x12, 0x77, 0x06, 0xff, 0x81, 0x48, 0xf0,
184     0x84, 0xc3, 0xfb, 0x35, 0x95, 0x4d, 0x40, 0x94, 0x6e, 0x1a, 0xd3, 0x6f, 0xb0, 0xc3, 0xae, 0x35,
185     0x01, 0x6f, 0x46, 0x26, 0xae, 0x2b, 0x46, 0x6b, 0x81, 0x9f, 0xc1, 0xf9, 0x46, 0x86, 0x5b, 0x62,
186     0xaa, 0x0d, 0x2a, 0x39, 0xc0, 0xae, 0x2d, 0x52, 0xef, 0x97, 0x6e, 0xd5, 0x78, 0xec, 0xa4, 0x25,
187     0xee, 0xa7, 0xa6, 0xae, 0xed, 0xf3, 0xe7, 0xdf, 0xef, 0xd8, 0x84, 0xb4, 0x45, 0xd4, 0xfb, 0x67,
188     0x8c, 0x6c}; //418
189 
190 // for HEVC
191 const uint8_t DRM_HEVC_SM4C_KEY_ID[] = {
192     0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53,
193     0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x32};
194 const uint8_t DRM_HEVC_SM4C_IV[] = {
195     0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53,
196     0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x32};
197 uint32_t DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE = 351;
198 #ifdef SUPPORT_DRM
199 const uint8_t DRM_HEVC_SM4C_ENCRYPTED_BUFFER[] = {
200     0x00, 0x00, 0x00, 0x01, 0x46, 0x01, 0x50, 0x00, 0x00, 0x01, 0x4e, 0x01, 0x05, 0xc8, 0x70, 0xc1,
201     0xdb, 0x9f, 0x66, 0xae, 0x41, 0x27, 0xbf, 0xc0, 0xbb, 0x19, 0x81, 0x69, 0x4b, 0x66, 0xf0, 0x55,
202     0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x32, 0x55,
203     0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x32, 0x10,
204     0x55, 0x44, 0x52, 0x4d, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x49, 0x44, 0x5f, 0x30, 0x32,
205     0xc0, 0x84, 0x33, 0x00, 0x00, 0x03, 0x00, 0x00, 0x82, 0x70, 0x73, 0x73, 0x68, 0x00, 0x00, 0x03,
206     0x00, 0x00, 0x3d, 0x5e, 0x6d, 0x35, 0x9b, 0x9a, 0x41, 0xe8, 0xb8, 0x43, 0xdd, 0x3c, 0x6e, 0x72,
207     0xc4, 0x2c, 0x00, 0x00, 0x03, 0x00, 0x62, 0x7b, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
208     0x22, 0x3a, 0x22, 0x56, 0x31, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
209     0x74, 0x49, 0x44, 0x22, 0x3a, 0x22, 0x61, 0x44, 0x49, 0x32, 0x4e, 0x53, 0x31, 0x7a, 0x62, 0x54,
210     0x52, 0x6a, 0x4c, 0x58, 0x52, 0x7a, 0x4c, 0x54, 0x41, 0x3d, 0x22, 0x2c, 0x22, 0x6b, 0x69, 0x64,
211     0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x65, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22,
212     0x3a, 0x22, 0x73, 0x6d, 0x34, 0x63, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x74, 0x73, 0x22, 0x3a, 0x22,
213     0x74, 0x73, 0x2f, 0x68, 0x32, 0x36, 0x35, 0x22, 0x7d, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
214     0xe0, 0x24, 0xbe, 0x08, 0x32, 0x96, 0x00, 0x00, 0x03, 0x02, 0x85, 0xda, 0x3c, 0xd7, 0x82, 0x78,
215     0x1e, 0xb7, 0x2e, 0xad, 0x4c, 0x59, 0xb2, 0x2b, 0x72, 0x1f, 0xbe, 0xff, 0x1e, 0xbe, 0xf3, 0x1d,
216     0xab, 0x9c, 0x2a, 0x50, 0xfd, 0xdd, 0x3c, 0x00, 0xe9, 0xd6, 0xa3, 0x04, 0x0a, 0x7e, 0x9a, 0x02,
217     0x7f, 0x3e, 0x3c, 0x00, 0x2c, 0xf7, 0x86, 0xe4, 0x03, 0x5b, 0x6d, 0xe5, 0xfe, 0x5c, 0xe7, 0x88,
218     0x6d, 0x44, 0x67, 0x16, 0x38, 0x95, 0x02, 0x3a, 0x34, 0x31, 0x63, 0x0e, 0x9c, 0xe0, 0xe3, 0x70,
219     0xcb, 0xc3, 0x4c, 0x5d, 0x21, 0xaa, 0x9e, 0x0d, 0x45, 0x38, 0x56, 0xb9, 0xc9, 0x2b, 0xf7, 0xf5,
220     0xe1, 0xd9, 0x13, 0xa0, 0x46, 0xc3, 0xe8, 0x16, 0xe0, 0x78, 0x75, 0xe8, 0x69, 0x5d, 0xc1, 0xe3,
221     0x1d, 0xaa, 0x8c, 0xf4, 0x59, 0x75, 0xc2, 0xe1, 0x36, 0x98, 0x4f, 0x83, 0x2e, 0x87, 0x51}; // 351
222 #endif
223 
224 // for AVS
225 const uint8_t DRM_AVS_SM4C_KEY_ID[] = {
226     0xd4, 0xb2, 0x01, 0xe4, 0x61, 0xc8, 0x98, 0x96,
227     0xcf, 0x05, 0x22, 0x39, 0x8d, 0x09, 0xe6, 0x28 };
228 const uint8_t DRM_AVS_SM4C_IV[] = {
229     0xbf, 0x77, 0xed, 0x51, 0x81, 0xde, 0x36, 0x3e,
230     0x52, 0xf7, 0x20, 0x4f, 0x72, 0x14, 0xa3, 0x95};
231 uint32_t DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE = 238;
232 #ifdef SUPPORT_DRM
233 const uint8_t DRM_AVS_SM4C_ENCRYPTED_BUFFER[] = {
234     0x00, 0x00, 0x01, 0xB5, 0xDF, 0x80, 0xD4, 0xB2, 0x01, 0xE4, 0x61, 0xC8, 0x98, 0x96, 0xCF, 0x05,
235     0x22, 0x39, 0x8D, 0x09, 0xE6, 0x28, 0x10, 0xBF, 0x77, 0xED, 0x51, 0x81, 0xDE, 0x36, 0x3E, 0x52,
236     0xF7, 0x20, 0x4F, 0x72, 0x14, 0xA3, 0x95, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xce,
237     0x14, 0x92, 0x10, 0x20, 0x82, 0xb5, 0xc0, 0x5e, 0x7b, 0xb4, 0x5a, 0x00, 0x00, 0x01, 0x00, 0xf6,
238     0x41, 0x55, 0xf7, 0x4f, 0xbb, 0x05, 0x15, 0xec, 0x11, 0xba, 0x98, 0x92, 0xdc, 0x21, 0x72, 0x75,
239     0x52, 0xfd, 0x9b, 0xff, 0x6c, 0x13, 0x75, 0x32, 0x11, 0x9a, 0x1c, 0xd4, 0xac, 0x58, 0x2c, 0x9a,
240     0x27, 0x4a, 0xab, 0x5c, 0x5b, 0x5e, 0xe1, 0xe8, 0xb9, 0x80, 0x9b, 0x0c, 0x63, 0xd8, 0xd1, 0xd8,
241     0xee, 0x8f, 0xce, 0x56, 0x14, 0xb2, 0xad, 0x30, 0x56, 0x7a, 0x22, 0x72, 0x85, 0x21, 0x1e, 0x47,
242     0x75, 0xd1, 0x30, 0xb1, 0x74, 0x5c, 0x0d, 0x75, 0xc4, 0x33, 0xcb, 0xfa, 0x14, 0x2d, 0x36, 0x32,
243     0x30, 0xd2, 0x2e, 0x9b, 0xc7, 0xd1, 0x5d, 0x3e, 0xd5, 0xaf, 0xed, 0x52, 0xbb, 0xa3, 0x73, 0xe7,
244     0x32, 0xfa, 0x4c, 0x5b, 0x4e, 0x73, 0xbd, 0x75, 0x94, 0x4a, 0x12, 0xfd, 0x73, 0x58, 0x95, 0x0c,
245     0x50, 0x6b, 0x91, 0xd7, 0x60, 0x52, 0xed, 0xb4, 0x33, 0xea, 0xee, 0x48, 0xbe, 0xde, 0x22, 0xe4,
246     0xa6, 0x48, 0xb8, 0xd5, 0xf7, 0x90, 0x1b, 0x2e, 0xbe, 0x69, 0xad, 0x86, 0xe9, 0x88, 0x23, 0x70,
247     0x31, 0x61, 0x5d, 0xe7, 0x60, 0x75, 0x27, 0x29, 0x5e, 0xf5, 0xe5, 0x86, 0x76, 0xb8, 0x42, 0x63,
248     0x42, 0x84, 0xbb, 0xb4, 0x48, 0x6c, 0x39, 0xc0, 0x40, 0x80, 0x00, 0x00, 0x01, 0x8f}; // 238
249 #endif
250 
251 // for Audio
252 const uint8_t DRM_AUDIO_KEY_ID[] = {
253     0xf3, 0xc5, 0xe0, 0x36, 0x1e, 0x66, 0x54, 0xb2,
254     0x8f, 0x80, 0x49, 0xc7, 0x78, 0xb2, 0x39, 0x46};
255 const uint8_t DRM_AUDIO_IV[] = {
256     0xa4, 0x63, 0x1a, 0x15, 0x3a, 0x44, 0x3d, 0xf9,
257     0xee, 0xd0, 0x59, 0x30, 0x43, 0xdb, 0x75, 0x19};
258 uint32_t DRM_AUDIO_ENCRYPTED_BUFFER_SIZE = 65;
259 const uint8_t DRM_AUDIO_ENCRYPTED_BUFFER[] = {
260     0x41, 0x55, 0xf7, 0x4f, 0xbb, 0x05, 0x15, 0xec, 0x11, 0xba, 0x98, 0x92, 0xdc, 0x21, 0x72, 0x75,
261     0x52, 0xfd, 0x9b, 0xff, 0x6c, 0x13, 0x75, 0x32, 0x11, 0x9a, 0x1c, 0xd4, 0xac, 0x58, 0x2c, 0x9a,
262     0x27, 0x4a, 0xab, 0x5c, 0x5b, 0x5e, 0xe1, 0xe8, 0xb9, 0x80, 0x9b, 0x0c, 0x63, 0xd8, 0xd1, 0xd8,
263     0xee, 0x8f, 0xce, 0x56, 0x14, 0xb2, 0xad, 0x30, 0x56, 0x7a, 0x22, 0x72, 0x85, 0x21, 0x1e, 0x47,
264     0x75}; // 65
265 }
266 
267 namespace OHOS {
268 namespace DrmDecryptorFuzzer {
269 
CreateH264MediaCencInfo(MetaDrmCencInfo & cencInfo)270 void CreateH264MediaCencInfo(MetaDrmCencInfo &cencInfo)
271 {
272     cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC;
273     memcpy_s(cencInfo.keyId, sizeof(cencInfo.keyId), DRM_H264_KEY_ID, sizeof(cencInfo.keyId));
274     cencInfo.keyIdLen = KEY_ID_LEN;
275     memcpy_s(cencInfo.iv, sizeof(cencInfo.iv), DRM_H264_IV, sizeof(cencInfo.iv));
276     cencInfo.ivLen = IV_LEN;
277     cencInfo.encryptBlocks = 0;
278     cencInfo.skipBlocks = 0;
279     cencInfo.firstEncryptOffset = 0;
280     cencInfo.subSampleNum = 1;
281     cencInfo.mode = MetaDrmCencInfoMode::META_DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET;
282 
283     cencInfo.subSamples[0].clearHeaderLen = DRM_H264_ENCRYPTED_BUFFER_SIZE;
284     cencInfo.subSamples[0].payLoadLen = 0;
285 }
286 
SetH264MediaData(std::shared_ptr<AVBuffer> drmInBuf,MetaDrmCencInfo & cencInfo,uint32_t mode)287 bool SetH264MediaData(std::shared_ptr<AVBuffer> drmInBuf, MetaDrmCencInfo &cencInfo, uint32_t mode)
288 {
289     int32_t drmRes = 0;
290     switch (mode) {
291         case 0x1: // 0x1:SM4-SAMPL SM4S
292             cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC;
293             drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_H264_ENCRYPTED_BUFFER_SIZE,
294                 DRM_H264_SM4S_ENCRYPTED_BUFFER, DRM_H264_ENCRYPTED_BUFFER_SIZE);
295             break;
296         case 0x2: // 0x2:AES CBCS
297             cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_AES_CBC;
298             drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_H264_ENCRYPTED_BUFFER_SIZE,
299                 DRM_H264_CBCS_ENCRYPTED_BUFFER, DRM_H264_ENCRYPTED_BUFFER_SIZE);
300             break;
301         case 0x5: // 0x5:AES CBC1
302             cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_AES_CBC;
303             drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_H264_ENCRYPTED_BUFFER_SIZE,
304                 DRM_H264_CBC1_ENCRYPTED_BUFFER, DRM_H264_ENCRYPTED_BUFFER_SIZE);
305             break;
306         case 0x3: // 0x3:SM4-CBC SM4C
307             cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC;
308             drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_H264_ENCRYPTED_BUFFER_SIZE,
309                 DRM_H264_SM4C_ENCRYPTED_BUFFER, DRM_H264_ENCRYPTED_BUFFER_SIZE);
310             break;
311         case 0x0: // 0x0:NONE
312             cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_UNENCRYPTED;
313             drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_H264_ENCRYPTED_BUFFER_SIZE,
314                 DRM_H264_NONE_ENCRYPTED_BUFFER, DRM_H264_ENCRYPTED_BUFFER_SIZE);
315             break;
316         default:
317             break;
318     }
319     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
320     return true;
321 }
322 
H264MediaCencDecrypt(std::shared_ptr<AVBuffer> drmInBuf,std::shared_ptr<AVBuffer> drmOutBuf,std::shared_ptr<CodecDrmDecrypt> decryptor,uint32_t mode,int32_t flag)323 void H264MediaCencDecrypt(std::shared_ptr<AVBuffer> drmInBuf, std::shared_ptr<AVBuffer> drmOutBuf,
324     std::shared_ptr<CodecDrmDecrypt> decryptor, uint32_t mode, int32_t flag)
325 {
326     MetaDrmCencInfo cencInfo;
327     CreateH264MediaCencInfo(cencInfo);
328     SetH264MediaData(drmInBuf, cencInfo, mode);
329     if (flag == 1) {
330         std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
331             (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
332         drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
333     }
334     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, DRM_H264_ENCRYPTED_BUFFER_SIZE);
335 }
336 
CreateHevcMediaCencInfo(MetaDrmCencInfo & cencInfo)337 void CreateHevcMediaCencInfo(MetaDrmCencInfo &cencInfo)
338 {
339     cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC;
340     memcpy_s(cencInfo.keyId, sizeof(cencInfo.keyId), DRM_HEVC_SM4C_KEY_ID, sizeof(cencInfo.keyId));
341     cencInfo.keyIdLen = KEY_ID_LEN;
342     memcpy_s(cencInfo.iv, sizeof(cencInfo.iv), DRM_HEVC_SM4C_IV, sizeof(cencInfo.iv));
343     cencInfo.ivLen = IV_LEN;
344     cencInfo.encryptBlocks = 0;
345     cencInfo.skipBlocks = 0;
346     cencInfo.firstEncryptOffset = 0;
347     cencInfo.subSampleNum = 1;
348     cencInfo.mode = MetaDrmCencInfoMode::META_DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET;
349 
350     cencInfo.subSamples[0].clearHeaderLen = DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE;
351     cencInfo.subSamples[0].payLoadLen = 0;
352 }
353 
CreateAvsMediaCencInfo(MetaDrmCencInfo & cencInfo)354 void CreateAvsMediaCencInfo(MetaDrmCencInfo &cencInfo)
355 {
356     cencInfo.algo = MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC;
357     memcpy_s(cencInfo.keyId, sizeof(cencInfo.keyId), DRM_AVS_SM4C_KEY_ID, sizeof(cencInfo.keyId));
358     cencInfo.keyIdLen = KEY_ID_LEN;
359     memcpy_s(cencInfo.iv, sizeof(cencInfo.iv), DRM_AVS_SM4C_IV, sizeof(cencInfo.iv));
360     cencInfo.ivLen = IV_LEN;
361     cencInfo.encryptBlocks = 0;
362     cencInfo.skipBlocks = 0;
363     cencInfo.firstEncryptOffset = 0;
364     cencInfo.subSampleNum = 1;
365     cencInfo.mode = MetaDrmCencInfoMode::META_DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET;
366 
367     cencInfo.subSamples[0].clearHeaderLen = DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE;
368     cencInfo.subSamples[0].payLoadLen = 0;
369 }
370 
CreateAudioCencInfo(MetaDrmCencInfo & cencInfo,MetaDrmCencAlgorithm algo)371 void CreateAudioCencInfo(MetaDrmCencInfo &cencInfo, MetaDrmCencAlgorithm algo)
372 {
373     cencInfo.algo = algo;
374     memcpy_s(cencInfo.keyId, sizeof(cencInfo.keyId), DRM_AUDIO_KEY_ID, sizeof(cencInfo.keyId));
375     cencInfo.keyIdLen = KEY_ID_LEN;
376     memcpy_s(cencInfo.iv, sizeof(cencInfo.iv), DRM_AUDIO_IV, sizeof(cencInfo.iv));
377     cencInfo.ivLen = IV_LEN;
378     cencInfo.encryptBlocks = 0;
379     cencInfo.skipBlocks = 0;
380     cencInfo.firstEncryptOffset = 0;
381     cencInfo.subSampleNum = 0;
382     cencInfo.mode = MetaDrmCencInfoMode::META_DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET;
383 }
384 
AudioCencDecrypt(std::shared_ptr<AVBuffer> drmInBuf,std::shared_ptr<AVBuffer> drmOutBuf,std::shared_ptr<CodecDrmDecrypt> decryptor,MetaDrmCencAlgorithm algo,int32_t flag)385 bool AudioCencDecrypt(std::shared_ptr<AVBuffer> drmInBuf, std::shared_ptr<AVBuffer> drmOutBuf,
386     std::shared_ptr<CodecDrmDecrypt> decryptor, MetaDrmCencAlgorithm algo, int32_t flag)
387 {
388     MetaDrmCencInfo cencInfo;
389     CreateAudioCencInfo(cencInfo, algo);
390 
391     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_AUDIO_ENCRYPTED_BUFFER_SIZE,
392         DRM_AUDIO_ENCRYPTED_BUFFER, DRM_AUDIO_ENCRYPTED_BUFFER_SIZE);
393     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
394 
395     if (flag == 1) {
396         std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
397             (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
398         drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
399     }
400     decryptor->DrmAudioCencDecrypt(drmInBuf, drmOutBuf, DRM_AUDIO_ENCRYPTED_BUFFER_SIZE);
401     return true;
402 }
403 
SetCodecNameFuzzTest(const uint8_t * data,size_t size)404 bool SetCodecNameFuzzTest(const uint8_t *data, size_t size)
405 {
406     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
407     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
408     static uint8_t setCodecNameFuzzTestFlag = 0;
409     if (setCodecNameFuzzTestFlag == 0) {
410         decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avc");
411         decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.hevc");
412         decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avs");
413         decryptor->SetCodecName("OH.Media.Codec.Decoder.Audio.mp4a-latm");
414         setCodecNameFuzzTestFlag = 1;
415     }
416     std::string codecName;
417     codecName.copy(reinterpret_cast<char *>((const_cast<uint8_t *>(data))), size);
418     decryptor->SetCodecName(codecName);
419     return true;
420 }
421 
422 #ifdef SUPPORT_DRM
SetDecryptionConfigFuzzTest(const uint8_t * data,size_t size)423 bool SetDecryptionConfigFuzzTest(const uint8_t *data, size_t size)
424 {
425     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
426     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
427     static uint8_t setDecryptionConfigFuzzTestFlag = 0;
428     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
429     (void)size;
430     if (setDecryptionConfigFuzzTestFlag == 0) {
431         bool svpFlag = false;
432         decryptor->SetDecryptionConfig(session, svpFlag);
433         setDecryptionConfigFuzzTestFlag = 1;
434     }
435     bool svpFlag = static_cast<bool>(*data);
436     decryptor->SetDecryptionConfig(session, svpFlag);
437     return true;
438 }
439 
DrmH264VideoCencDecrypt()440 bool DrmH264VideoCencDecrypt()
441 {
442     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
443     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
444 
445     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avc");
446 
447     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
448     bool svpFlag = false;
449     decryptor->SetDecryptionConfig(session, svpFlag);
450 
451     MemoryFlag memFlag = MEMORY_READ_WRITE;
452     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
453     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
454     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator,
455         static_cast<int32_t>(DRM_H264_ENCRYPTED_BUFFER_SIZE));
456     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
457     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
458     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
459         (drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_H264_ENCRYPTED_BUFFER_SIZE)), false);
460     drmInBuf->memory_->SetSize(DRM_H264_ENCRYPTED_BUFFER_SIZE);
461 
462     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator,
463         static_cast<int32_t>(DRM_H264_ENCRYPTED_BUFFER_SIZE));
464     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
465     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
466     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
467         (drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_H264_ENCRYPTED_BUFFER_SIZE)), false);
468 
469     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x0, 0);
470     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x1, 1); // 0x1:SM4-SAMPL SM4S
471     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x2, 1); // 0x2:AES CBCS
472     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x5, 1); // 0x5:AES CBC1
473     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x3, 1); // 0x3:SM4-CBC SM4C
474     H264MediaCencDecrypt(drmInBuf, drmOutBuf, decryptor, 0x0, 1); // 0x0:NONE
475     drmOutBuf->memory_->SetSize(DRM_H264_ENCRYPTED_BUFFER_SIZE);
476     return true;
477 }
478 
DrmH264VideoCencDecryptFuzzTest(const uint8_t * data,size_t size)479 bool DrmH264VideoCencDecryptFuzzTest(const uint8_t *data, size_t size)
480 {
481     uint32_t dataSize = static_cast<uint32_t>(size);
482     static uint8_t drmH264VideoCencDecryptFuzzTestFlag = 0;
483     if (drmH264VideoCencDecryptFuzzTestFlag == 0) {
484         DrmH264VideoCencDecrypt();
485         drmH264VideoCencDecryptFuzzTestFlag = 1;
486     }
487     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
488     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
489 
490     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avc");
491 
492     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
493     bool svpFlag = false;
494     decryptor->SetDecryptionConfig(session, svpFlag);
495 
496     MemoryFlag memFlag = MEMORY_READ_WRITE;
497     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
498     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
499     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
500     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
501     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
502     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
503         false);
504     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), dataSize, data, dataSize);
505     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
506     drmInBuf->memory_->SetSize(dataSize);
507 
508     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
509     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
510     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
511     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
512         false);
513 
514     MetaDrmCencInfo cencInfo;
515     CreateH264MediaCencInfo(cencInfo);
516     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
517         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
518     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
519     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, dataSize);
520     drmOutBuf->memory_->SetSize(dataSize);
521     return true;
522 }
523 
DrmHevcVideoCencDecrypt()524 bool DrmHevcVideoCencDecrypt()
525 {
526     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
527     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
528 
529     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.hevc");
530 
531     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
532     bool svpFlag = false;
533     decryptor->SetDecryptionConfig(session, svpFlag);
534 
535     MemoryFlag memFlag = MEMORY_READ_WRITE;
536     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
537     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
538     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator,
539         static_cast<int32_t>(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE));
540     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
541     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
542     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
543         (drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE)), false);
544     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE,
545         DRM_HEVC_SM4C_ENCRYPTED_BUFFER, DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE);
546     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
547     drmInBuf->memory_->SetSize(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE);
548 
549     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator,
550         static_cast<int32_t>(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE));
551     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
552     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
553     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
554         (drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE)), false);
555 
556     MetaDrmCencInfo cencInfo;
557     CreateHevcMediaCencInfo(cencInfo);
558     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
559         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
560     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
561     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE);
562     drmOutBuf->memory_->SetSize(DRM_HEVC_SM4C_ENCRYPTED_BUFFER_SIZE);
563     return true;
564 }
565 
DrmHevcVideoCencDecryptFuzzTest(const uint8_t * data,size_t size)566 bool DrmHevcVideoCencDecryptFuzzTest(const uint8_t *data, size_t size)
567 {
568     uint32_t dataSize = static_cast<uint32_t>(size);
569     static uint8_t drmHevcVideoCencDecryptFuzzTestFlag = 0;
570     if (drmHevcVideoCencDecryptFuzzTestFlag == 0) {
571         DrmHevcVideoCencDecrypt();
572         drmHevcVideoCencDecryptFuzzTestFlag = 1;
573     }
574     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
575     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
576 
577     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.hevc");
578 
579     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
580     bool svpFlag = false;
581     decryptor->SetDecryptionConfig(session, svpFlag);
582 
583     MemoryFlag memFlag = MEMORY_READ_WRITE;
584     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
585     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
586     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
587     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
588     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
589     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
590         false);
591     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), dataSize, data, dataSize);
592     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
593     drmInBuf->memory_->SetSize(dataSize);
594 
595     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
596     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
597     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
598     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
599         false);
600 
601     MetaDrmCencInfo cencInfo;
602     CreateHevcMediaCencInfo(cencInfo);
603     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
604         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
605     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
606     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, dataSize);
607     drmOutBuf->memory_->SetSize(dataSize);
608     return true;
609 }
610 
DrmAvsVideoCencDecrypt()611 bool DrmAvsVideoCencDecrypt()
612 {
613     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
614     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
615 
616     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avs");
617 
618     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
619     bool svpFlag = false;
620     decryptor->SetDecryptionConfig(session, svpFlag);
621 
622     MemoryFlag memFlag = MEMORY_READ_WRITE;
623     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
624     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
625     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator,
626         static_cast<int32_t>(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE));
627     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
628     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
629     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
630         (drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE)), false);
631     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE,
632         DRM_AVS_SM4C_ENCRYPTED_BUFFER, DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE);
633     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
634     drmInBuf->memory_->SetSize(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE);
635 
636     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator,
637         static_cast<int32_t>(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE));
638     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
639     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
640     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
641         (drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE)), false);
642 
643     MetaDrmCencInfo cencInfo;
644     CreateAvsMediaCencInfo(cencInfo);
645     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
646         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
647     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
648     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE);
649     drmOutBuf->memory_->SetSize(DRM_AVS_SM4C_ENCRYPTED_BUFFER_SIZE);
650     return true;
651 }
652 
DrmAvsVideoCencDecryptFuzzTest(const uint8_t * data,size_t size)653 bool DrmAvsVideoCencDecryptFuzzTest(const uint8_t *data, size_t size)
654 {
655     uint32_t dataSize = static_cast<uint32_t>(size);
656     static uint8_t drmAvsVideoCencDecryptFuzzTestFlag = 0;
657     if (drmAvsVideoCencDecryptFuzzTestFlag == 0) {
658         DrmAvsVideoCencDecrypt();
659         drmAvsVideoCencDecryptFuzzTestFlag = 1;
660     }
661     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
662     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
663 
664     decryptor->SetCodecName("OH.Media.Codec.Decoder.Video.avs");
665 
666     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
667     bool svpFlag = false;
668     decryptor->SetDecryptionConfig(session, svpFlag);
669 
670     MemoryFlag memFlag = MEMORY_READ_WRITE;
671     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
672     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
673     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
674     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
675     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
676     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
677         false);
678     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), dataSize, data, dataSize);
679     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
680     drmInBuf->memory_->SetSize(dataSize);
681 
682     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
683     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
684     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
685     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
686         false);
687 
688     MetaDrmCencInfo cencInfo;
689     CreateAvsMediaCencInfo(cencInfo);
690     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
691         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
692     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
693     decryptor->DrmVideoCencDecrypt(drmInBuf, drmOutBuf, dataSize);
694     drmOutBuf->memory_->SetSize(dataSize);
695     return true;
696 }
697 
DrmAudioCencDecryptTest()698 bool DrmAudioCencDecryptTest()
699 {
700     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
701     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
702     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
703     bool svpFlag = false;
704     decryptor->SetDecryptionConfig(session, svpFlag);
705 
706     MemoryFlag memFlag = MEMORY_READ_WRITE;
707     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
708     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
709     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator,
710         static_cast<int32_t>(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE));
711     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
712     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
713     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
714         (drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE)), false);
715     drmInBuf->memory_->SetSize(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE);
716 
717     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator,
718         static_cast<int32_t>(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE));
719     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
720     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
721     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(
722         (drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE)), false);
723 
724     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_UNENCRYPTED, 0);
725     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_AES_CTR, 1);
726     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CTR, 1);
727     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_AES_CBC, 1);
728     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_SM4_CBC, 1);
729     AudioCencDecrypt(drmInBuf, drmOutBuf, decryptor, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_UNENCRYPTED, 1);
730     drmOutBuf->memory_->SetSize(DRM_AUDIO_ENCRYPTED_BUFFER_SIZE);
731     return true;
732 }
733 
DrmAudioCencDecryptFuzzTest(const uint8_t * data,size_t size)734 bool DrmAudioCencDecryptFuzzTest(const uint8_t *data, size_t size)
735 {
736     uint32_t dataSize = static_cast<uint32_t>(size);
737     static uint8_t drmAudioCencDecryptFuzzTestFlag = 0;
738     if (drmAudioCencDecryptFuzzTestFlag == 0) {
739         DrmAudioCencDecryptTest();
740         drmAudioCencDecryptFuzzTestFlag = 1;
741     }
742     std::shared_ptr<CodecDrmDecrypt> decryptor = std::make_shared<CodecDrmDecrypt>();
743     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(decryptor != nullptr, false);
744     sptr<DrmStandard::IMediaKeySessionService> session = nullptr;
745     bool svpFlag = false;
746     decryptor->SetDecryptionConfig(session, svpFlag);
747 
748     MemoryFlag memFlag = MEMORY_READ_WRITE;
749     std::shared_ptr<AVAllocator> avAllocator = AVAllocatorFactory::CreateSharedAllocator(memFlag);
750     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(avAllocator != nullptr, false);
751     std::shared_ptr<AVBuffer> drmInBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
752     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf != nullptr, false);
753     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_ != nullptr, false);
754     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmInBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
755         false);
756     int32_t drmRes = memcpy_s(drmInBuf->memory_->GetAddr(), dataSize, data, dataSize);
757     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmRes == 0, false);
758     drmInBuf->memory_->SetSize(dataSize);
759 
760     std::shared_ptr<AVBuffer> drmOutBuf = AVBuffer::CreateAVBuffer(avAllocator, static_cast<int32_t>(dataSize));
761     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf != nullptr, false);
762     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_ != nullptr, false);
763     DRM_DECRYPTOR_FUZZ_CHECK_AND_RETURN_RET(drmOutBuf->memory_->GetCapacity() == static_cast<int32_t>(dataSize),
764         false);
765 
766     MetaDrmCencInfo cencInfo;
767     CreateAudioCencInfo(cencInfo, MetaDrmCencAlgorithm::META_DRM_ALG_CENC_AES_CBC);
768     std::vector<uint8_t> drmCencVec(reinterpret_cast<uint8_t *>(&cencInfo),
769         (reinterpret_cast<uint8_t *>(&cencInfo)) + sizeof(MetaDrmCencInfo));
770     drmInBuf->meta_->SetData(Media::Tag::DRM_CENC_INFO, std::move(drmCencVec));
771     decryptor->DrmAudioCencDecrypt(drmInBuf, drmOutBuf, dataSize);
772     drmOutBuf->memory_->SetSize(dataSize);
773     return true;
774 }
775 #endif
776 
777 } // namespace DrmDecryptorFuzzer
778 } // namespace OHOS
779 
780 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)781 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
782 {
783     /* Run your code on data */
784     if (data == nullptr) {
785         return 0;
786     }
787     if (size < sizeof(int64_t)) {
788         return 0;
789     }
790     OHOS::DrmDecryptorFuzzer::SetCodecNameFuzzTest(data, size);
791 #ifdef SUPPORT_DRM
792     OHOS::DrmDecryptorFuzzer::SetDecryptionConfigFuzzTest(data, size);
793     OHOS::DrmDecryptorFuzzer::DrmH264VideoCencDecryptFuzzTest(data, size);
794     OHOS::DrmDecryptorFuzzer::DrmHevcVideoCencDecryptFuzzTest(data, size);
795     OHOS::DrmDecryptorFuzzer::DrmAvsVideoCencDecryptFuzzTest(data, size);
796     OHOS::DrmDecryptorFuzzer::DrmAudioCencDecryptFuzzTest(data, size);
797 #endif
798     return 0;
799 }
800