1 /*
2 * Copyright (c) 2021 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_net_ledger.h"
17
18 #include <string.h>
19 #include <securec.h>
20
21 #include "auth_device_common_key.h"
22 #include "bus_center_manager.h"
23 #include "lnn_cipherkey_manager.h"
24 #include "lnn_decision_db.h"
25 #include "lnn_distributed_net_ledger.h"
26 #include "lnn_huks_utils.h"
27 #include "lnn_local_net_ledger.h"
28 #include "lnn_meta_node_ledger.h"
29 #include "lnn_device_info_recovery.h"
30 #include "softbus_adapter_mem.h"
31 #include "softbus_def.h"
32 #include "softbus_errcode.h"
33 #include "softbus_log.h"
34 #include "softbus_utils.h"
35
LnnInitNetLedger(void)36 NO_SANITIZE("cfi") int32_t LnnInitNetLedger(void)
37 {
38 if (LnnInitLocalLedger() != SOFTBUS_OK) {
39 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init local net ledger fail!");
40 return SOFTBUS_ERR;
41 }
42 if (LnnInitDistributedLedger() != SOFTBUS_OK) {
43 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init distributed net ledger fail!");
44 return SOFTBUS_ERR;
45 }
46 if (LnnInitMetaNodeLedger() != SOFTBUS_OK) {
47 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init meta node ledger fail!");
48 return SOFTBUS_ERR;
49 }
50 if (LnnInitHuksInterface() != SOFTBUS_OK) {
51 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init huks interface fail!");
52 return SOFTBUS_ERR;
53 }
54 return SOFTBUS_OK;
55 }
56
LnnRestoreLocalDeviceInfo()57 static void LnnRestoreLocalDeviceInfo()
58 {
59 LLOGI("restore local device info enter.");
60 if (LnnLoadLocalDeviceInfo() != SOFTBUS_OK) {
61 LLOGI("get local device info fail");
62 const NodeInfo *temp = LnnGetLocalNodeInfo();
63 if (LnnSaveLocalDeviceInfo(temp) != SOFTBUS_OK) {
64 LLOGE("save local device info fail");
65 }
66 LLOGI("save local device info success.");
67 } else {
68 NodeInfo info;
69 (void)memset_s(&info, sizeof(NodeInfo), 0, sizeof(NodeInfo));
70 (void)LnnGetLocalDevInfo(&info);
71 LLOGI("load local deviceInfo success, networkId:%s", AnonymizesNetworkID(info.networkId));
72 int64_t accountId = 0;
73 if (LnnGetLocalNum64Info(NUM_KEY_ACCOUNT_LONG, &accountId) == SOFTBUS_OK) {
74 if (accountId != info.accountId) {
75 info.stateVersion++;
76 }
77 }
78 LLOGI("load local deviceInfo stateVersion=%d", info.stateVersion);
79 if (LnnSetLocalNumInfo(NUM_KEY_STATE_VERSION, info.stateVersion) != SOFTBUS_OK) {
80 LLOGE("set state version fail");
81 }
82 if (LnnUpdateLocalNetworkId(info.networkId) != SOFTBUS_OK) {
83 LLOGE("set networkId fail");
84 }
85 }
86 AuthLoadDeviceKey();
87 if (LnnLoadRemoteDeviceInfo() != SOFTBUS_OK) {
88 LLOGE("load remote deviceInfo fail");
89 return;
90 }
91 LoadBleBroadcastKey();
92 LLOGI("load remote deviceInfo devicekey success");
93 }
94
LnnInitNetLedgerDelay(void)95 int32_t LnnInitNetLedgerDelay(void)
96 {
97 if (LnnInitLocalLedgerDelay() != SOFTBUS_OK) {
98 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "delay init local ledger fail!");
99 return SOFTBUS_ERR;
100 }
101 if (LnnInitDecisionDbDelay() != SOFTBUS_OK) {
102 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "delay init decision db fail!");
103 return SOFTBUS_ERR;
104 }
105 LnnRestoreLocalDeviceInfo();
106 return SOFTBUS_OK;
107 }
108
LnnDeinitNetLedger(void)109 NO_SANITIZE("cfi") void LnnDeinitNetLedger(void)
110 {
111 LnnDeinitMetaNodeLedger();
112 LnnDeinitDistributedLedger();
113 LnnDeinitLocalLedger();
114 LnnDeinitHuksInterface();
115 }
116
LnnGetNodeKeyInfoLocal(const char * networkId,int key,uint8_t * info,uint32_t infoLen)117 static int32_t LnnGetNodeKeyInfoLocal(const char *networkId, int key, uint8_t *info, uint32_t infoLen)
118 {
119 if (networkId == NULL || info == NULL) {
120 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "params are null");
121 return SOFTBUS_ERR;
122 }
123 switch (key) {
124 case NODE_KEY_UDID:
125 return LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, (char *)info, infoLen);
126 case NODE_KEY_UUID:
127 return LnnGetLocalStrInfo(STRING_KEY_UUID, (char *)info, infoLen);
128 case NODE_KEY_MASTER_UDID:
129 return LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, (char *)info, infoLen);
130 case NODE_KEY_BR_MAC:
131 return LnnGetLocalStrInfo(STRING_KEY_BT_MAC, (char *)info, infoLen);
132 case NODE_KEY_IP_ADDRESS:
133 return LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, (char *)info, infoLen);
134 case NODE_KEY_DEV_NAME:
135 return LnnGetLocalStrInfo(STRING_KEY_DEV_NAME, (char *)info, infoLen);
136 case NODE_KEY_BLE_OFFLINE_CODE:
137 return LnnGetLocalStrInfo(STRING_KEY_OFFLINE_CODE, (char *)info, infoLen);
138 case NODE_KEY_NETWORK_CAPABILITY:
139 return LnnGetLocalNumInfo(NUM_KEY_NET_CAP, (int32_t *)info);
140 case NODE_KEY_NETWORK_TYPE:
141 return LnnGetLocalNumInfo(NUM_KEY_DISCOVERY_TYPE, (int32_t *)info);
142 case NODE_KEY_DATA_CHANGE_FLAG:
143 return LnnGetLocalNum16Info(NUM_KEY_DATA_CHANGE_FLAG, (int16_t *)info);
144 case NODE_KEY_NODE_ADDRESS:
145 return LnnGetLocalStrInfo(STRING_KEY_NODE_ADDR, (char *)info, infoLen);
146 default:
147 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid node key type: %d", key);
148 return SOFTBUS_ERR;
149 }
150 }
151
LnnGetNodeKeyInfoRemote(const char * networkId,int key,uint8_t * info,uint32_t infoLen)152 static int32_t LnnGetNodeKeyInfoRemote(const char *networkId, int key, uint8_t *info, uint32_t infoLen)
153 {
154 if (networkId == NULL || info == NULL) {
155 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "params are null");
156 return SOFTBUS_ERR;
157 }
158 switch (key) {
159 case NODE_KEY_UDID:
160 return LnnGetRemoteStrInfo(networkId, STRING_KEY_DEV_UDID, (char *)info, infoLen);
161 case NODE_KEY_UUID:
162 return LnnGetRemoteStrInfo(networkId, STRING_KEY_UUID, (char *)info, infoLen);
163 case NODE_KEY_BR_MAC:
164 return LnnGetRemoteStrInfo(networkId, STRING_KEY_BT_MAC, (char *)info, infoLen);
165 case NODE_KEY_IP_ADDRESS:
166 return LnnGetRemoteStrInfo(networkId, STRING_KEY_WLAN_IP, (char *)info, infoLen);
167 case NODE_KEY_DEV_NAME:
168 return LnnGetRemoteStrInfo(networkId, STRING_KEY_DEV_NAME, (char *)info, infoLen);
169 case NODE_KEY_BLE_OFFLINE_CODE:
170 return LnnGetRemoteStrInfo(networkId, STRING_KEY_OFFLINE_CODE, (char *)info, infoLen);
171 case NODE_KEY_NETWORK_CAPABILITY:
172 return LnnGetRemoteNumInfo(networkId, NUM_KEY_NET_CAP, (int32_t *)info);
173 case NODE_KEY_NETWORK_TYPE:
174 return LnnGetRemoteNumInfo(networkId, NUM_KEY_DISCOVERY_TYPE, (int32_t *)info);
175 case NODE_KEY_DATA_CHANGE_FLAG:
176 return LnnGetRemoteNum16Info(networkId, NUM_KEY_DATA_CHANGE_FLAG, (int16_t *)info);
177 case NODE_KEY_NODE_ADDRESS:
178 return LnnGetRemoteStrInfo(networkId, STRING_KEY_NODE_ADDR, (char *)info, infoLen);
179 default:
180 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid node key type: %d", key);
181 return SOFTBUS_ERR;
182 }
183 }
184
LnnGetNodeKeyInfo(const char * networkId,int key,uint8_t * info,uint32_t infoLen)185 int32_t LnnGetNodeKeyInfo(const char *networkId, int key, uint8_t *info, uint32_t infoLen)
186 {
187 bool isLocalNetworkId = false;
188 char localNetworkId[NETWORK_ID_BUF_LEN] = {0};
189 if (networkId == NULL || info == NULL) {
190 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "params are null");
191 return SOFTBUS_ERR;
192 }
193 if (LnnGetLocalStrInfo(STRING_KEY_NETWORKID, localNetworkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
194 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local network id fail");
195 return SOFTBUS_ERR;
196 }
197 if (strncmp(localNetworkId, networkId, NETWORK_ID_BUF_LEN) == 0) {
198 isLocalNetworkId = true;
199 }
200 if (isLocalNetworkId) {
201 return LnnGetNodeKeyInfoLocal(networkId, key, info, infoLen);
202 } else {
203 return LnnGetNodeKeyInfoRemote(networkId, key, info, infoLen);
204 }
205 }
206
LnnSetNodeDataChangeFlag(const char * networkId,uint16_t dataChangeFlag)207 NO_SANITIZE("cfi") int32_t LnnSetNodeDataChangeFlag(const char *networkId, uint16_t dataChangeFlag)
208 {
209 bool isLocalNetworkId = false;
210 char localNetworkId[NETWORK_ID_BUF_LEN] = {0};
211 if (networkId == NULL) {
212 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "params are null");
213 return SOFTBUS_ERR;
214 }
215 if (LnnGetLocalStrInfo(STRING_KEY_NETWORKID, localNetworkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
216 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local network id fail");
217 return SOFTBUS_ERR;
218 }
219 if (strncmp(localNetworkId, networkId, NETWORK_ID_BUF_LEN) == 0) {
220 isLocalNetworkId = true;
221 }
222 if (isLocalNetworkId) {
223 return LnnSetLocalNum16Info(NUM_KEY_DATA_CHANGE_FLAG, dataChangeFlag);
224 }
225 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "remote networkId");
226 return SOFTBUS_ERR;
227 }
228
LnnGetNodeKeyInfoLen(int32_t key)229 NO_SANITIZE("cfi") int32_t LnnGetNodeKeyInfoLen(int32_t key)
230 {
231 switch (key) {
232 case NODE_KEY_UDID:
233 return UDID_BUF_LEN;
234 case NODE_KEY_UUID:
235 return UUID_BUF_LEN;
236 case NODE_KEY_MASTER_UDID:
237 return UDID_BUF_LEN;
238 case NODE_KEY_BR_MAC:
239 return MAC_LEN;
240 case NODE_KEY_IP_ADDRESS:
241 return IP_LEN;
242 case NODE_KEY_DEV_NAME:
243 return DEVICE_NAME_BUF_LEN;
244 case NODE_KEY_NETWORK_CAPABILITY:
245 return LNN_COMMON_LEN;
246 case NODE_KEY_NETWORK_TYPE:
247 return LNN_COMMON_LEN;
248 case NODE_KEY_DATA_CHANGE_FLAG:
249 return DATA_CHANGE_FLAG_BUF_LEN;
250 case NODE_KEY_NODE_ADDRESS:
251 return SHORT_ADDRESS_MAX_LEN;
252 default:
253 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid node key type: %d", key);
254 return SOFTBUS_ERR;
255 }
256 }
257
SoftbusDumpPrintUdid(int fd,NodeBasicInfo * nodeInfo)258 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintUdid(int fd, NodeBasicInfo *nodeInfo)
259 {
260 NodeDeviceInfoKey key;
261 key = NODE_KEY_UDID;
262 unsigned char udid[UDID_BUF_LEN] = {0};
263 char newUdid[UDID_BUF_LEN] = {0};
264
265 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, udid, UDID_BUF_LEN) != 0) {
266 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo Udid failed!");
267 return SOFTBUS_ERR;
268 }
269 DataMasking((char *)udid, UDID_BUF_LEN, ID_DELIMITER, newUdid);
270 SOFTBUS_DPRINTF(fd, "Udid = %s\n", newUdid);
271 return SOFTBUS_OK;
272 }
273
SoftbusDumpPrintUuid(int fd,NodeBasicInfo * nodeInfo)274 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintUuid(int fd, NodeBasicInfo *nodeInfo)
275 {
276 NodeDeviceInfoKey key;
277 key = NODE_KEY_UUID;
278 unsigned char uuid[UUID_BUF_LEN] = {0};
279 char newUuid[UUID_BUF_LEN] = {0};
280
281 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, uuid, UUID_BUF_LEN) != 0) {
282 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo Uuid failed!");
283 return SOFTBUS_ERR;
284 }
285 DataMasking((char *)uuid, UUID_BUF_LEN, ID_DELIMITER, newUuid);
286 SOFTBUS_DPRINTF(fd, "Uuid = %s\n", newUuid);
287 return SOFTBUS_OK;
288 }
289
SoftbusDumpPrintMac(int fd,NodeBasicInfo * nodeInfo)290 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintMac(int fd, NodeBasicInfo *nodeInfo)
291 {
292 NodeDeviceInfoKey key;
293 key = NODE_KEY_BR_MAC;
294 unsigned char brMac[BT_MAC_LEN] = {0};
295 char newBrMac[BT_MAC_LEN] = {0};
296
297 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, brMac, BT_MAC_LEN) != 0) {
298 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo brMac failed!");
299 return SOFTBUS_ERR;
300 }
301 DataMasking((char *)brMac, BT_MAC_LEN, MAC_DELIMITER, newBrMac);
302 SOFTBUS_DPRINTF(fd, "BrMac = %s\n", newBrMac);
303 return SOFTBUS_OK;
304 }
305
SoftbusDumpPrintIp(int fd,NodeBasicInfo * nodeInfo)306 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintIp(int fd, NodeBasicInfo *nodeInfo)
307 {
308 NodeDeviceInfoKey key;
309 key = NODE_KEY_IP_ADDRESS;
310 char ipAddr[IP_STR_MAX_LEN] = {0};
311 char newIpAddr[IP_STR_MAX_LEN] = {0};
312
313 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, (uint8_t *)ipAddr, IP_STR_MAX_LEN) != 0) {
314 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo ipAddr failed!");
315 return SOFTBUS_ERR;
316 }
317 DataMasking((char *)ipAddr, IP_STR_MAX_LEN, IP_DELIMITER, newIpAddr);
318 SOFTBUS_DPRINTF(fd, "IpAddr = %s\n", newIpAddr);
319 return SOFTBUS_OK;
320 }
321
SoftbusDumpPrintNetCapacity(int fd,NodeBasicInfo * nodeInfo)322 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintNetCapacity(int fd, NodeBasicInfo *nodeInfo)
323 {
324 NodeDeviceInfoKey key;
325 key = NODE_KEY_NETWORK_CAPABILITY;
326 int32_t netCapacity = 0;
327 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, (uint8_t *)&netCapacity, LNN_COMMON_LEN) != 0) {
328 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo netCapacity failed!");
329 return SOFTBUS_ERR;
330 }
331 SOFTBUS_DPRINTF(fd, "NetCapacity = %d\n", netCapacity);
332 return SOFTBUS_OK;
333 }
334
SoftbusDumpPrintNetType(int fd,NodeBasicInfo * nodeInfo)335 NO_SANITIZE("cfi") int32_t SoftbusDumpPrintNetType(int fd, NodeBasicInfo *nodeInfo)
336 {
337 NodeDeviceInfoKey key;
338 key = NODE_KEY_NETWORK_TYPE;
339 int32_t netType = 0;
340 if (LnnGetNodeKeyInfo(nodeInfo->networkId, key, (uint8_t *)&netType, LNN_COMMON_LEN) != 0) {
341 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetNodeKeyInfo netType failed!");
342 return SOFTBUS_ERR;
343 }
344 SOFTBUS_DPRINTF(fd, "NetType = %d\n", netType);
345 return SOFTBUS_OK;
346 }
347
SoftBusDumpBusCenterPrintInfo(int fd,NodeBasicInfo * nodeInfo)348 NO_SANITIZE("cfi") void SoftBusDumpBusCenterPrintInfo(int fd, NodeBasicInfo *nodeInfo)
349 {
350 if (fd <= 0 || nodeInfo == NULL) {
351 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "param is null");
352 return;
353 }
354 SOFTBUS_DPRINTF(fd, "DeviceName = %s\n", nodeInfo->deviceName);
355 char networkId[NETWORK_ID_BUF_LEN] = {0};
356 DataMasking(nodeInfo->networkId, NETWORK_ID_BUF_LEN, ID_DELIMITER, networkId);
357 SOFTBUS_DPRINTF(fd, "NetworkId = %s\n", networkId);
358 if (SoftbusDumpPrintUdid(fd, nodeInfo) != SOFTBUS_OK) {
359 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintUdid failed!");
360 return;
361 }
362 if (SoftbusDumpPrintUuid(fd, nodeInfo) != SOFTBUS_OK) {
363 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintUuid failed!");
364 return;
365 }
366 if (SoftbusDumpPrintMac(fd, nodeInfo) != SOFTBUS_OK) {
367 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintMac failed!");
368 return;
369 }
370 if (SoftbusDumpPrintIp(fd, nodeInfo) != SOFTBUS_OK) {
371 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintIp failed!");
372 return;
373 }
374 if (SoftbusDumpPrintNetCapacity(fd, nodeInfo) != SOFTBUS_OK) {
375 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintNetCapacity failed!");
376 return;
377 }
378 if (SoftbusDumpPrintNetType(fd, nodeInfo) != SOFTBUS_OK) {
379 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "SoftbusDumpPrintNetType failed!");
380 return;
381 }
382 }
383