1 /*
2  * Copyright (c) 2023 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 "account_module_defines.h"
17 #include "alg_loader.h"
18 #include "common_defs.h"
19 #include "device_auth.h"
20 #include "device_auth_defines.h"
21 #include "json_utils.h"
22 #include "securec.h"
23 #include "base_group_auth.h"
24 #include "json_utils.h"
25 #include "hc_string.h"
26 #include "group_auth_data_operation.h"
27 #include "account_related_group_auth.h"
28 #include "data_manager.h"
29 
30 namespace OHOS {
31 #define NUM_TWO 2
32 
SetUp()33 void SetUp()
34 {
35     (void)InitDeviceAuthService();
36 }
37 
TearDown()38 void TearDown()
39 {
40     DestroyDeviceAuthService();
41 }
42 
AccountRelatedGroupAuthTest001()43 void AccountRelatedGroupAuthTest001()
44 {
45     AccountRelatedGroupAuth *groupAuth = (AccountRelatedGroupAuth *)GetAccountRelatedGroupAuth();
46     CJson *param = CreateJson();
47     if (param == nullptr) {
48         return;
49     }
50     QueryGroupParams queryParams;
51     GroupEntryVec vec = CreateGroupEntryVec();
52     (void)groupAuth->getAccountCandidateGroup(0, param, &queryParams, &vec); // For unit test.
53 
54     AddStringToJson(param, FIELD_USER_ID, "unit_test"); // For unit test.
55     (void)groupAuth->getAccountCandidateGroup(0, param, &queryParams, &vec); // For unit test.
56     FreeJson(param);
57 
58     ClearGroupEntryVec(&vec);
59     // Identical group branch can not be dealed.
60 }
61 
OnTransmitTrue(int64_t requestId,const uint8_t * data,uint32_t dataLen)62 static bool OnTransmitTrue(int64_t requestId, const uint8_t *data, uint32_t dataLen)
63 {
64     (void)requestId;
65     (void)data;
66     (void)dataLen;
67     return true;
68 }
69 
OnTransmitFalse(int64_t requestId,const uint8_t * data,uint32_t dataLen)70 static bool OnTransmitFalse(int64_t requestId, const uint8_t *data, uint32_t dataLen)
71 {
72     (void)requestId;
73     (void)data;
74     (void)dataLen;
75     return false;
76 }
77 
OnSessionKeyReturned(int64_t requestId,const uint8_t * sessionKey,uint32_t sessionKeyLen)78 static void OnSessionKeyReturned(int64_t requestId, const uint8_t *sessionKey, uint32_t sessionKeyLen)
79 {
80     (void)requestId;
81     (void)sessionKey;
82     (void)sessionKeyLen;
83 }
84 
OnFinish(int64_t requestId,int operationCode,const char * returnData)85 static void OnFinish(int64_t requestId, int operationCode, const char *returnData)
86 {
87     (void)requestId;
88     (void)operationCode;
89     (void)returnData;
90 }
91 
OnError(int64_t requestId,int operationCode,int errorCode,const char * errorReturn)92 static void OnError(int64_t requestId, int operationCode, int errorCode, const char *errorReturn)
93 {
94     (void)requestId;
95     (void)operationCode;
96     (void)errorCode;
97     (void)errorReturn;
98 }
99 
OnRequest(int64_t requestId,int operationCode,const char * reqParams)100 static char *OnRequest(int64_t requestId, int operationCode, const char *reqParams)
101 {
102     (void)requestId;
103     (void)operationCode;
104     (void)reqParams;
105     return nullptr;
106 }
107 
108 static DeviceAuthCallback g_deviceAuthCallBack = {
109     .onTransmit = OnTransmitTrue,
110     .onSessionKeyReturned = OnSessionKeyReturned,
111     .onFinish = OnFinish,
112     .onError = OnError,
113     .onRequest = OnRequest
114 };
115 
AccountRelatedGroupAuthTest002()116 void AccountRelatedGroupAuthTest002()
117 {
118     CJson *authParam = CreateJson();
119     if (authParam == nullptr) {
120         return;
121     }
122     CJson *out = CreateJson();
123     if (out == nullptr) {
124         FreeJson(authParam);
125         return;
126     }
127     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
128 
129     CJson *sendToPeer = CreateJson();
130     if (out == nullptr) {
131         FreeJson(authParam);
132         FreeJson(out);
133         return;
134     }
135     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
136     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
137 
138     (void)AddStringToJson(sendToPeer, "test_key", "test_value"); // For unit test.
139     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
140     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
141 
142     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
143     FreeJson(sendToPeer);
144     FreeJson(out);
145     FreeJson(authParam);
146 }
147 
AccountRelatedGroupAuthTest0021()148 void AccountRelatedGroupAuthTest0021()
149 {
150     CJson *authParam = CreateJson();
151     if (authParam == nullptr) {
152         return;
153     }
154     CJson *out = CreateJson();
155     if (out == nullptr) {
156         FreeJson(authParam);
157         return;
158     }
159     CJson *sendToPeer = CreateJson();
160     if (sendToPeer == nullptr) {
161         FreeJson(authParam);
162         FreeJson(out);
163         return;
164     }
165     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
166 
167     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
168     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
169 
170     (void)AddStringToJson(sendToPeer, "test_key", "test_value"); // For unit test.
171     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
172     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, nullptr); // For unit test.
173 
174     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
175 
176     g_deviceAuthCallBack.onTransmit = OnTransmitFalse;
177     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
178     FreeJson(sendToPeer);
179     FreeJson(out);
180     FreeJson(authParam);
181 }
182 
183 // OnAccountFinish -> ReturnSessionKey success branch.
AccountRelatedGroupAuthTest0022()184 void AccountRelatedGroupAuthTest0022()
185 {
186     CJson *authParam = CreateJson();
187     if (authParam == nullptr) {
188         return;
189     }
190     CJson *out = CreateJson();
191     if (out == nullptr) {
192         FreeJson(authParam);
193         return;
194     }
195     CJson *sendToPeer = CreateJson();
196     if (sendToPeer == nullptr) {
197         FreeJson(authParam);
198         FreeJson(out);
199         return;
200     }
201 
202     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
203     (void)AddStringToJson(sendToPeer, "test_key", "test_value"); // For unit test.
204     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
205 
206     (void)AddIntToJson(authParam, FIELD_KEY_LENGTH, NUM_TWO); // For unit test.
207     uint8_t sessionKeyTest[2] = { 0x31, 0x32 }; // For unit test.
208     (void)AddByteToJson(out, FIELD_SESSION_KEY, sessionKeyTest, sizeof(sessionKeyTest));
209     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
210     FreeJson(sendToPeer);
211     FreeJson(out);
212     FreeJson(authParam);
213 }
214 
215 // OnAccountFinish -> AddTrustedDeviceForAccount success failed.
AccountRelatedGroupAuthTest0023()216 void AccountRelatedGroupAuthTest0023()
217 {
218     CJson *authParam = CreateJson();
219     CJson *out = CreateJson();
220     CJson *sendToPeer = CreateJson();
221 
222     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
223     (void)AddStringToJson(sendToPeer, "test_key", "test_value"); // For unit test.
224     (void)AddObjToJson(out, FIELD_SEND_TO_PEER, sendToPeer);
225 
226     (void)AddIntToJson(authParam, FIELD_KEY_LENGTH, NUM_TWO); // For unit test.
227     uint8_t sessionKeyTest[2] = { 0x31, 0x32 }; // For unit test.
228     (void)AddByteToJson(out, FIELD_SESSION_KEY, sessionKeyTest, sizeof(sessionKeyTest));
229 
230     (void)AddIntToJson(authParam, FIELD_OS_ACCOUNT_ID, 0);
231     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
232 
233     (void)AddStringToJson(authParam, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
234     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
235 
236     (void)AddStringToJson(authParam, FIELD_GROUP_ID, "GROUP_ID"); // For unit test.
237     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
238 
239     CJson *sendToSelf = CreateJson();
240 
241     (void)AddObjToJson(out, FIELD_SEND_TO_SELF, sendToSelf);
242     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
243 
244     (void)AddIntToJson(sendToSelf, FIELD_CREDENTIAL_TYPE, NUM_TWO);
245     (void)AddObjToJson(out, FIELD_SEND_TO_SELF, sendToSelf);
246     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
247 
248     (void)AddStringToJson(sendToSelf, FIELD_DEV_ID, "DEV_ID"); // For unit test.
249     (void)AddObjToJson(out, FIELD_SEND_TO_SELF, sendToSelf);
250     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
251 
252     (void)AddStringToJson(sendToSelf, FIELD_USER_ID, "USER_ID"); // For unit test.
253     (void)AddObjToJson(out, FIELD_SEND_TO_SELF, sendToSelf);
254     (void)GetAccountRelatedGroupAuth()->onFinish(0, authParam, out, &g_deviceAuthCallBack); // For unit test.
255 
256     FreeJson(sendToSelf);
257     FreeJson(out);
258     FreeJson(sendToPeer);
259     FreeJson(authParam);
260 }
261 
AccountRelatedGroupAuthTest004()262 void AccountRelatedGroupAuthTest004()
263 {
264     TrustedGroupEntry *entry = CreateGroupEntry();
265     if (entry == nullptr) {
266         return;
267     }
268     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
269     if (localAuthInfo == nullptr) {
270         DestroyGroupEntry(entry);
271         return;
272     }
273     CJson *paramsData = CreateJson();
274     if (paramsData == nullptr) {
275         DestroyGroupEntry(entry);
276         DestroyDeviceEntry(localAuthInfo);
277         return;
278     }
279 
280     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry, localAuthInfo, paramsData); // For unit test.
281 
282     FreeJson(paramsData);
283     DestroyGroupEntry(entry);
284     DestroyDeviceEntry(localAuthInfo);
285 }
286 
AccountRelatedGroupAuthTest0041()287 void AccountRelatedGroupAuthTest0041()
288 {
289     TrustedGroupEntry *entry = CreateGroupEntry();
290     if (entry == nullptr) {
291         return;
292     }
293     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
294     if (localAuthInfo == nullptr) {
295         DestroyGroupEntry(entry);
296         return;
297     }
298     CJson *paramsData = CreateJson();
299     if (paramsData == nullptr) {
300         DestroyGroupEntry(entry);
301         DestroyDeviceEntry(localAuthInfo);
302         return;
303     }
304 
305     (void)AddStringToJson(paramsData, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
306     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry,
307         localAuthInfo, paramsData); // For unit test.
308 
309     FreeJson(paramsData);
310     DestroyGroupEntry(entry);
311     DestroyDeviceEntry(localAuthInfo);
312 }
313 
AccountRelatedGroupAuthTest0042()314 void AccountRelatedGroupAuthTest0042()
315 {
316     TrustedGroupEntry *entry = CreateGroupEntry();
317     if (entry == nullptr) {
318         return;
319     }
320     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
321     if (localAuthInfo == nullptr) {
322         DestroyGroupEntry(entry);
323         return;
324     }
325     CJson *paramsData = CreateJson();
326     if (paramsData == nullptr) {
327         DestroyGroupEntry(entry);
328         DestroyDeviceEntry(localAuthInfo);
329         return;
330     }
331     (void)AddStringToJson(paramsData, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
332 
333     entry->userId = CreateString();
334     (void)StringSetPointer(&entry->userId, "selfUserId"); // For unit test.
335     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry,
336         localAuthInfo, paramsData); // For unit test.
337 
338     FreeJson(paramsData);
339     DestroyGroupEntry(entry);
340     DestroyDeviceEntry(localAuthInfo);
341 }
342 
AccountRelatedGroupAuthTest0043()343 void AccountRelatedGroupAuthTest0043()
344 {
345     TrustedGroupEntry *entry = CreateGroupEntry();
346     if (entry == nullptr) {
347         return;
348     }
349     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
350     if (localAuthInfo == nullptr) {
351         DestroyGroupEntry(entry);
352         return;
353     }
354     CJson *paramsData = CreateJson();
355     if (paramsData == nullptr) {
356         DestroyGroupEntry(entry);
357         DestroyDeviceEntry(localAuthInfo);
358         return;
359     }
360     (void)AddStringToJson(paramsData, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
361     entry->userId = CreateString();
362     (void)StringSetPointer(&entry->userId, "selfUserId"); // For unit test.
363 
364     entry->id = CreateString();
365     (void)StringSetPointer(&entry->id, "groupId"); // For unit test.
366     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry,
367         localAuthInfo, paramsData); // For unit test.
368 
369     FreeJson(paramsData);
370     DestroyGroupEntry(entry);
371     DestroyDeviceEntry(localAuthInfo);
372 }
373 
AccountRelatedGroupAuthTest00431()374 void AccountRelatedGroupAuthTest00431()
375 {
376     TrustedGroupEntry *entry = CreateGroupEntry();
377     if (entry == nullptr) {
378         return;
379     }
380     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
381     if (localAuthInfo == nullptr) {
382         DestroyGroupEntry(entry);
383         return;
384     }
385     CJson *paramsData = CreateJson();
386     if (paramsData == nullptr) {
387         DestroyGroupEntry(entry);
388         DestroyDeviceEntry(localAuthInfo);
389         return;
390     }
391     (void)AddStringToJson(paramsData, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
392     entry->userId = CreateString();
393     (void)StringSetPointer(&entry->userId, "selfUserId"); // For unit test.
394 
395     entry->id = CreateString();
396     (void)StringSetPointer(&entry->id, "groupId"); // For unit test.
397 
398     localAuthInfo->udid = CreateString();
399     (void)StringSetPointer(&localAuthInfo->udid, "selfDeviceId"); // For unit test.
400     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry,
401         localAuthInfo, paramsData); // For unit test.
402 
403     FreeJson(paramsData);
404     DestroyGroupEntry(entry);
405     DestroyDeviceEntry(localAuthInfo);
406 }
407 
AccountRelatedGroupAuthTest0044()408 void AccountRelatedGroupAuthTest0044()
409 {
410     TrustedGroupEntry *entry = CreateGroupEntry();
411     if (entry == nullptr) {
412         return;
413     }
414     TrustedDeviceEntry *localAuthInfo = CreateDeviceEntry();
415     if (localAuthInfo == nullptr) {
416         DestroyGroupEntry(entry);
417         return;
418     }
419     CJson *paramsData = CreateJson();
420     if (paramsData == nullptr) {
421         DestroyGroupEntry(entry);
422         DestroyDeviceEntry(localAuthInfo);
423         return;
424     }
425     entry->userId = CreateString();
426     (void)StringSetPointer(&entry->userId, "selfUserId");
427     entry->id = CreateString();
428     (void)StringSetPointer(&entry->id, "groupId");
429 
430     localAuthInfo->udid = CreateString();
431     (void)StringSetPointer(&localAuthInfo->udid, "selfDeviceId");
432     localAuthInfo->udid = CreateString();
433     (void)StringSetPointer(&localAuthInfo->udid, "selfDevId");
434 
435     (void)AddStringToJson(paramsData, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID");
436     (void)GetAccountRelatedGroupAuth()->fillDeviceAuthInfo(0, entry,
437         localAuthInfo, paramsData); // For unit test.
438 
439     FreeJson(paramsData);
440     DestroyGroupEntry(entry);
441     DestroyDeviceEntry(localAuthInfo);
442 }
443 
AccountRelatedGroupAuthTest007()444 void AccountRelatedGroupAuthTest007()
445 {
446     CJson *confirmationJson = CreateJson();
447     if (confirmationJson == nullptr) {
448         return;
449     }
450     CJson *dataFromClient = CreateJson();
451     if (dataFromClient == nullptr) {
452         FreeJson(confirmationJson);
453         return;
454     }
455     (void)GetAccountRelatedGroupAuth()->combineServerConfirmParams(confirmationJson, dataFromClient);
456     FreeJson(confirmationJson);
457     FreeJson(dataFromClient);
458 }
459 
AccountRelatedGroupAuthTest0071()460 void AccountRelatedGroupAuthTest0071()
461 {
462     CJson *confirmationJson = CreateJson();
463     if (confirmationJson == nullptr) {
464         return;
465     }
466     CJson *dataFromClient = CreateJson();
467     if (dataFromClient == nullptr) {
468         FreeJson(confirmationJson);
469         return;
470     }
471 
472     (void)AddStringToJson(confirmationJson, FIELD_PEER_CONN_DEVICE_ID, "CONN_DEVICE_ID"); // For unit test.
473     (void)GetAccountRelatedGroupAuth()->combineServerConfirmParams(confirmationJson, dataFromClient);
474     FreeJson(confirmationJson);
475     FreeJson(dataFromClient);
476 }
477 // Ending for account_related_group_auth.c test.
478 
FuzzDoRegCallback(const uint8_t * data,size_t size)479 bool FuzzDoRegCallback(const uint8_t* data, size_t size)
480 {
481     (void)data;
482     (void)size;
483     SetUp();
484     AccountRelatedGroupAuthTest001();
485     AccountRelatedGroupAuthTest002();
486     AccountRelatedGroupAuthTest0021();
487     AccountRelatedGroupAuthTest0022();
488     AccountRelatedGroupAuthTest0023();
489     AccountRelatedGroupAuthTest004();
490     AccountRelatedGroupAuthTest0041();
491     AccountRelatedGroupAuthTest0042();
492     AccountRelatedGroupAuthTest0043();
493     AccountRelatedGroupAuthTest00431();
494     AccountRelatedGroupAuthTest0044();
495     AccountRelatedGroupAuthTest007();
496     AccountRelatedGroupAuthTest0071();
497 
498     TearDown();
499     return true;
500 }
501 
502 }
503 
504 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)505 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
506 {
507     /* Run your code on data */
508     OHOS::FuzzDoRegCallback(data, size);
509     return 0;
510 }
511 
512