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