• 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 "lnn_decision_db.h"
17 
18 #include <securec.h>
19 
20 #include "anonymizer.h"
21 #include "bus_center_info_key.h"
22 #include "bus_center_manager.h"
23 #include "lnn_async_callback_utils.h"
24 #include "lnn_ohos_account.h"
25 #include "lnn_file_utils.h"
26 #include "lnn_heartbeat_ctrl.h"
27 #include "lnn_huks_utils.h"
28 #include "lnn_log.h"
29 #include "sqlite3_utils.h"
30 
31 #include "softbus_adapter_crypto.h"
32 #include "softbus_adapter_file.h"
33 #include "softbus_adapter_mem.h"
34 #include "softbus_common.h"
35 #include "softbus_error_code.h"
36 #include "softbus_utils.h"
37 
38 typedef struct {
39     ListNode node;
40     TrustedDevInfoRecord infoRecord;
41 } DeviceDbInfo;
42 
43 static ListNode g_deviceInfoList = { &g_deviceInfoList, &g_deviceInfoList };
44 static SoftBusMutex g_deviceDbMutex;
45 static SoftBusMutex g_dbMutex;
46 
47 static bool g_isDbListInit = false;
48 
49 #define LNN_DB_KEY_LEN 1024
50 #define LNN_DB_KEY_AILAS "dsoftbus_decision_db_key_alias"
51 #define DEFAULT_USER_ID "0"
52 
53 static struct HksBlob g_keyAlias = { sizeof(LNN_DB_KEY_AILAS), (uint8_t *)LNN_DB_KEY_AILAS };
54 static struct HksBlob g_ceKeyAlias = { sizeof(LNN_DB_KEY_AILAS), (uint8_t *)LNN_DB_KEY_AILAS };
55 
56 static int32_t GetLocalAccountHexHash(char *accountHexHash);
57 
DeviceDbRecoveryInit(void)58 static bool DeviceDbRecoveryInit(void)
59 {
60     if (SoftBusMutexInit(&g_deviceDbMutex, NULL) != SOFTBUS_OK) {
61         LNN_LOGE(LNN_LEDGER, "g_deviceDbMutex init fail");
62         return false;
63     }
64     if (SoftBusMutexInit(&g_dbMutex, NULL) != SOFTBUS_OK) {
65         SoftBusMutexDestroy(&g_deviceDbMutex);
66         LNN_LOGE(LNN_LEDGER, "g_isDbMutexInit init fail");
67         return false;
68     }
69     g_isDbListInit = true;
70     return true;
71 }
72 
DeviceDbListLock(void)73 static int32_t DeviceDbListLock(void)
74 {
75     if (!g_isDbListInit) {
76         if (!DeviceDbRecoveryInit()) {
77             return SOFTBUS_NETWORK_DB_LOCK_INIT_FAILED;
78         }
79     }
80     return SoftBusMutexLock(&g_deviceDbMutex);
81 }
82 
DeviceDbListUnlock(void)83 static void DeviceDbListUnlock(void)
84 {
85     if (!g_isDbListInit) {
86         (void)DeviceDbRecoveryInit();
87         return;
88     }
89     (void)SoftBusMutexUnlock(&g_deviceDbMutex);
90 }
91 
DbLock(void)92 static int32_t DbLock(void)
93 {
94     if (!g_isDbListInit) {
95         if (!DeviceDbRecoveryInit()) {
96             LNN_LOGE(LNN_LEDGER, "g_isDbListInit init fail");
97             return SOFTBUS_NETWORK_DB_LOCK_INIT_FAILED;
98         }
99     }
100     return SoftBusMutexLock(&g_dbMutex);
101 }
102 
DbUnlock(void)103 static void DbUnlock(void)
104 {
105     if (!g_isDbListInit) {
106         if (!DeviceDbRecoveryInit()) {
107             LNN_LOGE(LNN_LEDGER, "g_isDbListInit init fail");
108             return;
109         }
110     }
111     (void)SoftBusMutexUnlock(&g_dbMutex);
112 }
113 
EncryptStorageData(LnnEncryptDataLevel level,uint8_t * dbKey,uint32_t len)114 int32_t EncryptStorageData(LnnEncryptDataLevel level, uint8_t *dbKey, uint32_t len)
115 {
116     struct HksBlob plainData = { 0 };
117     struct HksBlob encryptData = { 0 };
118     if (level < LNN_ENCRYPT_LEVEL_DE || level > LNN_ENCRYPT_LEVEL_ECE) {
119         LNN_LOGE(LNN_LEDGER, "invalid param, level=%{public}u", level);
120         return SOFTBUS_MEM_ERR;
121     }
122     encryptData.data = (uint8_t *)SoftBusCalloc(len);
123     if (encryptData.data == NULL) {
124         LNN_LOGE(LNN_LEDGER, "calloc encrypt dbKey fail");
125         return SOFTBUS_MALLOC_ERR;
126     }
127     LNN_LOGI(LNN_LEDGER, "Encrypt data, level=%{public}u len=%{public}u", level, len);
128     plainData.size = len;
129     plainData.data = dbKey;
130     int32_t ret = SOFTBUS_OK;
131     if (level == LNN_ENCRYPT_LEVEL_CE) {
132         ret = LnnCeEncryptDataByHuks(&g_ceKeyAlias, &plainData, &encryptData);
133     } else {
134         ret = LnnEncryptDataByHuks(&g_keyAlias, &plainData, &encryptData);
135     }
136     if (ret != SOFTBUS_OK) {
137         LNN_LOGE(LNN_LEDGER, "encrypt dbKey by huks fail, ret=%{public}d", ret);
138         (void)memset_s(plainData.data, len, 0x0, len);
139         SoftBusFree(encryptData.data);
140         return ret;
141     }
142     LNN_LOGW(LNN_LEDGER, "encrypt dbKey log for audit");
143     (void)memset_s(plainData.data, len, 0x0, len);
144     if (memcpy_s(dbKey, len, encryptData.data, len) != SOFTBUS_OK) {
145         LNN_LOGE(LNN_LEDGER, "memcpy_s dbKey fail");
146         SoftBusFree(encryptData.data);
147         return SOFTBUS_MEM_ERR;
148     }
149     SoftBusFree(encryptData.data);
150     return SOFTBUS_OK;
151 }
152 
DecryptStorageData(LnnEncryptDataLevel level,uint8_t * dbKey,uint32_t len)153 int32_t DecryptStorageData(LnnEncryptDataLevel level, uint8_t *dbKey, uint32_t len)
154 {
155     struct HksBlob encryptData = { 0 };
156     struct HksBlob decryptData = { 0 };
157     if (level < LNN_ENCRYPT_LEVEL_DE || level > LNN_ENCRYPT_LEVEL_ECE) {
158         LNN_LOGE(LNN_LEDGER, "invalid param, level=%{public}u", level);
159         return SOFTBUS_MEM_ERR;
160     }
161     decryptData.data = (uint8_t *)SoftBusCalloc(len);
162     if (decryptData.data == NULL) {
163         LNN_LOGE(LNN_LEDGER, "calloc decrypt dbKey fail");
164         return SOFTBUS_MEM_ERR;
165     }
166     encryptData.size = len;
167     encryptData.data = dbKey;
168     int32_t ret;
169     do {
170         if (level == LNN_ENCRYPT_LEVEL_CE) {
171             ret = LnnCeDecryptDataByHuks(&g_ceKeyAlias, &encryptData, &decryptData);
172         } else {
173             ret = LnnDecryptDataByHuks(&g_keyAlias, &encryptData, &decryptData);
174         }
175         if (ret != SOFTBUS_OK) {
176             LNN_LOGE(LNN_LEDGER, "decrypt dbKey by huks fail, ret=%{public}d", ret);
177             break;
178         }
179         if (memcpy_s(dbKey, len, decryptData.data, decryptData.size) != SOFTBUS_OK) {
180             LNN_LOGE(LNN_LEDGER, "memcpy_s dbKey fail");
181             ret = SOFTBUS_MEM_ERR;
182             break;
183         }
184         ret = SOFTBUS_OK;
185     } while (false);
186     (void)memset_s(decryptData.data, decryptData.size, 0x0, decryptData.size);
187     SoftBusFree(decryptData.data);
188     return ret;
189 }
190 
GetDecisionDbKey(uint8_t * dbKey,uint32_t len,bool isUpdate)191 static int32_t GetDecisionDbKey(uint8_t *dbKey, uint32_t len, bool isUpdate)
192 {
193     char dbKeyFilePath[SOFTBUS_MAX_PATH_LEN] = {0};
194     int32_t ret = SOFTBUS_OK;
195 
196     if (LnnGetFullStoragePath(LNN_FILE_ID_DB_KEY, dbKeyFilePath, SOFTBUS_MAX_PATH_LEN) != SOFTBUS_OK) {
197         LNN_LOGE(LNN_LEDGER, "get dbKey save path fail");
198         return SOFTBUS_NETWORK_GET_PATH_FAILED;
199     }
200     do {
201         if (!isUpdate && SoftBusAccessFile(dbKeyFilePath, SOFTBUS_F_OK) == SOFTBUS_OK) {
202             LNN_LOGD(LNN_LEDGER, "dbKey file is exist");
203             break;
204         }
205         ret = LnnGenerateRandomByHuks(dbKey, len);
206         if (ret != SOFTBUS_OK) {
207             LNN_LOGE(LNN_LEDGER, "generate random dbKey fail");
208             return ret;
209         }
210         ret = EncryptStorageData(LNN_ENCRYPT_LEVEL_DE, dbKey, len);
211         if (ret != SOFTBUS_OK) {
212             LNN_LOGE(LNN_LEDGER, "encrypt dbKey fail");
213             return ret;
214         }
215         if (SoftBusWriteFile(dbKeyFilePath, (char *)dbKey, len) != SOFTBUS_OK) {
216             LNN_LOGE(LNN_LEDGER, "write dbKey to file fail");
217             return SOFTBUS_FILE_ERR;
218         }
219     } while (false);
220     if (SoftBusReadFullFile(dbKeyFilePath, (char *)dbKey, len) != SOFTBUS_OK) {
221         LNN_LOGE(LNN_LEDGER, "read dbKey from file fail");
222         return SOFTBUS_FILE_ERR;
223     }
224     ret = DecryptStorageData(LNN_ENCRYPT_LEVEL_DE, dbKey, len);
225     if (ret != SOFTBUS_OK) {
226         LNN_LOGE(LNN_LEDGER, "decrypt dbKey fail");
227         return ret;
228     }
229     return SOFTBUS_OK;
230 }
231 
EncryptDecisionDb(DbContext * ctx)232 static int32_t EncryptDecisionDb(DbContext *ctx)
233 {
234     uint8_t dbKey[LNN_DB_KEY_LEN] = {0};
235     int32_t ret = SOFTBUS_OK;
236 
237     ret = GetDecisionDbKey(dbKey, sizeof(dbKey), false);
238     if (ret != SOFTBUS_OK) {
239         LNN_LOGE(LNN_LEDGER, "get decision dbKey fail");
240         (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
241         return ret;
242     }
243     ret = EncryptedDb(ctx, dbKey, sizeof(dbKey));
244     if (ret != SOFTBUS_OK) {
245         LNN_LOGE(LNN_LEDGER, "encrypt decision db fail");
246         (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
247         return ret;
248     }
249     (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
250     return SOFTBUS_OK;
251 }
252 
UpdateDecisionDbKey(DbContext * ctx)253 static int32_t UpdateDecisionDbKey(DbContext *ctx)
254 {
255     uint8_t dbKey[LNN_DB_KEY_LEN] = {0};
256 
257     if (LnnGenerateKeyByHuks(&g_keyAlias) != SOFTBUS_OK) {
258         LNN_LOGE(LNN_LEDGER, "update decision db de key fail");
259         return SOFTBUS_GENERATE_KEY_FAIL;
260     }
261     if (LnnGenerateCeKeyByHuks(&g_ceKeyAlias) != SOFTBUS_OK) {
262         LNN_LOGE(LNN_LEDGER, "update decision db ce key fail");
263         return SOFTBUS_GENERATE_KEY_FAIL;
264     }
265     int32_t ret = GetDecisionDbKey(dbKey, sizeof(dbKey), true);
266     if (ret != SOFTBUS_OK) {
267         LNN_LOGE(LNN_LEDGER, "get decision dbKey fail");
268         (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
269         return ret;
270     }
271     ret = UpdateDbPassword(ctx, dbKey, sizeof(dbKey));
272     if (ret != SOFTBUS_OK) {
273         LNN_LOGE(LNN_LEDGER, "encrypt decision db fail");
274         (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
275         return ret;
276     }
277     LNN_LOGW(LNN_LEDGER, "update dbKey log for audit");
278     (void)memset_s(dbKey, sizeof(dbKey), 0x0, sizeof(dbKey));
279     return SOFTBUS_OK;
280 }
281 
BuildTrustedDevInfoRecord(const char * udid,TrustedDevInfoRecord * record)282 static int32_t BuildTrustedDevInfoRecord(const char *udid, TrustedDevInfoRecord *record)
283 {
284     uint8_t accountHash[SHA_256_HASH_LEN] = {0};
285     char accountHexHash[SHA_256_HEX_HASH_LEN] = {0};
286     int32_t userId = GetActiveOsAccountIds();
287     if (udid == NULL || record == NULL) {
288         LNN_LOGE(LNN_LEDGER, "invalid param");
289         return SOFTBUS_INVALID_PARAM;
290     }
291     if (LnnGetLocalByteInfo(BYTE_KEY_ACCOUNT_HASH, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
292         LNN_LOGE(LNN_LEDGER, "get local account hash failed");
293         return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
294     }
295     if (memset_s(record, sizeof(TrustedDevInfoRecord), 0, sizeof(TrustedDevInfoRecord)) != EOK) {
296         LNN_LOGE(LNN_LEDGER, "memset_s record failed");
297         return SOFTBUS_MEM_ERR;
298     }
299     if (ConvertBytesToHexString(accountHexHash, SHA_256_HEX_HASH_LEN, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
300         LNN_LOGE(LNN_LEDGER, "convert accountHash failed");
301         return SOFTBUS_NETWORK_BYTES_TO_HEX_STR_ERR;
302     }
303     if (sprintf_s(record->accountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
304         "%s-%d", accountHexHash, userId) < 0) {
305         LNN_LOGE(LNN_LEDGER, "sprintf_s fail");
306         return SOFTBUS_SPRINTF_ERR;
307     }
308     if (strcpy_s(record->udid, sizeof(record->udid), udid) != EOK) {
309         LNN_LOGE(LNN_LEDGER, "strcpy_s udid hash failed");
310         return SOFTBUS_STRCPY_ERR;
311     }
312     record->userId = userId;
313     return SOFTBUS_OK;
314 }
315 
CompleteUpdateTrustedDevInfo(void * para)316 static void CompleteUpdateTrustedDevInfo(void *para)
317 {
318     (void)para;
319 
320     LNN_LOGD(LNN_LEDGER, "complete trusted dev info update enter");
321     LnnUpdateHeartbeatInfo(UPDATE_HB_NETWORK_INFO);
322 }
323 
InsertTrustedDevInfoRecord(void * param)324 static void InsertTrustedDevInfoRecord(void *param)
325 {
326     DbContext *ctx = NULL;
327     TrustedDevInfoRecord record;
328 
329     char *udid = (char *)param;
330     if (udid == NULL) {
331         LNN_LOGE(LNN_LEDGER, "invalid param");
332         return;
333     }
334     if (BuildTrustedDevInfoRecord(udid, &record) != SOFTBUS_OK) {
335         LNN_LOGE(LNN_LEDGER, "build insert trusted dev info record failed");
336         SoftBusFree(udid);
337         return;
338     }
339     if (DbLock() != SOFTBUS_OK) {
340         LNN_LOGE(LNN_LEDGER, "lock fail");
341         SoftBusFree(udid);
342         return;
343     }
344     if (OpenDatabase(&ctx) != SOFTBUS_OK) {
345         LNN_LOGE(LNN_LEDGER, "open database failed");
346         SoftBusFree(udid);
347         DbUnlock();
348         return;
349     }
350     do {
351         if (EncryptDecisionDb(ctx) != SOFTBUS_OK) {
352             LNN_LOGE(LNN_LEDGER, "encrypt database failed");
353             break;
354         }
355         char *anonyUdid = NULL;
356         Anonymize(udid, &anonyUdid);
357         LNN_LOGI(LNN_LEDGER, "insert udid to trusted dev info table. udid=%{public}s", AnonymizeWrapper(anonyUdid));
358         AnonymizeFree(anonyUdid);
359         if (InsertRecord(ctx, TABLE_TRUSTED_DEV_INFO, (uint8_t *)&record) == SOFTBUS_OK) {
360             (void)LnnAsyncCallbackHelper(GetLooper(LOOP_TYPE_DEFAULT), CompleteUpdateTrustedDevInfo, NULL);
361         }
362     } while (false);
363     if (CloseDatabase(ctx) != SOFTBUS_OK) {
364         LNN_LOGE(LNN_LEDGER, "close database failed");
365         DbUnlock();
366         SoftBusFree(udid);
367         return;
368     }
369     DbUnlock();
370     SoftBusFree(udid);
371 }
372 
RemoveTrustedDevInfoRecord(void * param)373 static void RemoveTrustedDevInfoRecord(void *param)
374 {
375     DbContext *ctx = NULL;
376     TrustedDevInfoRecord record;
377 
378     TrustedDevInfoRecord *tempRecord = (TrustedDevInfoRecord *)param;
379     if (tempRecord == NULL) {
380         LNN_LOGE(LNN_LEDGER, "invalid param");
381         return;
382     }
383     record = *tempRecord;
384     SoftBusFree(tempRecord);
385     if (DbLock() != SOFTBUS_OK) {
386         LNN_LOGE(LNN_LEDGER, "lock fail");
387         return;
388     }
389     if (OpenDatabase(&ctx) != SOFTBUS_OK) {
390         LNN_LOGE(LNN_LEDGER, "open database failed");
391         DbUnlock();
392         return;
393     }
394     do {
395         if (EncryptDecisionDb(ctx) != SOFTBUS_OK) {
396             LNN_LOGE(LNN_LEDGER, "encrypt database failed");
397             break;
398         }
399         // delete oldRecord
400         TrustedDevInfoRecord oldRecord = record;
401         (void)memset_s(oldRecord.accountHexHash, sizeof(oldRecord.accountHexHash), 0, sizeof(oldRecord.accountHexHash));
402         if (GetLocalAccountHexHash(oldRecord.accountHexHash) == SOFTBUS_OK) {
403             (void)RemoveRecordByKey(ctx, TABLE_TRUSTED_DEV_INFO, (uint8_t *)&oldRecord);
404         }
405         if (RemoveRecordByKey(ctx, TABLE_TRUSTED_DEV_INFO, (uint8_t *)&record) == SOFTBUS_OK) {
406             (void)LnnAsyncCallbackHelper(GetLooper(LOOP_TYPE_DEFAULT), CompleteUpdateTrustedDevInfo, NULL);
407         }
408     } while (false);
409     if (CloseDatabase(ctx) != SOFTBUS_OK) {
410         LNN_LOGE(LNN_LEDGER, "close database failed");
411     }
412     DbUnlock();
413     char *anonyUdid = NULL;
414     Anonymize(record.udid, &anonyUdid);
415     LNN_LOGI(LNN_LEDGER, "remove udid from trusted dev info table. udid=%{public}s", AnonymizeWrapper(anonyUdid));
416     AnonymizeFree(anonyUdid);
417 }
418 
DeleteDeviceFromList(TrustedDevInfoRecord * record)419 static void DeleteDeviceFromList(TrustedDevInfoRecord *record)
420 {
421     if (DeviceDbListLock() != SOFTBUS_OK) {
422         LNN_LOGE(LNN_LEDGER, "lock fail");
423         return;
424     }
425     DeviceDbInfo *item = NULL;
426     DeviceDbInfo *next = NULL;
427     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_deviceInfoList, DeviceDbInfo, node) {
428         if (strcmp(item->infoRecord.accountHexHash, record->accountHexHash) == 0 &&
429             strcmp(item->infoRecord.udid, record->udid) == 0 &&
430             item->infoRecord.userId == record->userId) {
431             char *anonyUdid = NULL;
432             Anonymize(record->udid, &anonyUdid);
433             LNN_LOGI(LNN_LEDGER, "delete device db from list. udid=%{public}s", AnonymizeWrapper(anonyUdid));
434             AnonymizeFree(anonyUdid);
435             ListDelete(&item->node);
436             SoftBusFree(item);
437             break;
438         }
439     }
440     DeviceDbListUnlock();
441 }
442 
InsertDeviceToList(TrustedDevInfoRecord * record)443 static void InsertDeviceToList(TrustedDevInfoRecord *record)
444 {
445     if (DeviceDbListLock() != SOFTBUS_OK) {
446         LNN_LOGE(LNN_LEDGER, "lock fail");
447         return;
448     }
449     DeviceDbInfo *item = NULL;
450     LIST_FOR_EACH_ENTRY(item, &g_deviceInfoList, DeviceDbInfo, node) {
451         if (strcmp(item->infoRecord.accountHexHash, record->accountHexHash) == 0 &&
452             strcmp(item->infoRecord.udid, record->udid) == 0 &&
453             item->infoRecord.userId == record->userId) {
454             DeviceDbListUnlock();
455             return;
456         }
457     }
458     DeviceDbInfo *info = (DeviceDbInfo *)SoftBusCalloc(sizeof(DeviceDbInfo));
459     if (info == NULL) {
460         LNN_LOGE(LNN_BUILDER, "malloc info fail");
461         DeviceDbListUnlock();
462         return;
463     }
464     info->infoRecord = *record;
465     ListNodeInsert(&g_deviceInfoList, &info->node);
466     DeviceDbListUnlock();
467 }
468 
LnnInsertSpecificTrustedDevInfo(const char * udid)469 int32_t LnnInsertSpecificTrustedDevInfo(const char *udid)
470 {
471     char *dupUdid = NULL;
472 
473     if (udid == NULL) {
474         LNN_LOGE(LNN_LEDGER, "invalid param");
475         return SOFTBUS_INVALID_PARAM;
476     }
477     TrustedDevInfoRecord record;
478     int32_t ret = BuildTrustedDevInfoRecord(udid, &record);
479     if (ret != SOFTBUS_OK) {
480         LNN_LOGE(LNN_LEDGER, "build insert trusted dev info record failed");
481         return ret;
482     }
483     InsertDeviceToList(&record);
484     dupUdid = (char *)SoftBusMalloc(UDID_BUF_LEN);
485     if (dupUdid == NULL) {
486         LNN_LOGE(LNN_LEDGER, "malloc dupUdid failed");
487         return SOFTBUS_MALLOC_ERR;
488     }
489     if (strcpy_s(dupUdid, UDID_BUF_LEN, udid) != EOK) {
490         LNN_LOGE(LNN_LEDGER, "strcpy_s dupUdid failed");
491         SoftBusFree(dupUdid);
492         return SOFTBUS_STRCPY_ERR;
493     }
494     if (LnnAsyncCallbackHelper(GetLooper(LOOP_TYPE_DEFAULT), InsertTrustedDevInfoRecord,
495         (void *)dupUdid) != SOFTBUS_OK) {
496         LNN_LOGE(LNN_LEDGER, "async call insert trusted dev info failed");
497         SoftBusFree(dupUdid);
498         return SOFTBUS_NETWORK_ASYNC_CALLBACK_FAILED;
499     }
500     return SOFTBUS_OK;
501 }
502 
BuildTrustedDevInfoRecordEx(const char * udid,TrustedDevInfoRecord * record,int32_t localUserId)503 static int32_t BuildTrustedDevInfoRecordEx(const char *udid, TrustedDevInfoRecord *record, int32_t localUserId)
504 {
505     uint8_t accountHash[SHA_256_HASH_LEN] = {0};
506     char accountHexHash[SHA_256_HEX_HASH_LEN] = {0};
507     if (udid == NULL || record == NULL) {
508         LNN_LOGE(LNN_LEDGER, "invalid param");
509         return SOFTBUS_INVALID_PARAM;
510     }
511     if (LnnGetOhosAccountInfoByUserId(localUserId, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
512         LNN_LOGE(LNN_LEDGER, "get local account hash failed");
513         if (SoftBusGenerateStrHash((const unsigned char *)DEFAULT_USER_ID,
514             strlen(DEFAULT_USER_ID), (unsigned char *)accountHash) != SOFTBUS_OK) {
515             LNN_LOGE(LNN_STATE, "generate default str hash fail");
516             return SOFTBUS_NETWORK_GENERATE_STR_HASH_ERR;
517         }
518     }
519     if (memset_s(record, sizeof(TrustedDevInfoRecord), 0, sizeof(TrustedDevInfoRecord)) != EOK) {
520         LNN_LOGE(LNN_LEDGER, "memset_s record failed");
521         return SOFTBUS_MEM_ERR;
522     }
523     if (ConvertBytesToHexString(accountHexHash, SHA_256_HEX_HASH_LEN, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
524         LNN_LOGE(LNN_LEDGER, "convert accountHash failed");
525         return SOFTBUS_NETWORK_BYTES_TO_HEX_STR_ERR;
526     }
527     if (sprintf_s(record->accountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
528         "%s-%d", accountHexHash, localUserId) < 0) {
529         LNN_LOGE(LNN_LEDGER, "sprintf_s fail");
530         return SOFTBUS_SPRINTF_ERR;
531     }
532     if (strcpy_s(record->udid, sizeof(record->udid), udid) != EOK) {
533         LNN_LOGE(LNN_LEDGER, "strcpy_s udid hash failed");
534         return SOFTBUS_STRCPY_ERR;
535     }
536     record->userId = localUserId;
537     return SOFTBUS_OK;
538 }
539 
LnnDeleteSpecificTrustedDevInfo(const char * udid,int32_t localUserId)540 int32_t LnnDeleteSpecificTrustedDevInfo(const char *udid, int32_t localUserId)
541 {
542     TrustedDevInfoRecord *dupRecord = NULL;
543 
544     if (udid == NULL) {
545         LNN_LOGE(LNN_LEDGER, "invalid param");
546         return SOFTBUS_INVALID_PARAM;
547     }
548     TrustedDevInfoRecord record;
549     int32_t ret = BuildTrustedDevInfoRecordEx(udid, &record, localUserId);
550     if (ret != SOFTBUS_OK) {
551         LNN_LOGE(LNN_LEDGER, "build delete trusted dev info record failed");
552         return ret;
553     }
554     DeleteDeviceFromList(&record);
555     dupRecord = (TrustedDevInfoRecord *)SoftBusMalloc(sizeof(TrustedDevInfoRecord));
556     if (dupRecord == NULL) {
557         LNN_LOGE(LNN_LEDGER, "malloc dupRecord failed");
558         return SOFTBUS_MALLOC_ERR;
559     }
560     if (memcpy_s(dupRecord, sizeof(TrustedDevInfoRecord), &record, sizeof(TrustedDevInfoRecord)) != EOK) {
561         LNN_LOGE(LNN_LEDGER, "memcpy_s dupRecord failed");
562         SoftBusFree(dupRecord);
563         return SOFTBUS_STRCPY_ERR;
564     }
565     if (LnnAsyncCallbackHelper(GetLooper(LOOP_TYPE_DEFAULT), RemoveTrustedDevInfoRecord,
566         (void *)dupRecord) != SOFTBUS_OK) {
567         LNN_LOGE(LNN_LEDGER, "async call remove trusted dev info failed");
568         SoftBusFree(dupRecord);
569         return SOFTBUS_NETWORK_ASYNC_CALLBACK_FAILED;
570     }
571     return SOFTBUS_OK;
572 }
573 
GetTrustedDevInfoRecord(DbContext * ctx,const char * accountHexHash,char ** udidArray,uint32_t * num)574 static int32_t GetTrustedDevInfoRecord(DbContext *ctx, const char *accountHexHash, char **udidArray, uint32_t *num)
575 {
576     int32_t ret = EncryptDecisionDb(ctx);
577     if (ret != SOFTBUS_OK) {
578         LNN_LOGE(LNN_LEDGER, "encrypt database failed");
579         *udidArray = NULL;
580         *num = 0;
581         return ret;
582     }
583     *((int32_t *)num) = GetRecordNumByKey(ctx, TABLE_TRUSTED_DEV_INFO, (uint8_t *)accountHexHash);
584     if (*num == 0) {
585         LNN_LOGW(LNN_LEDGER, "get none trusted dev info");
586         *udidArray = NULL;
587         return SOFTBUS_OK;
588     }
589     *udidArray = (char *)SoftBusCalloc(*num * UDID_BUF_LEN);
590     if (*udidArray == NULL) {
591         *num = 0;
592         return SOFTBUS_MALLOC_ERR;
593     }
594     ret = QueryRecordByKey(ctx, TABLE_TRUSTED_DEV_INFO, (uint8_t *)accountHexHash,
595         (uint8_t **)udidArray, *((int32_t *)num));
596     if (ret != SOFTBUS_OK) {
597         LNN_LOGE(LNN_LEDGER, "query udidArray failed");
598         SoftBusFree(*udidArray);
599         *udidArray = NULL;
600         *num = 0;
601         return ret;
602     }
603     return SOFTBUS_OK;
604 }
605 
GetLocalAccountHexHash(char * accountHexHash)606 static int32_t GetLocalAccountHexHash(char *accountHexHash)
607 {
608     uint8_t accountHash[SHA_256_HASH_LEN] = {0};
609     if (LnnGetLocalByteInfo(BYTE_KEY_ACCOUNT_HASH, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
610         LNN_LOGE(LNN_LEDGER, "get local account hash failed");
611         return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
612     }
613     if (ConvertBytesToHexString(accountHexHash, SHA_256_HEX_HASH_LEN, accountHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
614         LNN_LOGE(LNN_LEDGER, "convert accountHash failed");
615         return SOFTBUS_NETWORK_BYTES_TO_HEX_STR_ERR;
616     }
617     return SOFTBUS_OK;
618 }
619 
GetAllDevNums(char * accountHexHash,uint32_t * num,int32_t userId)620 static int32_t GetAllDevNums(char *accountHexHash, uint32_t *num, int32_t userId)
621 {
622     DeviceDbInfo *item = NULL;
623     LIST_FOR_EACH_ENTRY(item, &g_deviceInfoList, DeviceDbInfo, node) {
624         if (strcmp(accountHexHash, item->infoRecord.accountHexHash) == 0 && item->infoRecord.userId == userId) {
625             (*num)++;
626         }
627     }
628     return SOFTBUS_OK;
629 }
630 
GenerateAccountHexHashWithUserId(char * accountHexHashAndUserId,int32_t * userId)631 static int32_t GenerateAccountHexHashWithUserId(char *accountHexHashAndUserId, int32_t *userId)
632 {
633     char accountHexHash[SHA_256_HEX_HASH_LEN] = {0};
634     *userId = GetActiveOsAccountIds();
635     if (GetLocalAccountHexHash(accountHexHash) != SOFTBUS_OK) {
636         LNN_LOGE(LNN_LEDGER, "get local account hash failed");
637         return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
638     }
639     if (sprintf_s(accountHexHashAndUserId, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
640         "%s-%d", accountHexHash, *userId) < 0) {
641         LNN_LOGE(LNN_LEDGER, "sprintf_s fail");
642         return SOFTBUS_SPRINTF_ERR;
643     }
644     return SOFTBUS_OK;
645 }
646 
LnnGetTrustedDevInfoFromDb(char ** udidArray,uint32_t * num)647 int32_t LnnGetTrustedDevInfoFromDb(char **udidArray, uint32_t *num)
648 {
649     char accountHexHashAndUserId[SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1] = {0};
650     int32_t userId = 0;
651     LNN_CHECK_AND_RETURN_RET_LOGE((udidArray != NULL) && (num != NULL), SOFTBUS_INVALID_PARAM, LNN_LEDGER,
652         "invalid param");
653     if (GenerateAccountHexHashWithUserId(accountHexHashAndUserId, &userId) != SOFTBUS_OK) {
654         return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
655     }
656 
657     if (DeviceDbListLock() != SOFTBUS_OK) {
658         LNN_LOGE(LNN_LEDGER, "lock fail");
659         return SOFTBUS_LOCK_ERR;
660     }
661     int32_t ret = GetAllDevNums(accountHexHashAndUserId, num, userId);
662     if (ret != SOFTBUS_OK) {
663         LNN_LOGE(LNN_LEDGER, "get all dev num fail");
664         DeviceDbListUnlock();
665         return ret;
666     }
667     if (*num == 0) {
668         LNN_LOGW(LNN_LEDGER, "get none trusted dev info");
669         *udidArray = NULL;
670         DeviceDbListUnlock();
671         return SOFTBUS_OK;
672     }
673     *udidArray = (char *)SoftBusCalloc(*num * UDID_BUF_LEN);
674     if (*udidArray == NULL) {
675         LNN_LOGW(LNN_LEDGER, "malloc fail");
676         *num = 0;
677         DeviceDbListUnlock();
678         return SOFTBUS_MALLOC_ERR;
679     }
680     uint32_t cur = 0;
681     DeviceDbInfo *item = NULL;
682     LIST_FOR_EACH_ENTRY(item, &g_deviceInfoList, DeviceDbInfo, node) {
683         if (cur >= *num) {
684             break;
685         }
686         if (strcmp(accountHexHashAndUserId, item->infoRecord.accountHexHash) != 0 ||
687             item->infoRecord.userId != userId) {
688             continue;
689         }
690         if (strcpy_s(*udidArray + cur * UDID_BUF_LEN, UDID_BUF_LEN, item->infoRecord.udid) != EOK) {
691             LNN_LOGE(LNN_LEDGER, "strcpy udid fail.");
692             continue;
693         }
694         cur++;
695     }
696     DeviceDbListUnlock();
697     return SOFTBUS_OK;
698 }
699 
GetTrustedDevInfoFromDb(char ** udidArray,uint32_t * num,char * accountHexHash)700 static int32_t GetTrustedDevInfoFromDb(char **udidArray, uint32_t *num, char *accountHexHash)
701 {
702     DbContext *ctx = NULL;
703 
704     if (udidArray == NULL || num == NULL) {
705         return SOFTBUS_INVALID_PARAM;
706     }
707     if (DbLock() != SOFTBUS_OK) {
708         LNN_LOGE(LNN_LEDGER, "lock fail");
709         return SOFTBUS_LOCK_ERR;
710     }
711     if (OpenDatabase(&ctx) != SOFTBUS_OK) {
712         LNN_LOGE(LNN_LEDGER, "open database failed");
713         DbUnlock();
714         return SOFTBUS_NETWORK_DATABASE_FAILED;
715     }
716     int32_t rc = GetTrustedDevInfoRecord(ctx, accountHexHash, udidArray, num);
717     if (rc != SOFTBUS_OK) {
718         LNN_LOGE(LNN_LEDGER, "get trusted dev info failed");
719     }
720     if (CloseDatabase(ctx) != SOFTBUS_OK) {
721         LNN_LOGE(LNN_LEDGER, "close database failed");
722         DbUnlock();
723         SoftBusFree(*udidArray);
724         *udidArray = NULL;
725         *num = 0;
726         return SOFTBUS_NETWORK_DATABASE_FAILED;
727     }
728     DbUnlock();
729     return rc;
730 }
731 
RecoveryTrustedDevInfoProcess(char * accountHexHash,int32_t activeUserId,bool oldData)732 static int32_t RecoveryTrustedDevInfoProcess(char *accountHexHash, int32_t activeUserId, bool oldData)
733 {
734     uint32_t num = 0;
735     char *udidArray = NULL;
736     if (GetTrustedDevInfoFromDb(&udidArray, &num, accountHexHash) != SOFTBUS_OK) {
737         LNN_LOGE(LNN_LEDGER, "get trusted dev info fail");
738         return SOFTBUS_NETWORK_GET_DEVICE_INFO_ERR;
739     }
740     LNN_LOGI(LNN_LEDGER, "get trusted relation num=%{public}u", num);
741     if (udidArray == NULL || num == 0) {
742         LNN_LOGE(LNN_LEDGER, "get none trusted dev info");
743         return SOFTBUS_OK;
744     }
745     if (oldData && sprintf_s(accountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
746         "%s-%d", accountHexHash, activeUserId) < 0) {
747         LNN_LOGE(LNN_LEDGER, "sprintf_s fail");
748         return SOFTBUS_STRCPY_ERR;
749     }
750     if (DeviceDbListLock() != SOFTBUS_OK) {
751         LNN_LOGE(LNN_LEDGER, "db lock fail");
752         SoftBusFree(udidArray);
753         return SOFTBUS_LOCK_ERR;
754     }
755     for (uint32_t i = 0; i < num; i++) {
756         char udidStr[UDID_BUF_LEN] = { 0 };
757         DeviceDbInfo *info = (DeviceDbInfo *)SoftBusCalloc(sizeof(DeviceDbInfo));
758         if (info == NULL) {
759             LNN_LOGE(LNN_BUILDER, "malloc info fail");
760             continue;
761         }
762         if (memcpy_s(udidStr, UDID_BUF_LEN, udidArray + i * UDID_BUF_LEN, UDID_BUF_LEN) != EOK ||
763             memcpy_s(info->infoRecord.udid, UDID_BUF_LEN, udidStr, UDID_BUF_LEN) != EOK ||
764             memcpy_s(info->infoRecord.accountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
765                 accountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1) != EOK) {
766             LNN_LOGE(LNN_LEDGER, "udid str cpy fail.");
767             DeviceDbListUnlock();
768             SoftBusFree(info);
769             SoftBusFree(udidArray);
770             return SOFTBUS_MEM_ERR;
771         }
772         info->infoRecord.userId = activeUserId;
773         ListNodeInsert(&g_deviceInfoList, &info->node);
774     }
775     DeviceDbListUnlock();
776     SoftBusFree(udidArray);
777     return SOFTBUS_OK;
778 }
779 
RecoveryTrustedDevInfo(void)780 static int32_t RecoveryTrustedDevInfo(void)
781 {
782     char accountHexHash[SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1] = {0};
783     char tempAccountAccountHexHash[SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1] = {0};
784     if (GetLocalAccountHexHash(accountHexHash) != SOFTBUS_OK) {
785         LNN_LOGE(LNN_LEDGER, "get local account hash failed");
786         return SOFTBUS_NETWORK_GET_NODE_INFO_ERR;
787     }
788     if (strcpy_s(tempAccountAccountHexHash, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
789         accountHexHash)!= EOK) {
790         LNN_LOGE(LNN_LEDGER, "strcpy fail");
791         return SOFTBUS_STRCPY_ERR;
792     }
793     RecoveryTrustedDevInfoProcess(accountHexHash, LNN_DEFAULT_USERID, true);
794 
795     char accountHexHashAndUserId[SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1] = {0};
796     int32_t userId = GetActiveOsAccountIds();
797     LNN_LOGI(LNN_LEDGER, "activeUserId=%{public}d", userId);
798     if (sprintf_s(accountHexHashAndUserId, SHA_256_HEX_HASH_LEN + LNN_INT32_NUM_STR_MAX_LEN + 1,
799         "%s-%d", tempAccountAccountHexHash, userId) < 0) {
800         LNN_LOGE(LNN_LEDGER, "sprintf_s fail");
801         return SOFTBUS_SPRINTF_ERR;
802     }
803     RecoveryTrustedDevInfoProcess(accountHexHashAndUserId, userId, false);
804     return SOFTBUS_OK;
805 }
806 
ClearRecoveryDeviceList(void)807 static void ClearRecoveryDeviceList(void)
808 {
809     if (DeviceDbListLock() != SOFTBUS_OK) {
810         LNN_LOGE(LNN_LEDGER, "db lock fail");
811         return;
812     }
813     DeviceDbInfo *item = NULL;
814     DeviceDbInfo *next = NULL;
815     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_deviceInfoList, DeviceDbInfo, node) {
816         ListDelete(&item->node);
817         SoftBusFree(item);
818     }
819     DeviceDbListUnlock();
820 }
821 
UpdateRecoveryDeviceInfoFromDb(void)822 int32_t UpdateRecoveryDeviceInfoFromDb(void)
823 {
824     if (!g_isDbListInit) {
825         return SOFTBUS_NETWORK_NOT_INIT;
826     }
827     ClearRecoveryDeviceList();
828     return RecoveryTrustedDevInfo();
829 }
830 
InitDbList(void)831 static int32_t InitDbList(void)
832 {
833     if (!DeviceDbRecoveryInit()) {
834         LNN_LOGE(LNN_LEDGER, "init fail");
835         return SOFTBUS_NETWORK_DB_LOCK_INIT_FAILED;
836     }
837     ClearRecoveryDeviceList();
838     return RecoveryTrustedDevInfo();
839 }
840 
InitTrustedDevInfoTable(void)841 int32_t InitTrustedDevInfoTable(void)
842 {
843     bool isExist = false;
844     int32_t rc = SOFTBUS_NETWORK_INIT_TRUST_DEV_INFO_FAILED;
845     DbContext *ctx = NULL;
846 
847     if (OpenDatabase(&ctx) != SOFTBUS_OK) {
848         LNN_LOGE(LNN_LEDGER, "open database failed");
849         return SOFTBUS_NETWORK_DATABASE_FAILED;
850     }
851     do {
852         if (EncryptDecisionDb(ctx) != SOFTBUS_OK) {
853             LNN_LOGE(LNN_LEDGER, "encrypt database failed");
854             break;
855         }
856         if (UpdateDecisionDbKey(ctx) != SOFTBUS_OK) {
857             LNN_LOGE(LNN_LEDGER, "update database dbKey failed");
858             break;
859         }
860         if (CheckTableExist(ctx, TABLE_TRUSTED_DEV_INFO, &isExist) != SOFTBUS_OK) {
861             LNN_LOGE(LNN_LEDGER, "check table exist failed");
862             break;
863         }
864         if (!isExist && CreateTable(ctx, TABLE_TRUSTED_DEV_INFO) != SOFTBUS_OK) {
865             LNN_LOGE(LNN_LEDGER, "create trusted dev info table failed");
866             break;
867         }
868         rc = SOFTBUS_OK;
869     } while (false);
870     if (CloseDatabase(ctx) != SOFTBUS_OK) {
871         LNN_LOGE(LNN_LEDGER, "close database failed");
872         return SOFTBUS_NETWORK_DATABASE_FAILED;
873     }
874     if (rc == SOFTBUS_OK) {
875         rc = InitDbList();
876     }
877     return rc;
878 }
879 
TryRecoveryTrustedDevInfoTable(void)880 static int32_t TryRecoveryTrustedDevInfoTable(void)
881 {
882     char dbKeyFilePath[SOFTBUS_MAX_PATH_LEN] = {0};
883 
884     if (LnnGetFullStoragePath(LNN_FILE_ID_DB_KEY, dbKeyFilePath, SOFTBUS_MAX_PATH_LEN) != SOFTBUS_OK) {
885         LNN_LOGE(LNN_LEDGER, "get dbKey save path fail");
886         return SOFTBUS_NETWORK_GET_PATH_FAILED;
887     }
888     SoftBusRemoveFile(dbKeyFilePath);
889     SoftBusRemoveFile(DATABASE_NAME);
890     return InitTrustedDevInfoTable();
891 }
892 
LnnIsPotentialHomeGroup(const char * udid)893 bool LnnIsPotentialHomeGroup(const char *udid)
894 {
895     (void)udid;
896 
897     LNN_LOGE(LNN_LEDGER, "check is potential home group not implemented");
898     return false;
899 }
900 
LnnGenerateCeParams(void)901 int32_t LnnGenerateCeParams(void)
902 {
903     return LnnGenerateCeKeyByHuks(&g_ceKeyAlias);
904 }
905 
LnnCheckGenerateSoftBusKeyByHuks(void)906 int32_t LnnCheckGenerateSoftBusKeyByHuks(void)
907 {
908     if (LnnGenerateKeyByHuks(&g_keyAlias) != SOFTBUS_OK) {
909         LNN_LOGE(LNN_LEDGER, "generate decision db huks de key fail");
910         return SOFTBUS_GENERATE_KEY_FAIL;
911     }
912     return SOFTBUS_OK;
913 }
914 
LnnInitDecisionDbDelay(void)915 int32_t LnnInitDecisionDbDelay(void)
916 {
917     if (LnnGenerateKeyByHuks(&g_keyAlias) != SOFTBUS_OK) {
918         LNN_LOGE(LNN_LEDGER, "generate decision db huks de key fail");
919         return SOFTBUS_GENERATE_KEY_FAIL;
920     }
921     if (LnnGenerateCeKeyByHuks(&g_ceKeyAlias) != SOFTBUS_OK) {
922         LNN_LOGE(LNN_LEDGER, "update decision db huks ce key fail");
923         return SOFTBUS_GENERATE_KEY_FAIL;
924     }
925     if (InitTrustedDevInfoTable() != SOFTBUS_OK) {
926         LNN_LOGI(LNN_LEDGER, "try init trusted dev info table again");
927         return TryRecoveryTrustedDevInfoTable();
928     }
929     return SOFTBUS_OK;
930 }
931 
LnnRemoveDb(void)932 void LnnRemoveDb(void)
933 {
934     SoftBusRemoveFile(DATABASE_NAME);
935 }
936