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