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 <iostream>
17 #include <cstddef>
18 #include <cstdint>
19 #include "audio_info.h"
20 #include "audio_policy_server.h"
21 #include "audio_policy_service.h"
22 #include "audio_bluetooth_manager.h"
23 #include "audio_device_info.h"
24 using namespace std;
25 
26 namespace OHOS {
27 namespace AudioStandard {
28 using namespace std;
29 const int32_t LIMITSIZE = 4;
30 const int32_t SYSTEM_ABILITY_ID = 3009;
31 const bool RUN_ON_CREATE = false;
32 const std::u16string FORMMGR_INTERFACE_TOKEN = u"IAudioPolicy";
33 
AudioBluetoothManagerFuzzTest(const uint8_t *rawData, size_t size)34 void AudioBluetoothManagerFuzzTest(const uint8_t *rawData, size_t size)
35 {
36     if (rawData == nullptr || size < LIMITSIZE) {
37         return;
38     }
39 
40     std::shared_ptr<AudioPolicyServer> AudioPolicyServerPtr =
41         std::make_shared<AudioPolicyServer>(SYSTEM_ABILITY_ID, RUN_ON_CREATE);
42 
43     DeviceType devType = *reinterpret_cast<const DeviceType *>(rawData);
44     bool isConnected = *reinterpret_cast<const bool *>(rawData);
45     std::string macAddress(reinterpret_cast<const char*>(rawData), size);
46     std::string deviceName(reinterpret_cast<const char*>(rawData), size);
47 
48     AudioStreamInfo audioStreamInfo = {};
49     audioStreamInfo.samplingRate = *reinterpret_cast<const AudioSamplingRate *>(rawData);
50     audioStreamInfo.encoding = *reinterpret_cast<const AudioEncodingType *>(rawData);
51     audioStreamInfo.format = *reinterpret_cast<const AudioSampleFormat *>(rawData);
52     audioStreamInfo.channels = *reinterpret_cast<const AudioChannel *>(rawData);
53 
54     AudioPolicyServerPtr->audioPolicyService_
55         .OnDeviceStatusUpdated(devType, isConnected, macAddress, deviceName, audioStreamInfo);
56 
57     AudioPolicyServerPtr->audioPolicyService_
58         .OnDeviceConfigurationChanged(devType, macAddress, deviceName, audioStreamInfo);
59 }
60 
AudioA2dpManagerFuzzTest(const uint8_t *rawData, size_t size)61 void AudioA2dpManagerFuzzTest(const uint8_t *rawData, size_t size)
62 {
63     if (rawData == nullptr || size < LIMITSIZE) {
64         return;
65     }
66     std::string macAddress(reinterpret_cast<const char*>(rawData), size);
67     int32_t volume = *reinterpret_cast<const int32_t*>(rawData);
68     std::vector<Bluetooth::A2dpStreamInfo> info;
69     std::vector<int32_t> sessionsID = {};
70 
71     Bluetooth::AudioA2dpManager::SetDeviceAbsVolume(macAddress, volume);
72     Bluetooth::AudioA2dpManager::OffloadStartPlaying(sessionsID);
73     Bluetooth::AudioA2dpManager::OffloadStopPlaying(sessionsID);
74     Bluetooth::AudioA2dpManager::A2dpOffloadSessionRequest(info);
75 }
76 
AudioHfpManagerFuzzTest(const uint8_t *rawData, size_t size)77 void AudioHfpManagerFuzzTest(const uint8_t *rawData, size_t size)
78 {
79     if (rawData == nullptr || size < LIMITSIZE) {
80         return;
81     }
82     AudioScene scene = *reinterpret_cast<const AudioScene*>(rawData);
83     std::string macAddress(reinterpret_cast<const char*>(rawData), size);
84 
85     Bluetooth::AudioHfpManager::SetActiveHfpDevice(macAddress);
86     Bluetooth::AudioHfpManager::ConnectScoWithAudioScene(scene);
87     Bluetooth::AudioHfpManager::GetScoCategoryFromScene(scene);
88     Bluetooth::AudioHfpManager::UpdateAudioScene(scene);
89 }
90 
FetchOutputDeviceForTrackInternalFuzzTest(const uint8_t *rawData, size_t size)91 void FetchOutputDeviceForTrackInternalFuzzTest(const uint8_t *rawData, size_t size)
92 {
93     if (rawData == nullptr || size < LIMITSIZE) {
94         return;
95     }
96 
97     MessageParcel data;
98     data.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN);
99     data.WriteBuffer(rawData, size);
100     data.RewindRead(0);
101 
102     AudioStreamChangeInfo streamChangeInfo = {};
103     streamChangeInfo.audioRendererChangeInfo.Unmarshalling(data);
104     std::shared_ptr<AudioPolicyServer> AudioPolicyServerPtr =
105         std::make_shared<AudioPolicyServer>(SYSTEM_ABILITY_ID, RUN_ON_CREATE);
106     AudioPolicyServerPtr->audioPolicyService_.FetchOutputDeviceForTrack(streamChangeInfo,
107         AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN);
108 }
109 } // namespace AudioStandard
110 } // namesapce OHOS
111 
112 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)113 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
114 {
115     /* Run your code on data */
116     OHOS::AudioStandard::AudioBluetoothManagerFuzzTest(data, size);
117     OHOS::AudioStandard::AudioA2dpManagerFuzzTest(data, size);
118     OHOS::AudioStandard::AudioHfpManagerFuzzTest(data, size);
119     OHOS::AudioStandard::FetchOutputDeviceForTrackInternalFuzzTest(data, size);
120     return 0;
121 }
122