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 "getcredentialinfo_fuzzer.h"
17 
18 #include <string>
19 #include <vector>
20 #define private public
21 #include "account_iam_client.h"
22 #include "account_iam_mgr_proxy.h"
23 #undef private
24 #include "fuzz_data.h"
25 
26 
27 using namespace std;
28 using namespace OHOS::AccountSA;
29 
30 class MockIDMCallback : public OHOS::AccountSA::GetCredInfoCallback {
31 public:
~MockIDMCallback()32     virtual ~MockIDMCallback() {}
OnCredentialInfo(int32_t result,const std::vector<CredentialInfo> & infoList)33     void OnCredentialInfo(int32_t result, const std::vector<CredentialInfo> &infoList) override
34     {
35         return;
36     }
37 };
38 
39 class MockPreRemoteAuthCallback : public OHOS::AccountSA::PreRemoteAuthCallback {
40 public:
OnResult(int32_t result)41     void OnResult(int32_t result)
42     {
43         return;
44     }
~MockPreRemoteAuthCallback()45     virtual ~MockPreRemoteAuthCallback() {}
46 };
47 class PreRemoteAuthCallbackMockTest final : public OHOS::AccountSA::PreRemoteAuthCallback {
48 public:
OnResult(int32_t result)49     void OnResult(int32_t result) override
50     {
51         result_ = result;
52     }
53     int32_t result_;
54 };
55 
56 class MockIDMCallback1 : public OHOS::AccountSA::IDMCallback {
57 public:
~MockIDMCallback1()58     virtual ~MockIDMCallback1() {}
OnAcquireInfo(int32_t module,uint32_t acquireInfo,const Attributes & extraInfo)59     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override
60     {
61         return;
62     }
OnResult(int32_t result,const Attributes & extraInfo)63     void OnResult(int32_t result, const Attributes &extraInfo) override
64     {
65         return;
66     }
67 };
68 
69 class MockGetEnrolledIdCallback final : public GetEnrolledIdCallback {
70 public:
OnEnrolledId(int32_t result,uint64_t enrolledId)71     void OnEnrolledId(int32_t result, uint64_t enrolledId) override
72     {
73         result_ = result;
74         return;
75     }
76 
77 public:
78     int32_t result_ = -1;
79 };
80 
81 class MockIInputer : public OHOS::AccountSA::IInputer {
82 public:
~MockIInputer()83     virtual ~MockIInputer() {}
OnGetData(int32_t authSubType,std::vector<uint8_t> challenge,std::shared_ptr<IInputerData> inputerData)84     void OnGetData(int32_t authSubType, std::vector<uint8_t> challenge,
85         std::shared_ptr<IInputerData> inputerData) override
86     {
87         return;
88     }
89 };
90 
91 namespace OHOS {
GetCredentialInfoFuzzTest(const uint8_t * data,size_t size)92 bool GetCredentialInfoFuzzTest(const uint8_t* data, size_t size)
93 {
94     if ((data == nullptr) || (size == 0)) {
95         return false;
96     }
97     FuzzData fuzzData(data, size);
98     int32_t userId = fuzzData.GetData<int32_t>();
99     AuthType authType = fuzzData.GenerateRandomEnmu(UserIam::UserAuth::RECOVERY_KEY);
100     std::shared_ptr<GetCredInfoCallback> callback = make_shared<MockIDMCallback>();
101     int32_t result = AccountIAMClient::GetInstance().GetCredentialInfo(userId, authType, callback);
102     return result == ERR_OK;
103 }
104 
StartDomainAuthFuzzTest(const uint8_t * data,size_t size)105 bool StartDomainAuthFuzzTest(const uint8_t* data, size_t size)
106 {
107     if ((data == nullptr) || (size == 0)) {
108         return false;
109     }
110     FuzzData fuzzData(data, size);
111     int32_t userId = fuzzData.GetData<int32_t>();
112     std::shared_ptr<IDMCallback> callback = make_shared<MockIDMCallback1>();
113     int32_t result = AccountIAMClient::GetInstance().StartDomainAuth(userId, callback);
114     return result == ERR_OK;
115 }
116 
PrepareRemoteAuthFuzzTest(const uint8_t * data,size_t size)117 bool PrepareRemoteAuthFuzzTest(const uint8_t* data, size_t size)
118 {
119     if ((data == nullptr) || (size == 0)) {
120         return false;
121     }
122     FuzzData fuzzData(data, size);
123     std::string remoteNetworkId(fuzzData.GenerateRandomString());
124     std::shared_ptr<PreRemoteAuthCallback> callback = make_shared<MockPreRemoteAuthCallback>();
125     int32_t result = AccountIAMClient::GetInstance().PrepareRemoteAuth(remoteNetworkId, callback);
126     return result == ERR_OK;
127 }
128 
GetEnrolledIdFuzzTest(const uint8_t * data,size_t size)129 bool GetEnrolledIdFuzzTest(const uint8_t* data, size_t size)
130 {
131     if ((data == nullptr) || (size == 0)) {
132         return false;
133     }
134     FuzzData fuzzData(data, size);
135     int32_t userId = fuzzData.GetData<int32_t>();
136     AuthType authType = static_cast<AuthType>(fuzzData.GenerateRandomEnmu(IAMAuthType::TYPE_END));
137     auto callback = std::make_shared<MockGetEnrolledIdCallback>();
138     AccountIAMClient::GetInstance().GetEnrolledId(userId, authType, callback);
139     return callback->result_ == ERR_OK;
140 }
141 
RegisterPINInputerTest(const uint8_t * data,size_t size)142 bool RegisterPINInputerTest(const uint8_t* data, size_t size)
143 {
144     if ((data == nullptr) || (size == 0)) {
145         return false;
146     }
147     std::shared_ptr<IInputer> inputer = make_shared<MockIInputer>();
148     int32_t result = AccountIAMClient::GetInstance().RegisterPINInputer(inputer);
149     result = AccountIAMClient::GetInstance().RegisterDomainInputer(inputer);
150     return result == ERR_OK;
151 }
152 
OpenSessionFuzzTest(const uint8_t * data,size_t size)153 bool OpenSessionFuzzTest(const uint8_t* data, size_t size)
154 {
155     if ((data == nullptr) || (size == 0)) {
156         return false;
157     }
158     FuzzData fuzzData(data, size);
159     int32_t userId = fuzzData.GetData<int32_t>();
160     std::shared_ptr<AccountIAMMgrProxy> accountIAMMgrProxy = std::make_shared<AccountIAMMgrProxy>(nullptr);
161     std::vector<uint8_t> challenge;
162     int32_t result = accountIAMMgrProxy->OpenSession(userId, challenge);
163     return result == ERR_OK;
164 }
165 
CloseSessionFuzzTest(const uint8_t * data,size_t size)166 bool CloseSessionFuzzTest(const uint8_t* data, size_t size)
167 {
168     if ((data == nullptr) || (size == 0)) {
169         return false;
170     }
171     FuzzData fuzzData(data, size);
172     int32_t userId = fuzzData.GetData<int32_t>();
173     std::shared_ptr<AccountIAMMgrProxy> accountIAMMgrProxy = std::make_shared<AccountIAMMgrProxy>(nullptr);
174     int32_t result = accountIAMMgrProxy->CloseSession(userId);
175     return result == ERR_OK;
176 }
177 
CancelFuzzTest(const uint8_t * data,size_t size)178 bool CancelFuzzTest(const uint8_t* data, size_t size)
179 {
180     if ((data == nullptr) || (size == 0)) {
181         return false;
182     }
183     FuzzData fuzzData(data, size);
184     int32_t userId = fuzzData.GetData<int32_t>();
185     std::shared_ptr<AccountIAMMgrProxy> accountIAMMgrProxy = std::make_shared<AccountIAMMgrProxy>(nullptr);
186     int32_t result = accountIAMMgrProxy->Cancel(userId);
187     return result == ERR_OK;
188 }
189 }
190 
191 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)192 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
193 {
194     /* Run your code on data */
195     OHOS::GetCredentialInfoFuzzTest(data, size);
196     OHOS::StartDomainAuthFuzzTest(data, size);
197     OHOS::PrepareRemoteAuthFuzzTest(data, size);
198     OHOS::GetEnrolledIdFuzzTest(data, size);
199     OHOS::RegisterPINInputerTest(data, size);
200     OHOS::OpenSessionFuzzTest(data, size);
201     OHOS::CloseSessionFuzzTest(data, size);
202     OHOS::CancelFuzzTest(data, size);
203     return 0;
204 }
205