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