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 "user_auth_client_fuzzer.h"
17
18 #include "parcel.h"
19
20 #include "user_auth_client_impl.h"
21 #include "user_auth_callback_service.h"
22 #include "iam_fuzz_test.h"
23 #include "iam_logger.h"
24 #include "iam_ptr.h"
25
26 #define LOG_LABEL OHOS::UserIam::Common::LABEL_USER_AUTH_SDK
27
28 namespace OHOS {
29 namespace UserIam {
30 namespace UserAuth {
31 namespace {
32 class DummyGetPropCallback final : public GetPropCallback {
33 public:
OnResult(int32_t result,const Attributes & extraInfo)34 void OnResult(int32_t result, const Attributes &extraInfo)
35 {
36 IAM_LOGI("start");
37 static_cast<void>(result);
38 static_cast<void>(extraInfo);
39 }
40 };
41
42 class DummySetPropCallback final : public SetPropCallback {
43 public:
OnResult(int32_t result,const Attributes & extraInfo)44 void OnResult(int32_t result, const Attributes &extraInfo)
45 {
46 IAM_LOGI("start");
47 static_cast<void>(result);
48 static_cast<void>(extraInfo);
49 }
50 };
51
52 class DummyAuthenticationCallback final : public AuthenticationCallback {
53 public:
OnAcquireInfo(int32_t module,uint32_t acquireInfo,const Attributes & extraInfo)54 void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo)
55 {
56 IAM_LOGI("start");
57 static_cast<void>(module);
58 static_cast<void>(acquireInfo);
59 static_cast<void>(extraInfo);
60 }
61
OnResult(int32_t result,const Attributes & extraInfo)62 void OnResult(int32_t result, const Attributes &extraInfo)
63 {
64 IAM_LOGI("start");
65 static_cast<void>(result);
66 static_cast<void>(extraInfo);
67 }
68 };
69
70 class DummyIdentificationCallback final : public IdentificationCallback {
71 public:
OnAcquireInfo(int32_t module,uint32_t acquireInfo,const Attributes & extraInfo)72 void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo)
73 {
74 IAM_LOGI("start");
75 static_cast<void>(module);
76 static_cast<void>(acquireInfo);
77 static_cast<void>(extraInfo);
78 }
79
OnResult(int32_t result,const Attributes & extraInfo)80 void OnResult(int32_t result, const Attributes &extraInfo)
81 {
82 IAM_LOGI("start");
83 static_cast<void>(result);
84 static_cast<void>(extraInfo);
85 }
86 };
87
FuzzClientGetAvailableStatus(Parcel & parcel)88 void FuzzClientGetAvailableStatus(Parcel &parcel)
89 {
90 IAM_LOGI("start");
91 auto authType = static_cast<AuthType>(parcel.ReadInt32());
92 auto atl = static_cast<AuthTrustLevel>(parcel.ReadUint32());
93 UserAuthClientImpl::Instance().GetAvailableStatus(authType, atl);
94 IAM_LOGI("end");
95 }
96
FuzzClientGetProperty(Parcel & parcel)97 void FuzzClientGetProperty(Parcel &parcel)
98 {
99 IAM_LOGI("start");
100 int32_t userId = parcel.ReadInt32();
101 GetPropertyRequest request = {};
102 request.authType = static_cast<AuthType>(parcel.ReadInt32());
103 request.keys.push_back(static_cast<Attributes::AttributeKey>(parcel.ReadUint32()));
104 auto callback = Common::MakeShared<DummyGetPropCallback>();
105 UserAuthClient::GetInstance().GetProperty(userId, request, callback);
106 IAM_LOGI("end");
107 }
108
FuzzClientSetProperty(Parcel & parcel)109 void FuzzClientSetProperty(Parcel &parcel)
110 {
111 IAM_LOGI("start");
112 int32_t userId = parcel.ReadInt32();
113 SetPropertyRequest request = {};
114 request.authType = static_cast<AuthType>(parcel.ReadInt32());
115 request.mode = static_cast<PropertyMode>(parcel.ReadUint32());
116 auto callback = Common::MakeShared<DummySetPropCallback>();
117 UserAuthClient::GetInstance().SetProperty(userId, request, callback);
118 IAM_LOGI("end");
119 }
120
FuzzClientBeginAuthentication001(Parcel & parcel)121 void FuzzClientBeginAuthentication001(Parcel &parcel)
122 {
123 IAM_LOGI("start");
124 int32_t userId = parcel.ReadInt32();
125 std::vector<uint8_t> challenge;
126 Common::FillFuzzUint8Vector(parcel, challenge);
127 auto authType = static_cast<AuthType>(parcel.ReadInt32());
128 auto atl = static_cast<AuthTrustLevel>(parcel.ReadUint32());
129 auto callback = Common::MakeShared<DummyAuthenticationCallback>();
130 UserAuthClient::GetInstance().BeginAuthentication(userId, challenge, authType, atl, callback);
131 IAM_LOGI("end");
132 }
133
FuzzClientBeginAuthentication002(Parcel & parcel)134 void FuzzClientBeginAuthentication002(Parcel &parcel)
135 {
136 IAM_LOGI("start");
137 int32_t apiVersion = parcel.ReadInt32();
138 std::vector<uint8_t> challenge;
139 Common::FillFuzzUint8Vector(parcel, challenge);
140 auto authType = static_cast<AuthType>(parcel.ReadInt32());
141 auto atl = static_cast<AuthTrustLevel>(parcel.ReadUint32());
142 auto callback = Common::MakeShared<DummyAuthenticationCallback>();
143 UserAuthClientImpl::Instance().BeginNorthAuthentication(apiVersion, challenge, authType, atl, callback);
144 IAM_LOGI("end");
145 }
146
FuzzClientCancelAuthentication(Parcel & parcel)147 void FuzzClientCancelAuthentication(Parcel &parcel)
148 {
149 IAM_LOGI("start");
150 uint64_t contextId = parcel.ReadUint64();
151 UserAuthClient::GetInstance().CancelAuthentication(contextId);
152 IAM_LOGI("end");
153 }
154
FuzzClientBeginIdentification(Parcel & parcel)155 void FuzzClientBeginIdentification(Parcel &parcel)
156 {
157 IAM_LOGI("start");
158 std::vector<uint8_t> challenge;
159 Common::FillFuzzUint8Vector(parcel, challenge);
160 auto authType = static_cast<AuthType>(parcel.ReadInt32());
161 auto callback = Common::MakeShared<DummyIdentificationCallback>();
162 UserAuthClient::GetInstance().BeginIdentification(challenge, authType, callback);
163 IAM_LOGI("end");
164 }
165
FuzzCancelIdentification(Parcel & parcel)166 void FuzzCancelIdentification(Parcel &parcel)
167 {
168 IAM_LOGI("start");
169 uint64_t contextId = parcel.ReadUint64();
170 UserAuthClient::GetInstance().CancelIdentification(contextId);
171 IAM_LOGI("end");
172 }
173
FuzzClientGetVersion(Parcel & parcel)174 void FuzzClientGetVersion(Parcel &parcel)
175 {
176 IAM_LOGI("start");
177 static_cast<void>(parcel.ReadInt32());
178 int32_t version = -1;
179 UserAuthClientImpl::Instance().GetVersion(version);
180 IAM_LOGI("end");
181 }
182
183 auto g_UserAuthCallbackService =
184 Common::MakeShared<UserAuthCallbackService>(Common::MakeShared<DummyAuthenticationCallback>());
185
186 auto g_GetPropCallbackService =
187 Common::MakeShared<GetExecutorPropertyCallbackService>(Common::MakeShared<DummyGetPropCallback>());
188
189 auto g_SetPropCallbackService =
190 Common::MakeShared<SetExecutorPropertyCallbackService>(Common::MakeShared<DummySetPropCallback>());
191
FuzzUserAuthCallbackServiceOnResult(Parcel & parcel)192 void FuzzUserAuthCallbackServiceOnResult(Parcel &parcel)
193 {
194 IAM_LOGI("start");
195 int32_t result = parcel.ReadInt32();
196 std::vector<uint8_t> attr;
197 Common::FillFuzzUint8Vector(parcel, attr);
198 Attributes extraInfo(attr);
199 if (g_UserAuthCallbackService != nullptr) {
200 g_UserAuthCallbackService->OnResult(result, extraInfo);
201 }
202 IAM_LOGI("end");
203 }
204
FuzzUserAuthCallbackServiceOnAcquireInfo(Parcel & parcel)205 void FuzzUserAuthCallbackServiceOnAcquireInfo(Parcel &parcel)
206 {
207 IAM_LOGI("start");
208 int32_t result = parcel.ReadInt32();
209 int32_t acquireInfo = parcel.ReadInt32();
210 std::vector<uint8_t> attr;
211 Common::FillFuzzUint8Vector(parcel, attr);
212 Attributes extraInfo(attr);
213 if (g_UserAuthCallbackService != nullptr) {
214 g_UserAuthCallbackService->OnAcquireInfo(result, acquireInfo, extraInfo);
215 }
216 IAM_LOGI("end");
217 }
218
FuzzGetPropCallbackServiceOnPropResult(Parcel & parcel)219 void FuzzGetPropCallbackServiceOnPropResult(Parcel &parcel)
220 {
221 IAM_LOGI("start");
222 int32_t result = parcel.ReadInt32();
223 std::vector<uint8_t> attr;
224 Common::FillFuzzUint8Vector(parcel, attr);
225 Attributes extraInfo(attr);
226 if (g_GetPropCallbackService != nullptr) {
227 g_GetPropCallbackService->OnGetExecutorPropertyResult(result, extraInfo);
228 }
229 IAM_LOGI("end");
230 }
231
FuzzSetPropCallbackServiceOnPropResult(Parcel & parcel)232 void FuzzSetPropCallbackServiceOnPropResult(Parcel &parcel)
233 {
234 IAM_LOGI("start");
235 int32_t result = parcel.ReadInt32();
236 if (g_SetPropCallbackService != nullptr) {
237 g_SetPropCallbackService->OnSetExecutorPropertyResult(result);
238 }
239 IAM_LOGI("end");
240 }
241
242 using FuzzFunc = decltype(FuzzClientGetAvailableStatus);
243 FuzzFunc *g_fuzzFuncs[] = {
244 FuzzClientGetAvailableStatus,
245 FuzzClientGetProperty,
246 FuzzClientSetProperty,
247 FuzzClientBeginAuthentication001,
248 FuzzClientBeginAuthentication002,
249 FuzzClientCancelAuthentication,
250 FuzzClientBeginIdentification,
251 FuzzCancelIdentification,
252 FuzzClientGetVersion,
253 FuzzUserAuthCallbackServiceOnResult,
254 FuzzUserAuthCallbackServiceOnAcquireInfo,
255 FuzzGetPropCallbackServiceOnPropResult,
256 FuzzSetPropCallbackServiceOnPropResult,
257 };
258
UserAuthClientFuzzTest(const uint8_t * data,size_t size)259 void UserAuthClientFuzzTest(const uint8_t *data, size_t size)
260 {
261 Parcel parcel;
262 parcel.WriteBuffer(data, size);
263 parcel.RewindRead(0);
264 uint32_t index = parcel.ReadUint32() % (sizeof(g_fuzzFuncs) / sizeof(FuzzFunc *));
265 auto fuzzFunc = g_fuzzFuncs[index];
266 fuzzFunc(parcel);
267 return;
268 }
269 } // namespace
270 } // namespace UserAuth
271 } // namespace UserIam
272 } // namespace OHOS
273
274 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)275 extern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
276 {
277 OHOS::UserIam::UserAuth::UserAuthClientFuzzTest(data, size);
278 return 0;
279 }
280