1 /*
2 * Copyright (c) 2022-2024 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 "auth_session_message.h"
17
18 #include <math.h>
19 #include <securec.h>
20
21 #include "anonymizer.h"
22 #include "auth_common.h"
23 #include "auth_connection.h"
24 #include "auth_hichain_adapter.h"
25 #include "auth_log.h"
26 #include "auth_manager.h"
27 #include "auth_request.h"
28 #include "auth_session_json.h"
29 #include "bus_center_manager.h"
30 #include "lnn_common_utils.h"
31 #include "lnn_compress.h"
32 #include "lnn_event.h"
33 #include "lnn_extdata_config.h"
34 #include "lnn_feature_capability.h"
35 #include "lnn_lane_link.h"
36 #include "lnn_lane_listener.h"
37 #include "lnn_local_net_ledger.h"
38 #include "lnn_network_manager.h"
39 #include "lnn_node_info.h"
40 #include "lnn_trans_lane.h"
41 #include "softbus_adapter_json.h"
42 #include "softbus_adapter_mem.h"
43 #include "softbus_adapter_socket.h"
44 #include "softbus_adapter_timer.h"
45 #include "softbus_config_type.h"
46 #include "softbus_def.h"
47 #include "softbus_error_code.h"
48 #include "softbus_feature_config.h"
49 #include "softbus_json_utils.h"
50 #include "softbus_socket.h"
51 #include "wifi_direct_manager.h"
52
53 #define FLAG_COMPRESS_DEVICE_INFO 1
54 #define FLAG_UNCOMPRESS_DEVICE_INFO 0
55 #define FLAG_RELAY_DEVICE_INFO 1
56 #define DEVICE_ID_STR_LEN 64 // for bt v1
57
UnPackBtDeviceIdV1(AuthSessionInfo * info,const uint8_t * data,uint32_t len)58 static int32_t UnPackBtDeviceIdV1(AuthSessionInfo *info, const uint8_t *data, uint32_t len)
59 {
60 if (!info->isServer) {
61 AUTH_LOGE(AUTH_FSM, "is not server");
62 return SOFTBUS_INVALID_PARAM;
63 }
64 if (memcpy_s(info->udid, UDID_BUF_LEN, data, len) != EOK) { // data:StandardCharsets.UTF_8
65 AUTH_LOGE(AUTH_FSM, "memcpy fail");
66 return SOFTBUS_MEM_ERR;
67 }
68 return SOFTBUS_OK;
69 }
70
PostDeviceIdData(int64_t authSeq,const AuthSessionInfo * info,uint8_t * data,uint32_t len)71 static int32_t PostDeviceIdData(int64_t authSeq, const AuthSessionInfo *info, uint8_t *data, uint32_t len)
72 {
73 AuthDataHead head = {
74 .dataType = DATA_TYPE_DEVICE_ID,
75 .module = MODULE_TRUST_ENGINE,
76 .seq = authSeq,
77 .flag = info->isConnectServer ? SERVER_SIDE_FLAG : CLIENT_SIDE_FLAG,
78 .len = len,
79 };
80 if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
81 AUTH_LOGE(AUTH_FSM, "post device id fail");
82 return SOFTBUS_AUTH_SEND_FAIL;
83 }
84 return SOFTBUS_OK;
85 }
86
PostBtV1DevId(int64_t authSeq,const AuthSessionInfo * info)87 static int32_t PostBtV1DevId(int64_t authSeq, const AuthSessionInfo *info)
88 {
89 if (!info->isServer) {
90 AUTH_LOGE(AUTH_FSM, "client don't send Bt-v1 devId");
91 return SOFTBUS_AUTH_NOT_NEED_SEND_V1_DEV_ID;
92 }
93 char uuid[UUID_BUF_LEN] = { 0 };
94 if (LnnGetLocalStrInfo(STRING_KEY_UUID, uuid, UUID_BUF_LEN) != SOFTBUS_OK) {
95 AUTH_LOGE(AUTH_FSM, "get uuid fail");
96 return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
97 }
98 return PostDeviceIdData(authSeq, info, (uint8_t *)uuid, strlen(uuid));
99 }
100
PostWifiV1DevId(int64_t authSeq,const AuthSessionInfo * info)101 static int32_t PostWifiV1DevId(int64_t authSeq, const AuthSessionInfo *info)
102 {
103 if (!info->isServer) {
104 AUTH_LOGE(AUTH_FSM, "client don't send wifi-v1 devId");
105 return SOFTBUS_AUTH_NOT_NEED_SEND_V1_DEV_ID;
106 }
107 char *msg = PackDeviceIdJson(info, authSeq);
108 if (msg == NULL) {
109 AUTH_LOGE(AUTH_FSM, "pack devId fail");
110 return SOFTBUS_AUTH_PACK_DEV_ID_FAIL;
111 }
112 if (PostDeviceIdData(authSeq, info, (uint8_t *)msg, strlen(msg) + 1) != SOFTBUS_OK) {
113 JSON_Free(msg);
114 return SOFTBUS_AUTH_SEND_FAIL;
115 }
116 JSON_Free(msg);
117 return SOFTBUS_OK;
118 }
119
PostDeviceIdV1(int64_t authSeq,const AuthSessionInfo * info)120 static int32_t PostDeviceIdV1(int64_t authSeq, const AuthSessionInfo *info)
121 {
122 if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
123 return PostWifiV1DevId(authSeq, info);
124 } else {
125 AUTH_LOGI(AUTH_FSM, "process v1 bt deviceIdSync");
126 return PostBtV1DevId(authSeq, info);
127 }
128 }
129
PostDeviceIdNew(int64_t authSeq,const AuthSessionInfo * info)130 static int32_t PostDeviceIdNew(int64_t authSeq, const AuthSessionInfo *info)
131 {
132 char *msg = PackDeviceIdJson(info, authSeq);
133 if (msg == NULL) {
134 AUTH_LOGE(AUTH_FSM, "pack devId fail");
135 return SOFTBUS_AUTH_PACK_DEV_ID_FAIL;
136 }
137 if (PostDeviceIdData(authSeq, info, (uint8_t *)msg, strlen(msg) + 1) != SOFTBUS_OK) {
138 JSON_Free(msg);
139 return SOFTBUS_AUTH_SEND_FAIL;
140 }
141 JSON_Free(msg);
142 return SOFTBUS_OK;
143 }
144
DfxRecordLnnPostDeviceIdStart(int64_t authSeq,const AuthSessionInfo * info)145 static void DfxRecordLnnPostDeviceIdStart(int64_t authSeq, const AuthSessionInfo *info)
146 {
147 LnnEventExtra extra = { 0 };
148 LnnEventExtraInit(&extra);
149 extra.authId = (int32_t)authSeq;
150 if (info != NULL) {
151 extra.authRequestId = (int32_t)info->requestId;
152 }
153 LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_DEVICE_ID_POST, extra);
154 }
155
PostDeviceIdMessage(int64_t authSeq,const AuthSessionInfo * info)156 int32_t PostDeviceIdMessage(int64_t authSeq, const AuthSessionInfo *info)
157 {
158 DfxRecordLnnPostDeviceIdStart(authSeq, info);
159 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
160 if (info->version == SOFTBUS_OLD_V1) {
161 return PostDeviceIdV1(authSeq, info);
162 } else {
163 return PostDeviceIdNew(authSeq, info);
164 }
165 }
166
ProcessDeviceIdMessage(AuthSessionInfo * info,const uint8_t * data,uint32_t len,int64_t authSeq)167 int32_t ProcessDeviceIdMessage(AuthSessionInfo *info, const uint8_t *data, uint32_t len, int64_t authSeq)
168 {
169 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
170 AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
171 if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI && info->connInfo.type != AUTH_LINK_TYPE_USB) &&
172 (len == DEVICE_ID_STR_LEN) && (info->isServer)) {
173 info->version = SOFTBUS_OLD_V1;
174 return UnPackBtDeviceIdV1(info, data, len);
175 }
176 return UnpackDeviceIdJson((const char *)data, len, info, authSeq);
177 }
178
GetDumpSessionKeyList(int64_t authSeq,const AuthSessionInfo * info,SessionKeyList * list)179 static void GetDumpSessionKeyList(int64_t authSeq, const AuthSessionInfo *info, SessionKeyList *list)
180 {
181 ListInit(list);
182 SessionKey sessionKey;
183 int64_t index = authSeq;
184 if (info->normalizedType == NORMALIZED_SUPPORT) {
185 index = info->normalizedIndex;
186 }
187 if (AuthManagerGetSessionKey(index, info, &sessionKey) != SOFTBUS_OK) {
188 AUTH_LOGE(AUTH_FSM, "get session key fail");
189 return;
190 }
191 if (AddSessionKey(list, TO_INT32(index), &sessionKey, info->connInfo.type, false) != SOFTBUS_OK) {
192 AUTH_LOGE(AUTH_FSM, "add session key fail");
193 (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
194 return;
195 }
196 (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
197 if (SetSessionKeyAvailable(list, TO_INT32(index)) != SOFTBUS_OK) {
198 AUTH_LOGE(AUTH_FSM, "set session key available fail");
199 }
200 }
201
DfxRecordLnnPostDeviceInfoStart(int64_t authSeq,const AuthSessionInfo * info)202 static void DfxRecordLnnPostDeviceInfoStart(int64_t authSeq, const AuthSessionInfo *info)
203 {
204 LnnEventExtra extra = { 0 };
205 LnnEventExtraInit(&extra);
206 extra.authId = (int32_t)authSeq;
207 if (info != NULL) {
208 extra.authRequestId = (int32_t)info->requestId;
209 }
210 LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_DEVICE_INFO_POST, extra);
211 }
212
SetCompressFlagByAuthInfo(const AuthSessionInfo * info,char * msg,int32_t * compressFlag,uint8_t ** compressData,uint32_t * compressLen)213 static void SetCompressFlagByAuthInfo(
214 const AuthSessionInfo *info, char *msg, int32_t *compressFlag, uint8_t **compressData, uint32_t *compressLen)
215 {
216 if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI && info->connInfo.type != AUTH_LINK_TYPE_USB) &&
217 info->isSupportCompress) {
218 AUTH_LOGI(AUTH_FSM, "before compress, datalen=%{public}zu", strlen(msg) + 1);
219 if (DataCompress((uint8_t *)msg, strlen(msg) + 1, compressData, compressLen) != SOFTBUS_OK) {
220 *compressFlag = FLAG_UNCOMPRESS_DEVICE_INFO;
221 } else {
222 *compressFlag = FLAG_COMPRESS_DEVICE_INFO;
223 AUTH_LOGI(AUTH_FSM, "deviceInfo compress finish");
224 }
225 AUTH_LOGI(AUTH_FSM, "after compress, datalen=%{public}u", *compressLen);
226 }
227 }
228
SetIndataInfo(InDataInfo * inDataInfo,uint8_t * compressData,uint32_t compressLen,char * msg)229 static void SetIndataInfo(InDataInfo *inDataInfo, uint8_t *compressData, uint32_t compressLen, char *msg)
230 {
231 if ((compressData != NULL) && (compressLen != 0)) {
232 inDataInfo->inData = compressData;
233 inDataInfo->inLen = compressLen;
234 } else {
235 inDataInfo->inData = (uint8_t *)msg;
236 inDataInfo->inLen = strlen(msg) + 1;
237 }
238 }
239
PostDeviceInfoMessage(int64_t authSeq,const AuthSessionInfo * info)240 int32_t PostDeviceInfoMessage(int64_t authSeq, const AuthSessionInfo *info)
241 {
242 DfxRecordLnnPostDeviceInfoStart(authSeq, info);
243 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
244 char *msg = PackDeviceInfoMessage(&(info->connInfo), info->version, false, info->uuid, info);
245 if (msg == NULL) {
246 AUTH_LOGE(AUTH_FSM, "pack device info fail");
247 return SOFTBUS_AUTH_PACK_DEVINFO_FAIL;
248 }
249 int32_t compressFlag = FLAG_UNCOMPRESS_DEVICE_INFO;
250 uint8_t *compressData = NULL;
251 uint32_t compressLen = 0;
252 SetCompressFlagByAuthInfo(info, msg, &compressFlag, &compressData, &compressLen);
253 InDataInfo inDataInfo = { 0 };
254 uint8_t *data = NULL;
255 uint32_t dataLen = 0;
256 SetIndataInfo(&inDataInfo, compressData, compressLen, msg);
257 SessionKeyList sessionKeyList;
258 GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
259 if (EncryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &data, &dataLen) != SOFTBUS_OK) {
260 AUTH_LOGE(AUTH_FSM, "encrypt device info fail");
261 JSON_Free(msg);
262 SoftBusFree(compressData);
263 return SOFTBUS_ENCRYPT_ERR;
264 }
265 JSON_Free(msg);
266 SoftBusFree(compressData);
267 DestroySessionKeyList(&sessionKeyList);
268 if ((info->connInfo.type == AUTH_LINK_TYPE_WIFI || info->connInfo.type == AUTH_LINK_TYPE_USB) && info->isServer) {
269 compressFlag = FLAG_RELAY_DEVICE_INFO;
270 authSeq = info->headSeq;
271 }
272 AuthDataHead head = {
273 .dataType = DATA_TYPE_DEVICE_INFO,
274 .module = MODULE_AUTH_CONNECTION,
275 .seq = authSeq,
276 .flag = compressFlag,
277 .len = dataLen,
278 };
279 if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
280 AUTH_LOGE(AUTH_FSM, "post device info fail");
281 SoftBusFree(data);
282 return SOFTBUS_AUTH_SEND_FAIL;
283 }
284 SoftBusFree(data);
285 return SOFTBUS_OK;
286 }
287
TryUpdateLaneResourceLaneId(AuthSessionInfo * info)288 int32_t TryUpdateLaneResourceLaneId(AuthSessionInfo *info)
289 {
290 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
291 int32_t ret;
292 char localUDID[UDID_BUF_LEN] = { 0 };
293 ret = LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUDID, UDID_BUF_LEN);
294 AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "get local udid fail");
295 uint64_t oldLaneId = GenerateLaneId(localUDID, info->connInfo.info.ipInfo.ip, LANE_HML_RAW);
296 uint64_t newLaneId = GenerateLaneId(localUDID, info->nodeInfo.deviceInfo.deviceUdid, LANE_HML_RAW);
297 ret = UpdateLaneResourceLaneId(oldLaneId, newLaneId, info->nodeInfo.deviceInfo.deviceUdid);
298 AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "update lane resource laneid fail");
299 ret = UpdateLaneBusinessInfoItem(oldLaneId, newLaneId);
300 AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "update lane business info fail");
301 ret = UpdateReqListLaneId(oldLaneId, newLaneId);
302 AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "update req list laneid fail");
303 return SOFTBUS_OK;
304 }
305
ProcessDeviceInfoMessage(int64_t authSeq,AuthSessionInfo * info,const uint8_t * data,uint32_t len)306 int32_t ProcessDeviceInfoMessage(int64_t authSeq, AuthSessionInfo *info, const uint8_t *data, uint32_t len)
307 {
308 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
309 AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
310 uint8_t *msg = NULL;
311 uint32_t msgSize = 0;
312 SessionKeyList sessionKeyList;
313 GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
314 InDataInfo inDataInfo = { .inData = data, .inLen = len };
315 if (DecryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &msg, &msgSize) != SOFTBUS_OK) {
316 AUTH_LOGE(AUTH_FSM, "decrypt device info fail");
317 return SOFTBUS_DECRYPT_ERR;
318 }
319 DestroySessionKeyList(&sessionKeyList);
320 uint8_t *decompressData = NULL;
321 uint32_t decompressLen = 0;
322 if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI && info->connInfo.type != AUTH_LINK_TYPE_USB) &&
323 info->isSupportCompress) {
324 AUTH_LOGI(AUTH_FSM, "before decompress, msgSize=%{public}u", msgSize);
325 if (DataDecompress((uint8_t *)msg, msgSize, &decompressData, &decompressLen) != SOFTBUS_OK) {
326 AUTH_LOGE(AUTH_FSM, "data decompress fail");
327 SoftBusFree(msg);
328 return SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL;
329 } else {
330 AUTH_LOGI(AUTH_FSM, "deviceInfo deCompress finish, decompress=%{public}d", decompressLen);
331 }
332 AUTH_LOGI(AUTH_FSM, "after decompress, datalen=%{public}d", decompressLen);
333 }
334 DevInfoData devInfo = { NULL, 0, info->connInfo.type, info->version };
335 if ((decompressData != NULL) && (decompressLen != 0)) {
336 devInfo.msg = (const char *)decompressData;
337 devInfo.len = decompressLen;
338 } else {
339 devInfo.msg = (const char *)msg;
340 devInfo.len = msgSize;
341 }
342 if (UnpackDeviceInfoMessage(&devInfo, &info->nodeInfo, false, info) != SOFTBUS_OK) {
343 AUTH_LOGE(AUTH_FSM, "unpack device info fail");
344 SoftBusFree(msg);
345 SoftBusFree(decompressData);
346 return SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL;
347 }
348 SoftBusFree(msg);
349 SoftBusFree(decompressData);
350 return SOFTBUS_OK;
351 }
352
PostCloseAckMessage(int64_t authSeq,const AuthSessionInfo * info)353 int32_t PostCloseAckMessage(int64_t authSeq, const AuthSessionInfo *info)
354 {
355 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
356 const char *msg = "";
357 AuthDataHead head = {
358 .dataType = DATA_TYPE_CLOSE_ACK,
359 .module = 0,
360 .seq = authSeq,
361 .flag = 0,
362 .len = strlen(msg) + 1,
363 };
364 if (PostAuthData(info->connId, !info->isServer, &head, (uint8_t *)msg) != SOFTBUS_OK) {
365 AUTH_LOGE(AUTH_FSM, "post close ack fail");
366 return SOFTBUS_AUTH_SEND_FAIL;
367 }
368 return SOFTBUS_OK;
369 }
370
PostHichainAuthMessage(int64_t authSeq,const AuthSessionInfo * info,const uint8_t * data,uint32_t len)371 int32_t PostHichainAuthMessage(int64_t authSeq, const AuthSessionInfo *info, const uint8_t *data, uint32_t len)
372 {
373 AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
374 AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
375 AuthDataHead head = {
376 .dataType = DATA_TYPE_AUTH,
377 .module = MODULE_AUTH_SDK,
378 .seq = authSeq,
379 .flag = 0,
380 .len = len,
381 };
382 if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
383 AUTH_LOGE(AUTH_FSM, "post hichain data fail");
384 return SOFTBUS_AUTH_SEND_FAIL;
385 }
386 return SOFTBUS_OK;
387 }
388
PackVerifyDeviceMessage(const char * uuid)389 static char *PackVerifyDeviceMessage(const char *uuid)
390 {
391 JsonObj *obj = JSON_CreateObject();
392 if (obj == NULL) {
393 AUTH_LOGE(AUTH_FSM, "create json fail");
394 return NULL;
395 }
396 if (!JSON_AddInt32ToObject(obj, CODE, CODE_VERIFY_DEVICE) || !JSON_AddStringToObject(obj, DEVICE_ID, uuid)) {
397 AUTH_LOGE(AUTH_FSM, "add uuid fail");
398 JSON_Delete(obj);
399 return NULL;
400 }
401 char *msg = JSON_PrintUnformatted(obj);
402 JSON_Delete(obj);
403 return msg;
404 }
405
PackKeepaliveMessage(const char * uuid,ModeCycle cycle)406 static char *PackKeepaliveMessage(const char *uuid, ModeCycle cycle)
407 {
408 JsonObj *obj = JSON_CreateObject();
409 if (obj == NULL) {
410 AUTH_LOGE(AUTH_FSM, "create json fail");
411 return NULL;
412 }
413 if (!JSON_AddInt32ToObject(obj, CODE, CODE_TCP_KEEPALIVE) || !JSON_AddStringToObject(obj, DEVICE_ID, uuid) ||
414 !JSON_AddInt32ToObject(obj, TIME, cycle)) {
415 AUTH_LOGE(AUTH_FSM, "add uuid or cycle fail");
416 JSON_Delete(obj);
417 return NULL;
418 }
419 char *msg = JSON_PrintUnformatted(obj);
420 JSON_Delete(obj);
421 return msg;
422 }
423
IsDeviceMessagePacket(const AuthConnInfo * connInfo,const AuthDataHead * head,const uint8_t * data,bool isServer,DeviceMessageParse * messageParse)424 bool IsDeviceMessagePacket(const AuthConnInfo *connInfo, const AuthDataHead *head, const uint8_t *data, bool isServer,
425 DeviceMessageParse *messageParse)
426 {
427 if (connInfo->type != AUTH_LINK_TYPE_WIFI && connInfo->type != AUTH_LINK_TYPE_USB) {
428 return false;
429 }
430 int64_t authId = AuthDeviceGetIdByConnInfo(connInfo, isServer);
431 if (authId == AUTH_INVALID_ID) {
432 AUTH_LOGE(AUTH_FSM, "is flush device packet not find authId");
433 return false;
434 }
435 uint32_t decDataLen = AuthGetDecryptSize(head->len);
436 uint8_t *decData = (uint8_t *)SoftBusCalloc(decDataLen);
437 if (decData == NULL) {
438 return false;
439 }
440 AuthHandle authHandle = { .authId = authId, .type = connInfo->type };
441 if (AuthDeviceDecrypt(&authHandle, data, head->len, decData, &decDataLen) != SOFTBUS_OK) {
442 SoftBusFree(decData);
443 AUTH_LOGE(AUTH_FSM, "parse device info decrypt fail");
444 return false;
445 }
446 JsonObj *json = JSON_Parse((char *)decData, decDataLen);
447 if (json == NULL) {
448 AUTH_LOGE(AUTH_FSM, "parse json fail");
449 SoftBusFree(decData);
450 return false;
451 }
452 bool result = false;
453 if (!JSON_GetInt32FromOject(json, CODE, &messageParse->messageType)) {
454 AUTH_LOGE(AUTH_FSM, "parse messageType fail");
455 }
456 AUTH_LOGI(AUTH_FSM, "messageType=%{public}d", messageParse->messageType);
457 if (messageParse->messageType == CODE_VERIFY_DEVICE) {
458 result = true;
459 }
460 if (messageParse->messageType == CODE_TCP_KEEPALIVE) {
461 if (JSON_GetInt32FromOject(json, TIME, (int32_t *)&messageParse->cycle)) {
462 AUTH_LOGI(AUTH_FSM, "parse keepalive cycle success, cycle=%{public}d", messageParse->cycle);
463 result = true;
464 }
465 }
466 JSON_Delete(json);
467 SoftBusFree(decData);
468 return result;
469 }
470
IsEmptyShortHashStr(char * udidHash)471 static bool IsEmptyShortHashStr(char *udidHash)
472 {
473 if (strlen(udidHash) == 0) {
474 AUTH_LOGE(AUTH_FSM, "udidHash len is 0");
475 return true;
476 }
477 uint8_t emptyHash[SHORT_HASH_LEN] = { 0 };
478 char emptyHashStr[UDID_SHORT_HASH_HEX_STR + 1] = { 0 };
479 if (ConvertBytesToHexString(emptyHashStr, UDID_SHORT_HASH_HEX_STR + 1, emptyHash, SHORT_HASH_LEN) != SOFTBUS_OK) {
480 AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
481 return false;
482 }
483 if (strncmp(emptyHashStr, udidHash, strlen(emptyHashStr)) == EOK) {
484 AUTH_LOGE(AUTH_FSM, "udidHash is null");
485 return true;
486 }
487 return false;
488 }
489
GetLocalUdidHash(char * udid,char * udidHash,uint32_t len)490 static int32_t GetLocalUdidHash(char *udid, char *udidHash, uint32_t len)
491 {
492 if (udid == NULL || udidHash == NULL || len < UDID_HASH_LEN) {
493 AUTH_LOGE(AUTH_FSM, "invalid param");
494 return SOFTBUS_INVALID_PARAM;
495 }
496 uint8_t hash[UDID_HASH_LEN] = { 0 };
497 if (SoftBusGenerateStrHash((unsigned char *)udid, strlen(udid), (unsigned char *)hash) != SOFTBUS_OK) {
498 AUTH_LOGE(AUTH_FSM, "restore manager fail because generate strhash");
499 return SOFTBUS_NETWORK_GENERATE_STR_HASH_ERR;
500 }
501 if (ConvertBytesToHexString(udidHash, len, hash, UDID_SHORT_HASH_LEN_TEMP) != SOFTBUS_OK) {
502 AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
503 return SOFTBUS_NETWORK_BYTES_TO_HEX_STR_ERR;
504 }
505 return SOFTBUS_OK;
506 }
507
UpdateLocalAuthState(int64_t authSeq,AuthSessionInfo * info)508 int32_t UpdateLocalAuthState(int64_t authSeq, AuthSessionInfo *info)
509 {
510 CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
511 if (info->isServer && strlen(info->udid) == 0) {
512 info->localState = AUTH_STATE_UNKNOW;
513 AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 ", udid is null update local auth state=%{public}d", authSeq,
514 info->localState);
515 return SOFTBUS_OK;
516 }
517 if (info->peerState == AUTH_STATE_COMPATIBLE) {
518 info->localState = AUTH_STATE_COMPATIBLE;
519 AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
520 return SOFTBUS_OK;
521 }
522 if (info->peerState == AUTH_STATE_ACK || info->peerState == AUTH_STATE_START) {
523 info->localState = AUTH_STATE_ACK;
524 AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
525 return SOFTBUS_OK;
526 }
527 char udid[UDID_BUF_LEN] = { 0 };
528 if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, udid, UDID_BUF_LEN) != SOFTBUS_OK) {
529 AUTH_LOGE(AUTH_FSM, "get local udid fail");
530 return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
531 }
532 char localUdidHash[SHA_256_HEX_HASH_LEN] = { 0 };
533 char udidHash[SHA_256_HEX_HASH_LEN] = { 0 };
534 if (GetLocalUdidHash(udid, localUdidHash, SHA_256_HEX_HASH_LEN) != SOFTBUS_OK) {
535 AUTH_LOGE(AUTH_FSM, "get local udid hash fail");
536 return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
537 }
538 if (!GetUdidShortHash(info, udidHash, SHA_256_HEX_HASH_LEN) || IsEmptyShortHashStr(udidHash)) {
539 AUTH_LOGI(AUTH_FSM, "unknow peer udidHash");
540 info->localState = AUTH_STATE_UNKNOW;
541 } else if (memcmp(localUdidHash, udidHash, SHORT_HASH_LEN) < 0) {
542 info->localState = AUTH_STATE_WAIT;
543 } else if (memcmp(localUdidHash, udidHash, SHORT_HASH_LEN) > 0) {
544 info->localState = AUTH_STATE_START;
545 } else {
546 AUTH_LOGE(AUTH_FSM, "peer udidHash = local udidHash!");
547 info->localState = AUTH_STATE_START;
548 }
549 if (strlen(udidHash) != 0 && strcpy_s(info->udidHash, SHA_256_HEX_HASH_LEN, udidHash) != EOK) {
550 AUTH_LOGE(AUTH_FSM, "memcpy udidHash fail");
551 return SOFTBUS_MEM_ERR;
552 }
553 AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
554 return SOFTBUS_OK;
555 }
556
PostDeviceMessage(const AuthManager * auth,int32_t flagRelay,AuthLinkType type,const DeviceMessageParse * messageParse)557 int32_t PostDeviceMessage(
558 const AuthManager *auth, int32_t flagRelay, AuthLinkType type, const DeviceMessageParse *messageParse)
559 {
560 AUTH_CHECK_AND_RETURN_RET_LOGE(auth != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "auth is NULL");
561 if (messageParse == NULL) {
562 AUTH_LOGE(AUTH_FSM, "invalid param");
563 return SOFTBUS_INVALID_PARAM;
564 }
565 if (type < AUTH_LINK_TYPE_WIFI || type >= AUTH_LINK_TYPE_MAX) {
566 AUTH_LOGE(AUTH_FSM, "type error, type=%{public}d", type);
567 return SOFTBUS_AUTH_CONN_TYPE_INVALID;
568 }
569 char *msg = NULL;
570 if (messageParse->messageType == CODE_VERIFY_DEVICE) {
571 msg = PackVerifyDeviceMessage(auth->uuid);
572 } else if (messageParse->messageType == CODE_TCP_KEEPALIVE) {
573 msg = PackKeepaliveMessage(auth->uuid, messageParse->cycle);
574 }
575 if (msg == NULL) {
576 AUTH_LOGE(AUTH_FSM, "pack verify device msg fail");
577 return SOFTBUS_AUTH_PACK_VERIFY_MSG_FAIL;
578 }
579
580 uint8_t *data = NULL;
581 uint32_t dataLen = 0;
582 InDataInfo inDataInfo = { .inData = (uint8_t *)msg, .inLen = strlen(msg) + 1 };
583 if (EncryptInner(&auth->sessionKeyList, type, &inDataInfo, &data, &dataLen) != SOFTBUS_OK) {
584 AUTH_LOGE(AUTH_FSM, "encrypt device info fail");
585 JSON_Free(msg);
586 return SOFTBUS_ENCRYPT_ERR;
587 }
588 JSON_Free(msg);
589
590 AuthDataHead head = {
591 .dataType = DATA_TYPE_DEVICE_INFO,
592 .module = MODULE_AUTH_CONNECTION,
593 .seq = auth->authId,
594 .flag = flagRelay,
595 .len = dataLen,
596 };
597 if (PostAuthData(auth->connId[type], !auth->isServer, &head, data) != SOFTBUS_OK) {
598 AUTH_LOGE(AUTH_FSM, "post verify device msg fail");
599 SoftBusFree(data);
600 return SOFTBUS_AUTH_SEND_FAIL;
601 }
602 SoftBusFree(data);
603 return SOFTBUS_OK;
604 }