• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }