1 /*
2  * Copyright (c) 2022 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 "getohosaccountinfo_fuzzer.h"
17 
18 #include "account_proxy.h"
19 #include "account_info.h"
20 #include "account_log_wrapper.h"
21 #include "distributed_account_subscribe_callback.h"
22 #include "fuzz_data.h"
23 #include "ohos_account_kits.h"
24 #include <cstdint>
25 #include <string>
26 #include <vector>
27 
28 using namespace std;
29 using namespace OHOS::AccountSA;
30 
31 class MockDistributedAccountSubscribeCallback final : public DistributedAccountSubscribeCallback {
32 public:
MockDistributedAccountSubscribeCallback()33     explicit MockDistributedAccountSubscribeCallback()
34     {}
35 
OnAccountsChanged(const DistributedAccountEventData & eventData)36     void OnAccountsChanged(const DistributedAccountEventData &eventData)
37     {}
38 };
39 namespace OHOS {
40 namespace {
41 static constexpr uint32_t OHOS_ACCOUNT_STATE_NUM = 5;
42 }
GetOhosAccountInfoFuzzTest(const uint8_t * data,size_t size)43 bool GetOhosAccountInfoFuzzTest(const uint8_t* data, size_t size)
44 {
45     int32_t result;
46     OhosAccountInfo testOhosAccountInfo;
47     result = OhosAccountKits::GetInstance().GetOhosAccountInfo(testOhosAccountInfo);
48     return result == ERR_OK;
49 }
50 
GetOhosAccountInfoByUserIdFuzzTest(const uint8_t * data,size_t size)51 bool GetOhosAccountInfoByUserIdFuzzTest(const uint8_t* data, size_t size)
52 {
53     if ((data == nullptr) || (size == 0)) {
54         return false;
55     }
56     int32_t result;
57     OhosAccountInfo testOhosAccountInfo;
58     FuzzData fuzzData(data, size);
59     int32_t userId = fuzzData.GetData<int32_t>();
60     result = OhosAccountKits::GetInstance().GetOhosAccountInfoByUserId(userId, testOhosAccountInfo);
61     return result == ERR_OK;
62 }
63 
SubscribeDistributedAccountEventFuzzTest(const uint8_t * data,size_t size)64 bool SubscribeDistributedAccountEventFuzzTest(const uint8_t* data, size_t size)
65 {
66     if ((data == nullptr) || (size == 0)) {
67         return false;
68     }
69     int32_t result;
70     FuzzData fuzzData(data, size);
71     auto loginSubscribeCallback = std::make_shared<MockDistributedAccountSubscribeCallback>();
72     DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type = static_cast<DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE>(
73         fuzzData.GetData<int32_t>() % 4);
74     result = OhosAccountKits::GetInstance().SubscribeDistributedAccountEvent(type, loginSubscribeCallback);
75     return result == ERR_OK;
76 }
77 
UnsubscribeDistributedAccountEventFuzzTest(const uint8_t * data,size_t size)78 bool UnsubscribeDistributedAccountEventFuzzTest(const uint8_t* data, size_t size)
79 {
80     if ((data == nullptr) || (size == 0)) {
81         return false;
82     }
83     int32_t result;
84     FuzzData fuzzData(data, size);
85     auto loginSubscribeCallback = std::make_shared<MockDistributedAccountSubscribeCallback>();
86     DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type = static_cast<DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE>(
87         fuzzData.GetData<int32_t>() % 4);
88     result = OhosAccountKits::GetInstance().UnsubscribeDistributedAccountEvent(type, loginSubscribeCallback);
89     return result == ERR_OK;
90 }
91 
SetOhosAccountInfoByUserIdFuzzTest(const uint8_t * data,size_t size)92 bool SetOhosAccountInfoByUserIdFuzzTest(const uint8_t* data, size_t size)
93 {
94     if ((data == nullptr) || (size == 0)) {
95         return false;
96     }
97     std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
98     FuzzData fuzzData(data, size);
99     int32_t userId = fuzzData.GetData<int32_t>();
100     OhosAccountInfo testOhosAccountInfo(
101         fuzzData.GenerateRandomString(),
102         fuzzData.GenerateRandomString(),
103         fuzzData.GetData<int32_t>() % OHOS_ACCOUNT_STATE_NUM - 1
104     );
105     std::string testEventStr(fuzzData.GenerateRandomString());
106     int32_t result = accountProxy->SetOhosAccountInfoByUserId(userId, testOhosAccountInfo, testEventStr);
107     return result == ERR_OK;
108 }
109 
GetOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t * data,size_t size)110 bool GetOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t* data, size_t size)
111 {
112     if ((data == nullptr) || (size == 0)) {
113         return false;
114     }
115     std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
116     OhosAccountInfo testOhosAccountInfo;
117     int32_t result = accountProxy->QueryOhosAccountInfo(testOhosAccountInfo);
118     result = accountProxy->GetOhosAccountInfo(testOhosAccountInfo);
119     FuzzData fuzzData(data, size);
120     int32_t userId = fuzzData.GetData<int32_t>();
121     result = accountProxy->GetOhosAccountInfoByUserId(userId, testOhosAccountInfo);
122     return result == ERR_OK;
123 }
124 
QueryOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t * data,size_t size)125 bool QueryOhosAccountInfoByUserIdProxyFuzzTest(const uint8_t* data, size_t size)
126 {
127     if ((data == nullptr) || (size == 0)) {
128         return false;
129     }
130     std::shared_ptr<AccountProxy> accountProxy = std::make_shared<AccountProxy>(nullptr);
131     OhosAccountInfo testOhosAccountInfo;
132     FuzzData fuzzData(data, size);
133     int32_t userId = fuzzData.GetData<int32_t>();
134     int32_t accountId = 0;
135     int32_t result = accountProxy->QueryDeviceAccountId(accountId);
136     result = accountProxy->QueryOhosAccountInfoByUserId(userId, testOhosAccountInfo);
137     return result == ERR_OK;
138 }
139 }
140 
141 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)142 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
143 {
144     /* Run your code on data */
145     OHOS::GetOhosAccountInfoFuzzTest(data, size);
146     OHOS::GetOhosAccountInfoByUserIdFuzzTest(data, size);
147     OHOS::SubscribeDistributedAccountEventFuzzTest(data, size);
148     OHOS::UnsubscribeDistributedAccountEventFuzzTest(data, size);
149     OHOS::SetOhosAccountInfoByUserIdFuzzTest(data, size);
150     OHOS::GetOhosAccountInfoByUserIdProxyFuzzTest(data, size);
151     OHOS::QueryOhosAccountInfoByUserIdProxyFuzzTest(data, size);
152     return 0;
153 }
154 
155