• 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 
17 #include <string>
18 #include <refbase.h>
19 #include <securec.h>
20 #include <string_ex.h>
21 #include <fuzzer/FuzzedDataProvider.h>
22 #include "drm_log.h"
23 #include "ipc_skeleton.h"
24 #include "mediakeysystem_service.h"
25 #include "mediakeysystemfactory_service.h"
26 #include "key_session_service.h"
27 #include "drmservice_fuzzer.h"
28 #include "iremote_proxy.h"
29 
30 using namespace std;
31 using namespace OHOS;
32 using namespace DrmStandard;
33 
34 namespace OHOS {
35 namespace DrmStandard {
36 const int32_t MEDIA_KEY_SYSTEM_SERVICE_ID = 3012;
37 const int32_t DATAMAXSIZE = 12288;
38 const std::u16string MEDIA_KEY_SYSTEM_FACTORY_TOKEN = u"OHOS.DrmStandard.IMediaKeySystemFactoryService";
39 const std::u16string MEDIA_KEY_SYSTEM_TOKEN = u"OHOS.DrmStandard.IMediaKeySystemService";
40 const std::u16string MEDIA_KEY_SESSION_TOKEN = u"OHOS.DrmStandard.IMediaKeySessionService";
41 const std::u16string MEDIA_DECRYPT_MODULE_TOKEN = u"OHOS.DrmStandard.IMediaDecryptModuleService";
42 const uint32_t COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_V2 = static_cast<uint32_t>(
43     IMediaKeySystemFactoryServiceIpcCode::COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_IN_STRING_IN_STRING_OUT_BOOLEAN
44 );
45 const uint32_t COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_V3 = static_cast<uint32_t>(
46     IMediaKeySystemFactoryServiceIpcCode::COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_IN_STRING_IN_STRING_IN_INT_OUT_BOOLEAN
47 );
48 
49 std::shared_ptr<MediaKeySystemFactoryService> g_mediaKeySystemFactoryServicePtr = nullptr;
50 
DrmServiceNdkFuzzer()51 DrmServiceNdkFuzzer::DrmServiceNdkFuzzer() {}
52 
~DrmServiceNdkFuzzer()53 DrmServiceNdkFuzzer::~DrmServiceNdkFuzzer() {}
54 
55 
DrmserviceIsMediaKeySystemSupportedV1Test(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)56 bool DrmServiceNdkFuzzer::DrmserviceIsMediaKeySystemSupportedV1Test(uint8_t *rawData, size_t size,
57     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
58 {
59     if (rawData == nullptr || size < sizeof(int32_t)) {
60         return false;
61     }
62     MessageParcel reply;
63     MessageOption option;
64     MessageParcel data;
65     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
66     std::string uuid(reinterpret_cast<const char *>(rawData), size);
67     data.WriteString16(Str8ToStr16(uuid));
68     mediaKeySystemFactoryServicePtr->OnRemoteRequest(
69         static_cast<uint32_t>(IMediaKeySystemFactoryServiceIpcCode::COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED),
70         data, reply, option);
71     return true;
72 }
73 
DrmserviceIsMediaKeySystemSupportedV2Test(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)74 bool DrmServiceNdkFuzzer::DrmserviceIsMediaKeySystemSupportedV2Test(uint8_t *rawData, size_t size,
75     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
76 {
77     if (rawData == nullptr || size < sizeof(int32_t)) {
78         return false;
79     }
80     MessageParcel reply;
81     MessageOption option;
82     MessageParcel data;
83     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
84     FuzzedDataProvider fdp(rawData, size);
85     size_t len = size / 2; // 2 half
86     std::string uuid(fdp.ConsumeBytes<char>(len).data(), len);
87     std::string mimeType(fdp.ConsumeBytes<char>(len).data(), len);
88     data.WriteString16(Str8ToStr16(uuid));
89     data.WriteString16(Str8ToStr16(mimeType));
90     mediaKeySystemFactoryServicePtr->OnRemoteRequest(COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_V2,
91         data, reply, option);
92     return true;
93 }
94 
DrmserviceIsMediaKeySystemSupportedV3Test(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)95 bool DrmServiceNdkFuzzer::DrmserviceIsMediaKeySystemSupportedV3Test(uint8_t *rawData, size_t size,
96     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
97 {
98     if (rawData == nullptr || size < sizeof(int32_t)) {
99         return false;
100     }
101     MessageParcel reply;
102     MessageOption option;
103     MessageParcel data;
104     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
105     FuzzedDataProvider fdp(rawData, size);
106     size_t len = (size - sizeof(int32_t)) / 2; // 2 half
107     std::string uuid(fdp.ConsumeBytes<char>(len).data(), len);
108     std::string mimeType(fdp.ConsumeBytes<char>(len).data(), len);
109     data.WriteString16(Str8ToStr16(uuid));
110     data.WriteString16(Str8ToStr16(mimeType));
111     int32_t securityLevel = fdp.ConsumeIntegral<int32_t>();
112     data.WriteInt32(securityLevel);
113     mediaKeySystemFactoryServicePtr->OnRemoteRequest(COMMAND_IS_MEDIA_KEY_SYSTEM_SUPPORTED_V3,
114         data, reply, option);
115     return true;
116 }
117 
DrmserviceCreateMediaKeySystemTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)118 bool DrmServiceNdkFuzzer::DrmserviceCreateMediaKeySystemTest(uint8_t *rawData, size_t size,
119     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
120 {
121     if (rawData == nullptr || size < sizeof(int32_t)) {
122         return false;
123     }
124     MessageParcel reply;
125     MessageOption option;
126     MessageParcel data;
127     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
128     std::string name(reinterpret_cast<const char *>(rawData), size);
129     data.WriteString16(Str8ToStr16(name));
130     mediaKeySystemFactoryServicePtr->OnRemoteRequest(
131         static_cast<uint32_t>(IMediaKeySystemFactoryServiceIpcCode::COMMAND_CREATE_MEDIA_KEY_SYSTEM),
132         data, reply, option);
133     return true;
134 }
135 
DrmserviceGetMediaKeySystemsTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)136 bool DrmServiceNdkFuzzer::DrmserviceGetMediaKeySystemsTest(uint8_t *rawData, size_t size,
137     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
138 {
139     if (rawData == nullptr || size < sizeof(int32_t)) {
140         return false;
141     }
142     MessageParcel reply;
143     MessageOption option;
144     MessageParcel data;
145     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
146     mediaKeySystemFactoryServicePtr->OnRemoteRequest(
147         static_cast<uint32_t>(IMediaKeySystemFactoryServiceIpcCode::COMMAND_GET_MEDIA_KEY_SYSTEMS),
148         data, reply, option);
149     return true;
150 }
151 
DrmserviceGetMediaKeySystemUuidTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)152 bool DrmServiceNdkFuzzer::DrmserviceGetMediaKeySystemUuidTest(uint8_t *rawData, size_t size,
153     std::shared_ptr<MediaKeySystemFactoryService> mediaKeySystemFactoryServicePtr)
154 {
155     if (rawData == nullptr || size < sizeof(int32_t)) {
156         return false;
157     }
158     MessageParcel reply;
159     MessageOption option;
160     MessageParcel data;
161     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_FACTORY_TOKEN);
162     std::string name(reinterpret_cast<const char *>(rawData), size);
163     data.WriteString16(Str8ToStr16(name));
164     mediaKeySystemFactoryServicePtr->OnRemoteRequest(
165         static_cast<uint32_t>(IMediaKeySystemFactoryServiceIpcCode::COMMAND_GET_MEDIA_KEY_SYSTEM_UUID),
166         data, reply, option);
167     return true;
168 }
169 
DrmserviceCreateMediaKeySessionTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)170 bool DrmServiceNdkFuzzer::DrmserviceCreateMediaKeySessionTest(uint8_t *rawData, size_t size,
171     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
172 {
173     if (rawData == nullptr || size < sizeof(int32_t)) {
174         return false;
175     }
176     MessageParcel reply;
177     MessageOption option;
178     MessageParcel data;
179     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
180     int32_t securityLevel = *reinterpret_cast<const int32_t *>(rawData);
181     data.WriteInt32(securityLevel);
182     mediaKeySystemServicePtr->OnRemoteRequest(
183         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_CREATE_MEDIA_KEY_SESSION),
184         data, reply, option);
185     return true;
186 }
187 
DrmserviceCloseMediaKeySessionServiceTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)188 bool DrmServiceNdkFuzzer::DrmserviceCloseMediaKeySessionServiceTest(uint8_t *rawData, size_t size,
189     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
190 {
191     if (rawData == nullptr || size < sizeof(int32_t)) {
192         return false;
193     }
194     sptr<IMediaKeySession> hdiMediaKeySession = new (std::nothrow) IMediaKeySessionMock();
195     sptr<MediaKeySessionService> mediaKeySessionService =
196         new (std::nothrow) MediaKeySessionService(hdiMediaKeySession);
197     mediaKeySystemServicePtr->CloseMediaKeySessionService(mediaKeySessionService);
198     return true;
199 }
200 
DrmserviceGenerateKeySystemRequestTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)201 bool DrmServiceNdkFuzzer::DrmserviceGenerateKeySystemRequestTest(uint8_t *rawData, size_t size,
202     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
203 {
204     if (rawData == nullptr || size < sizeof(int32_t)) {
205         return false;
206     }
207     MessageParcel reply;
208     MessageOption option;
209     MessageParcel data;
210     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
211     mediaKeySystemServicePtr->OnRemoteRequest(
212         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GENERATE_KEY_SYSTEM_REQUEST),
213         data, reply, option);
214     return true;
215 }
216 
DrmserviceProcessKeySystemResponseTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)217 bool DrmServiceNdkFuzzer::DrmserviceProcessKeySystemResponseTest(uint8_t *rawData, size_t size,
218     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
219 {
220     if (rawData == nullptr || size < sizeof(int32_t)) {
221         return false;
222     }
223     MessageParcel reply;
224     MessageOption option;
225     MessageParcel data;
226     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
227     data.WriteInt32(size);
228     uint8_t *response = rawData;
229     for (size_t i = 0; i < size; i++) {
230         if (!data.WriteUint8(response[i])) {
231             return false;
232         }
233     }
234     mediaKeySystemServicePtr->OnRemoteRequest(
235         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_PROCESS_KEY_SYSTEM_RESPONSE),
236         data, reply, option);
237     return true;
238 }
239 
DrmserviceGenerateSetConfigurationStringTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)240 bool DrmServiceNdkFuzzer::DrmserviceGenerateSetConfigurationStringTest(uint8_t *rawData, size_t size,
241     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
242 {
243     if (rawData == nullptr || size < sizeof(int32_t)) {
244         return false;
245     }
246     MessageParcel reply;
247     MessageOption option;
248     MessageParcel data;
249     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
250     FuzzedDataProvider fdp(rawData, size);
251     size_t len = size / 2; // 2 half
252     std::string configName(fdp.ConsumeBytes<char>(len).data(), len);
253     std::string value(fdp.ConsumeBytes<char>(len).data(), len);
254     data.WriteString16(Str8ToStr16(configName));
255     data.WriteString16(Str8ToStr16(value));
256     mediaKeySystemServicePtr->OnRemoteRequest(
257         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_SET_CONFIGURATION_STRING),
258         data, reply, option);
259     return true;
260 }
261 
DrmserviceSetConfigurationStringTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)262 bool DrmServiceNdkFuzzer::DrmserviceSetConfigurationStringTest(uint8_t *rawData, size_t size,
263     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
264 {
265     if (rawData == nullptr || size < sizeof(int32_t)) {
266         return false;
267     }
268     MessageParcel reply;
269     MessageOption option;
270     MessageParcel data;
271     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
272     FuzzedDataProvider fdp(rawData, size);
273     size_t len = size / 2; // 2 half
274     std::string configName(fdp.ConsumeBytes<char>(len).data(), len);
275     std::string value(fdp.ConsumeBytes<char>(len).data(), len);
276     data.WriteString16(Str8ToStr16(configName));
277     data.WriteString16(Str8ToStr16(value));
278     mediaKeySystemServicePtr->OnRemoteRequest(
279         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_SET_CONFIGURATION_STRING),
280         data, reply, option);
281     return true;
282 }
283 
DrmserviceGetConfigurationStringTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)284 bool DrmServiceNdkFuzzer::DrmserviceGetConfigurationStringTest(uint8_t *rawData, size_t size,
285     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
286 {
287     if (rawData == nullptr || size < sizeof(int32_t)) {
288         return false;
289     }
290     MessageParcel reply;
291     MessageOption option;
292     MessageParcel data;
293     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
294     std::string configName(reinterpret_cast<const char *>(rawData), size);
295     data.WriteString16(Str8ToStr16(configName));
296     mediaKeySystemServicePtr->OnRemoteRequest(
297         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_CONFIGURATION_STRING),
298         data, reply, option);
299     return true;
300 }
301 
DrmserviceSetConfigurationByteArrayTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)302 bool DrmServiceNdkFuzzer::DrmserviceSetConfigurationByteArrayTest(uint8_t *rawData, size_t size,
303     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
304 {
305     if (rawData == nullptr || size < sizeof(int32_t)) {
306         return false;
307     }
308     MessageParcel reply;
309     MessageOption option;
310     MessageParcel data;
311     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
312     FuzzedDataProvider fdp(rawData, size);
313     size_t len = size / 2; // 2 half
314     std::string configName(fdp.ConsumeBytes<char>(len).data(), len);
315     data.WriteString16(Str8ToStr16(configName));
316     data.WriteInt32(len);
317     for (size_t i = 0; i < len; i++) {
318         if (!data.WriteUint8(rawData[i])) {
319             return false;
320         }
321     }
322     mediaKeySystemServicePtr->OnRemoteRequest(
323         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_SET_CONFIGURATION_BYTE_ARRAY),
324         data, reply, option);
325     return true;
326 }
327 
DrmserviceGetConfigurationByteArrayTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)328 bool DrmServiceNdkFuzzer::DrmserviceGetConfigurationByteArrayTest(uint8_t *rawData, size_t size,
329     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
330 {
331     if (rawData == nullptr || size < sizeof(int32_t)) {
332         return false;
333     }
334     MessageParcel reply;
335     MessageOption option;
336     MessageParcel data;
337     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
338     std::string configName(reinterpret_cast<const char *>(rawData), size);
339     data.WriteString16(Str8ToStr16(configName));
340     mediaKeySystemServicePtr->OnRemoteRequest(
341         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_CONFIGURATION_BYTE_ARRAY),
342         data, reply, option);
343     return true;
344 }
345 
DrmserviceGetStatisticsTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)346 bool DrmServiceNdkFuzzer::DrmserviceGetStatisticsTest(uint8_t *rawData, size_t size,
347     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
348 {
349     if (rawData == nullptr || size < sizeof(int32_t)) {
350         return false;
351     }
352     MessageParcel reply;
353     MessageOption option;
354     MessageParcel data;
355     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
356     mediaKeySystemServicePtr->OnRemoteRequest(
357         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_STATISTICS),
358         data, reply, option);
359     return true;
360 }
361 
DrmserviceReleaseTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)362 bool DrmServiceNdkFuzzer::DrmserviceReleaseTest(uint8_t *rawData, size_t size,
363     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
364 {
365     if (rawData == nullptr || size < sizeof(int32_t)) {
366         return false;
367     }
368     MessageParcel reply;
369     MessageOption option;
370     MessageParcel data;
371     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
372     mediaKeySystemServicePtr->OnRemoteRequest(
373         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_RELEASE), data, reply, option);
374     return true;
375 }
376 
DrmserviceGetMaxContentProtectionLevelTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)377 bool DrmServiceNdkFuzzer::DrmserviceGetMaxContentProtectionLevelTest(uint8_t *rawData, size_t size,
378     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
379 {
380     if (rawData == nullptr || size < sizeof(int32_t)) {
381         return false;
382     }
383     MessageParcel reply;
384     MessageOption option;
385     MessageParcel data;
386     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
387     mediaKeySystemServicePtr->OnRemoteRequest(
388         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_MAX_CONTENT_PROTECTION_LEVEL),
389         data, reply, option);
390     return true;
391 }
392 
DrmserviceGetCertificateStatusTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)393 bool DrmServiceNdkFuzzer::DrmserviceGetCertificateStatusTest(uint8_t *rawData, size_t size,
394     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
395 {
396     if (rawData == nullptr || size < sizeof(int32_t)) {
397         return false;
398     }
399     MessageParcel reply;
400     MessageOption option;
401     MessageParcel data;
402     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
403     mediaKeySystemServicePtr->OnRemoteRequest(
404         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_CERTIFICATE_STATUS), data, reply, option);
405     return true;
406 }
407 
DrmserviceGetOfflineMediaKeyIdsTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)408 bool DrmServiceNdkFuzzer::DrmserviceGetOfflineMediaKeyIdsTest(uint8_t *rawData, size_t size,
409     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
410 {
411     if (rawData == nullptr || size < sizeof(int32_t)) {
412         return false;
413     }
414     MessageParcel reply;
415     MessageOption option;
416     MessageParcel data;
417     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
418     mediaKeySystemServicePtr->OnRemoteRequest(
419         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_OFFLINE_MEDIA_KEY_IDS), data, reply, option);
420     return true;
421 }
422 
DrmserviceGetOfflineMediaKeyStatusTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)423 bool DrmServiceNdkFuzzer::DrmserviceGetOfflineMediaKeyStatusTest(uint8_t *rawData, size_t size,
424     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
425 {
426     if (rawData == nullptr || size < sizeof(int32_t)) {
427         return false;
428     }
429     MessageParcel reply;
430     MessageOption option;
431     MessageParcel data;
432     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
433     data.WriteInt32(size);
434     for (size_t i = 0; i < size; i++) {
435         if (!data.WriteUint8(rawData[i])) {
436             return false;
437         }
438     }
439     mediaKeySystemServicePtr->OnRemoteRequest(
440         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_GET_OFFLINE_MEDIA_KEY_STATUS),
441         data, reply, option);
442     return true;
443 }
444 
DrmserviceClearOfflineMediaKeysTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)445 bool DrmServiceNdkFuzzer::DrmserviceClearOfflineMediaKeysTest(uint8_t *rawData, size_t size,
446     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr)
447 {
448     if (rawData == nullptr || size < sizeof(int32_t)) {
449         return false;
450     }
451     MessageParcel reply;
452     MessageOption option;
453     MessageParcel data;
454     data.WriteInterfaceToken(MEDIA_KEY_SYSTEM_TOKEN);
455     data.WriteInt32(size);
456     for (size_t i = 0; i < size; i++) {
457         if (!data.WriteUint8(rawData[i])) {
458             return false;
459         }
460     }
461     mediaKeySystemServicePtr->OnRemoteRequest(
462         static_cast<uint32_t>(IMediaKeySystemServiceIpcCode::COMMAND_CLEAR_OFFLINE_MEDIA_KEYS), data, reply, option);
463     return true;
464 }
465 
DrmserviceGetMediaDecryptModuleTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)466 bool DrmServiceNdkFuzzer::DrmserviceGetMediaDecryptModuleTest(uint8_t *rawData, size_t size,
467     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
468 {
469     if (rawData == nullptr || size < sizeof(int32_t)) {
470         return false;
471     }
472     MessageParcel reply;
473     MessageOption option;
474     MessageParcel data;
475     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
476     mediaKeySessionService->OnRemoteRequest(
477         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_GET_MEDIA_DECRYPT_MODULE), data, reply, option);
478     return true;
479 }
480 
DrmserviceGenerateMediaKeyRequestTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)481 bool DrmServiceNdkFuzzer::DrmserviceGenerateMediaKeyRequestTest(uint8_t *rawData, size_t size,
482     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
483 {
484     if (rawData == nullptr || size < sizeof(int32_t)) {
485         return false;
486     }
487     MessageParcel reply;
488     MessageOption option;
489     MessageParcel data;
490     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
491     FuzzedDataProvider fdp(rawData, size);
492     size_t len = size / 3; // 3 servings
493     data.WriteInt32(size);
494     std::string mimeType(fdp.ConsumeBytes<char>(len).data(), len);
495     data.WriteString16(Str8ToStr16(mimeType));
496     data.WriteInt32(size);
497     for (size_t i = 0; i < size; i++) {
498         if (!data.WriteUint8(rawData[i])) {
499             return false;
500         }
501     }
502     data.WriteInt32(size);
503     std::string optionalKey(fdp.ConsumeBytes<char>(len).data(), len);
504     std::string optionalValue(fdp.ConsumeBytes<char>(len).data(), len);
505     data.WriteString16(Str8ToStr16(optionalKey));
506     data.WriteString16(Str8ToStr16(optionalValue));
507     mediaKeySessionService->OnRemoteRequest(
508         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_GENERATE_MEDIA_KEY_REQUEST),
509         data, reply, option);
510     return true;
511 }
512 
DrmserviceProcessMediaKeyResponseTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)513 bool DrmServiceNdkFuzzer::DrmserviceProcessMediaKeyResponseTest(uint8_t *rawData, size_t size,
514     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
515 {
516     if (rawData == nullptr || size < sizeof(int32_t)) {
517         return false;
518     }
519     MessageParcel reply;
520     MessageOption option;
521     MessageParcel data;
522     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
523     data.WriteInt32(size);
524     for (size_t i = 0; i < size; i++) {
525         if (!data.WriteUint8(rawData[i])) {
526             return false;
527         }
528     }
529     mediaKeySessionService->OnRemoteRequest(
530         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_PROCESS_MEDIA_KEY_RESPONSE),
531         data, reply, option);
532     return true;
533 }
534 
DrmserviceGenerateOfflineReleaseRequestTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)535 bool DrmServiceNdkFuzzer::DrmserviceGenerateOfflineReleaseRequestTest(uint8_t *rawData, size_t size,
536     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
537 {
538     if (rawData == nullptr || size < sizeof(int32_t)) {
539         return false;
540     }
541     MessageParcel reply;
542     MessageOption option;
543     MessageParcel data;
544     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
545     data.WriteInt32(size);
546     for (size_t i = 0; i < size; i++) {
547         if (!data.WriteUint8(rawData[i])) {
548             return false;
549         }
550     }
551     mediaKeySessionService->OnRemoteRequest(
552         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_GENERATE_OFFLINE_RELEASE_REQUEST),
553         data, reply, option);
554     return true;
555 }
556 
DrmserviceProcessOfflineReleaseResponseTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)557 bool DrmServiceNdkFuzzer::DrmserviceProcessOfflineReleaseResponseTest(uint8_t *rawData, size_t size,
558     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
559 {
560     if (rawData == nullptr || size < sizeof(int32_t)) {
561         return false;
562     }
563     MessageParcel reply;
564     MessageOption option;
565     MessageParcel data;
566     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
567     FuzzedDataProvider fdp(rawData, size);
568     size_t len = size / 2; // 2 half
569     std::vector<uint8_t> licenseId = fdp.ConsumeBytes<uint8_t>(len);
570     std::vector<uint8_t> releaseReponse = fdp.ConsumeBytes<uint8_t>(len);
571     data.WriteInt32(len);
572     for (size_t i = 0; i < len; i++) {
573         if (!data.WriteUint8(licenseId[i])) {
574             return false;
575         }
576     }
577     data.WriteInt32(len);
578     for (size_t i = 0; i < len; i++) {
579         if (!data.WriteUint8(releaseReponse[i])) {
580             return false;
581         }
582     }
583     mediaKeySessionService->OnRemoteRequest(
584         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_PROCESS_OFFLINE_RELEASE_RESPONSE),
585         data, reply, option);
586     return true;
587 }
588 
DrmserviceCheckMediaKeyStatusTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)589 bool DrmServiceNdkFuzzer::DrmserviceCheckMediaKeyStatusTest(uint8_t *rawData, size_t size,
590     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
591 {
592     if (rawData == nullptr || size < sizeof(int32_t)) {
593         return false;
594     }
595     MessageParcel reply;
596     MessageOption option;
597     MessageParcel data;
598     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
599     mediaKeySessionService->OnRemoteRequest(
600         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_CHECK_MEDIA_KEY_STATUS), data, reply, option);
601     return true;
602 }
603 
DrmserviceRestoreOfflineMediaKeysTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)604 bool DrmServiceNdkFuzzer::DrmserviceRestoreOfflineMediaKeysTest(uint8_t *rawData, size_t size,
605     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
606 {
607     if (rawData == nullptr || size < sizeof(int32_t)) {
608         return false;
609     }
610     MessageParcel reply;
611     MessageOption option;
612     MessageParcel data;
613     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
614     data.WriteInt32(size);
615     for (size_t i = 0; i < size; i++) {
616         if (!data.WriteUint8(rawData[i])) {
617             return false;
618         }
619     }
620     mediaKeySessionService->OnRemoteRequest(
621         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_RESTORE_OFFLINE_MEDIA_KEYS),
622         data, reply, option);
623     return true;
624 }
625 
DrmserviceClearMediaKeysTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)626 bool DrmServiceNdkFuzzer::DrmserviceClearMediaKeysTest(uint8_t *rawData, size_t size,
627     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
628 {
629     if (rawData == nullptr || size < sizeof(int32_t)) {
630         return false;
631     }
632     MessageParcel reply;
633     MessageOption option;
634     MessageParcel data;
635     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
636     mediaKeySessionService->OnRemoteRequest(
637         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_CLEAR_MEDIA_KEYS), data, reply, option);
638     return true;
639 }
640 
DrmserviceRequireSecureDecoderModuleTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)641 bool DrmServiceNdkFuzzer::DrmserviceRequireSecureDecoderModuleTest(uint8_t *rawData, size_t size,
642     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
643 {
644     if (rawData == nullptr || size < sizeof(int32_t)) {
645         return false;
646     }
647     MessageParcel reply;
648     MessageOption option;
649     MessageParcel data;
650     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
651     std::string mimeType(reinterpret_cast<const char *>(rawData), size);
652     data.WriteString16(Str8ToStr16(mimeType));
653     mediaKeySessionService->OnRemoteRequest(
654         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_REQUIRE_SECURE_DECODER_MODULE),
655         data, reply, option);
656     return true;
657 }
658 
DrmserviceGetContentProtectionLevelTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaKeySessionService> mediaKeySessionService)659 bool DrmServiceNdkFuzzer::DrmserviceGetContentProtectionLevelTest(uint8_t *rawData, size_t size,
660     std::shared_ptr<MediaKeySessionService> mediaKeySessionService)
661 {
662     if (rawData == nullptr || size < sizeof(int32_t)) {
663         return false;
664     }
665     MessageParcel reply;
666     MessageOption option;
667     MessageParcel data;
668     data.WriteInterfaceToken(MEDIA_KEY_SESSION_TOKEN);
669     mediaKeySessionService->OnRemoteRequest(
670         static_cast<uint32_t>(IMediaKeySessionServiceIpcCode::COMMAND_GET_CONTENT_PROTECTION_LEVEL),
671         data, reply, option);
672     return true;
673 }
674 
DrmserviceDecryptMediaDataTest(uint8_t * rawData,size_t size,std::shared_ptr<MediaDecryptModuleService> mediaDecryptService)675 bool DrmServiceNdkFuzzer::DrmserviceDecryptMediaDataTest(uint8_t *rawData, size_t size,
676     std::shared_ptr<MediaDecryptModuleService> mediaDecryptService)
677 {
678     if (rawData == nullptr || size < sizeof(int32_t)) {
679         return false;
680     }
681     MessageParcel reply;
682     MessageOption option;
683     MessageParcel data;
684     data.WriteInterfaceToken(MEDIA_DECRYPT_MODULE_TOKEN);
685     mediaDecryptService->OnRemoteRequest(
686         static_cast<uint32_t>(IMediaDecryptModuleServiceIpcCode::COMMAND_DECRYPT_MEDIA_DATA), data, reply, option);
687     return true;
688 }
689 } // namespace DrmStandard
690 
FuzzMediaKeySystemFactoryNdk(uint8_t * data,size_t size)691 bool FuzzMediaKeySystemFactoryNdk(uint8_t *data, size_t size)
692 {
693     if (data == nullptr) {
694         return true;
695     }
696     DrmServiceNdkFuzzer testMediaKeySystemFactory;
697     /* KeySystemFactory */
698     if (g_mediaKeySystemFactoryServicePtr == nullptr) {
699         g_mediaKeySystemFactoryServicePtr =
700             std::make_shared<MediaKeySystemFactoryService>(MEDIA_KEY_SYSTEM_SERVICE_ID, true);
701         if (g_mediaKeySystemFactoryServicePtr == nullptr) {
702             return false;
703         }
704     }
705     testMediaKeySystemFactory.DrmserviceIsMediaKeySystemSupportedV1Test(data, size, g_mediaKeySystemFactoryServicePtr);
706     testMediaKeySystemFactory.DrmserviceIsMediaKeySystemSupportedV2Test(data, size, g_mediaKeySystemFactoryServicePtr);
707     testMediaKeySystemFactory.DrmserviceIsMediaKeySystemSupportedV3Test(data, size, g_mediaKeySystemFactoryServicePtr);
708     testMediaKeySystemFactory.DrmserviceCreateMediaKeySystemTest(data, size, g_mediaKeySystemFactoryServicePtr);
709     testMediaKeySystemFactory.DrmserviceGetMediaKeySystemsTest(data, size, g_mediaKeySystemFactoryServicePtr);
710     testMediaKeySystemFactory.DrmserviceGetMediaKeySystemUuidTest(data, size, g_mediaKeySystemFactoryServicePtr);
711     return true;
712 }
713 
FuzzSystemFactoryNdk(uint8_t * data,size_t size)714 bool FuzzSystemFactoryNdk(uint8_t *data, size_t size)
715 {
716     if (data == nullptr) {
717         return true;
718     }
719     DrmServiceNdkFuzzer testMediaSystemFactory;
720     /* KeySystem */
721     sptr<IMediaKeySystem> hdiMediaKeySystem = new (std::nothrow) IMediaKeySystemMock();
722     std::shared_ptr<MediaKeySystemService> mediaKeySystemServicePtr =
723         std::make_shared<MediaKeySystemService>(hdiMediaKeySystem);
724     testMediaSystemFactory.DrmserviceCreateMediaKeySessionTest(data, size, mediaKeySystemServicePtr);
725     testMediaSystemFactory.DrmserviceCloseMediaKeySessionServiceTest(data, size, mediaKeySystemServicePtr);
726     testMediaSystemFactory.DrmserviceGenerateKeySystemRequestTest(data, size, mediaKeySystemServicePtr);
727     testMediaSystemFactory.DrmserviceProcessKeySystemResponseTest(data, size, mediaKeySystemServicePtr);
728     testMediaSystemFactory.DrmserviceGenerateSetConfigurationStringTest(data, size, mediaKeySystemServicePtr);
729     testMediaSystemFactory.DrmserviceSetConfigurationStringTest(data, size, mediaKeySystemServicePtr);
730     testMediaSystemFactory.DrmserviceGetConfigurationStringTest(data, size, mediaKeySystemServicePtr);
731     testMediaSystemFactory.DrmserviceSetConfigurationByteArrayTest(data, size, mediaKeySystemServicePtr);
732     testMediaSystemFactory.DrmserviceGetConfigurationByteArrayTest(data, size, mediaKeySystemServicePtr);
733     testMediaSystemFactory.DrmserviceGetStatisticsTest(data, size, mediaKeySystemServicePtr);
734     testMediaSystemFactory.DrmserviceGetMaxContentProtectionLevelTest(data, size, mediaKeySystemServicePtr);
735     testMediaSystemFactory.DrmserviceGetCertificateStatusTest(data, size, mediaKeySystemServicePtr);
736     testMediaSystemFactory.DrmserviceGetOfflineMediaKeyIdsTest(data, size, mediaKeySystemServicePtr);
737     testMediaSystemFactory.DrmserviceGetOfflineMediaKeyStatusTest(data, size, mediaKeySystemServicePtr);
738     testMediaSystemFactory.DrmserviceClearOfflineMediaKeysTest(data, size, mediaKeySystemServicePtr);
739     testMediaSystemFactory.DrmserviceReleaseTest(data, size, mediaKeySystemServicePtr);
740     /* MediaKeySession */
741     sptr<IMediaKeySession> hdiMediaKeySession = new (std::nothrow) IMediaKeySessionMock();
742     std::shared_ptr<MediaKeySessionService> mediaKeySessionService =
743         std::make_shared<MediaKeySessionService>(hdiMediaKeySession);
744     testMediaSystemFactory.DrmserviceGetMediaDecryptModuleTest(data, size, mediaKeySessionService);
745     testMediaSystemFactory.DrmserviceGenerateMediaKeyRequestTest(data, size, mediaKeySessionService);
746     testMediaSystemFactory.DrmserviceProcessMediaKeyResponseTest(data, size, mediaKeySessionService);
747     testMediaSystemFactory.DrmserviceGenerateOfflineReleaseRequestTest(data, size, mediaKeySessionService);
748     testMediaSystemFactory.DrmserviceProcessOfflineReleaseResponseTest(data, size, mediaKeySessionService);
749     testMediaSystemFactory.DrmserviceCheckMediaKeyStatusTest(data, size, mediaKeySessionService);
750     testMediaSystemFactory.DrmserviceRestoreOfflineMediaKeysTest(data, size, mediaKeySessionService);
751     testMediaSystemFactory.DrmserviceClearMediaKeysTest(data, size, mediaKeySessionService);
752     testMediaSystemFactory.DrmserviceRequireSecureDecoderModuleTest(data, size, mediaKeySessionService);
753     testMediaSystemFactory.DrmserviceGetContentProtectionLevelTest(data, size, mediaKeySessionService);
754     /* DecryptModule */
755     sptr<IMediaDecryptModule> hdiDecryptModule = new (std::nothrow) IMediaDecryptModuleMock();
756     std::shared_ptr<MediaDecryptModuleService> mediaDecryptService =
757         std::make_shared<MediaDecryptModuleService>(hdiDecryptModule);
758     testMediaSystemFactory.DrmserviceDecryptMediaDataTest(data, size, mediaDecryptService);
759     return true;
760 }
761 } // namesapce OHOS
762 
763 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(uint8_t * data,size_t size)764 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size)
765 {
766     /* Run your code on data */
767     uint8_t rawData[DATAMAXSIZE] = { 0 };
768     int32_t ret = memcpy_s(rawData, DATAMAXSIZE - 1, data, size);
769     if (ret != 0) {
770         return -1;
771     }
772     OHOS::FuzzSystemFactoryNdk(rawData, size);
773     OHOS::FuzzMediaKeySystemFactoryNdk(rawData, size);
774     return 0;
775 }
776