• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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