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_fsm.h"
17 
18 #include <securec.h>
19 
20 #include "anonymizer.h"
21 #include "auth_attest_interface.h"
22 #include "auth_connection.h"
23 #include "auth_device_common_key.h"
24 #include "auth_hichain.h"
25 #include "auth_normalize_request.h"
26 #include "auth_log.h"
27 #include "auth_manager.h"
28 #include "auth_request.h"
29 #include "auth_session_json.h"
30 #include "auth_session_message.h"
31 #include "bus_center_manager.h"
32 #include "lnn_distributed_net_ledger.h"
33 #include "lnn_event.h"
34 #include "lnn_feature_capability.h"
35 #include "softbus_adapter_bt_common.h"
36 #include "softbus_adapter_hitrace.h"
37 #include "softbus_adapter_mem.h"
38 #include "softbus_def.h"
39 
40 #define AUTH_TIMEOUT_MS (10 * 1000)
41 #define TO_AUTH_FSM(ptr) CONTAINER_OF(ptr, AuthFsm, fsm)
42 #define SHORT_UDID_HASH_LEN 8
43 #define HICHAIN_RETURN_NOT_TRUSTED (-425919748)
44 
45 typedef enum {
46     FSM_MSG_RECV_DEVICE_ID,
47     FSM_MSG_RECV_AUTH_DATA,
48     FSM_MSG_SAVE_SESSION_KEY,
49     FSM_MSG_AUTH_ERROR,
50     FSM_MSG_RECV_DEVICE_INFO,
51     FSM_MSG_RECV_CLOSE_ACK,
52     FSM_MSG_AUTH_FINISH,
53     FSM_MSG_AUTH_TIMEOUT,
54     FSM_MSG_DEVICE_NOT_TRUSTED,
55     FSM_MSG_DEVICE_DISCONNECTED,
56     FSM_MSG_DEVICE_POST_DEVICEID,
57     FSM_MSG_STOP_AUTH_FSM,
58     FSM_MSG_UNKNOWN,
59 } StateMessageType;
60 typedef struct {
61     StateMessageType type;
62     char *msg;
63 } StateMsgMap;
64 
65 static const StateMsgMap g_StateMsgMap[] = {
66     {FSM_MSG_RECV_DEVICE_ID, (char *)"RECV_DEVICE_ID"},
67     {FSM_MSG_RECV_AUTH_DATA, (char *)"RECV_AUTH_DATA"},
68     {FSM_MSG_SAVE_SESSION_KEY, (char *)"SAVE_SESSION_KEY"},
69     {FSM_MSG_AUTH_ERROR, (char *)"AUTH_ERROR"},
70     {FSM_MSG_RECV_DEVICE_INFO, (char *)"RECV_DEVICE_INFO"},
71     {FSM_MSG_RECV_CLOSE_ACK, (char *)"RECV_CLOSE_ACK"},
72     {FSM_MSG_AUTH_FINISH, (char *)"AUTH_FINISH"},
73     {FSM_MSG_AUTH_TIMEOUT, (char *)"AUTH_TIMEOUT"},
74     {FSM_MSG_DEVICE_NOT_TRUSTED, (char *)"DEVICE_NOT_TRUSTED"},
75     {FSM_MSG_DEVICE_DISCONNECTED, (char *)"DEVICE_DISCONNECTED"},
76     {FSM_MSG_DEVICE_POST_DEVICEID, (char *)"DEVICE_POST_DEVICEID"},
77     {FSM_MSG_STOP_AUTH_FSM, (char *)"STOP_AUTH_FSM"},
78     {FSM_MSG_UNKNOWN, (char *)"UNKNOWN MSG!!"},
79 };
80 
81 typedef struct {
82     uint32_t len;
83     uint8_t data[0];
84 } MessagePara;
85 
86 typedef struct {
87     int64_t param1;
88     bool param2;
89     AuthFsm *(*getFunc)(int64_t param1, bool param2);
90 } AuthFsmGetFunc;
91 
92 typedef struct {
93     char localIp[IP_LEN];
94     char localBrMac[MAC_LEN];
95     char localBleMac[MAC_LEN];
96     char localUdid[UDID_BUF_LEN];
97     char localNetworkId[NETWORK_ID_BUF_LEN];
98     char localDevName[DEVICE_NAME_BUF_LEN];
99 } AuditReportDevInfo;
100 
101 static ListNode g_authFsmList = { &g_authFsmList, &g_authFsmList };
102 
103 static void SyncNegotiationEnter(FsmStateMachine *fsm);
104 static bool SyncNegotiationStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
105 static void SyncDevIdStateEnter(FsmStateMachine *fsm);
106 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
107 static void DeviceAuthStateEnter(FsmStateMachine *fsm);
108 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
109 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
110 static void AuthFsmDeinitCallback(FsmStateMachine *fsm);
111 
112 static FsmState g_states[STATE_NUM_MAX] = {
113     [STATE_SYNC_NEGOTIATION] = {
114         .enter = SyncNegotiationEnter,
115         .process = SyncNegotiationStateProcess,
116         .exit = NULL,
117     },
118     [STATE_SYNC_DEVICE_ID] = {
119         .enter = SyncDevIdStateEnter,
120         .process = SyncDevIdStateProcess,
121         .exit = NULL,
122     },
123     [STATE_DEVICE_AUTH] = {
124         .enter = DeviceAuthStateEnter,
125         .process = DeviceAuthStateProcess,
126         .exit = NULL,
127     },
128     [STATE_SYNC_DEVICE_INFO] = {
129         .enter = NULL,
130         .process = SyncDevInfoStateProcess,
131         .exit = NULL,
132     },
133 };
134 
FsmMsgTypeToStr(int32_t type)135 static char *FsmMsgTypeToStr(int32_t type)
136 {
137     if (type < FSM_MSG_RECV_DEVICE_ID || type >= FSM_MSG_UNKNOWN) {
138         return g_StateMsgMap[FSM_MSG_UNKNOWN].msg;
139     }
140     return g_StateMsgMap[type].msg;
141 }
142 
TranslateToAuthFsm(FsmStateMachine *fsm, int32_t msgType, MessagePara *para)143 static AuthFsm *TranslateToAuthFsm(FsmStateMachine *fsm, int32_t msgType, MessagePara *para)
144 {
145     if (fsm == NULL) {
146         AUTH_LOGE(AUTH_FSM, "fsm is null");
147         return NULL;
148     }
149     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
150     if (authFsm == NULL) {
151         AUTH_LOGE(AUTH_FSM, "authFsm is null");
152         return NULL;
153     }
154     if (authFsm->isDead) {
155         AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", authFsm->authSeq);
156         return NULL;
157     }
158     /* check para */
159     if ((msgType != FSM_MSG_AUTH_TIMEOUT && msgType != FSM_MSG_DEVICE_NOT_TRUSTED &&
160         msgType != FSM_MSG_DEVICE_DISCONNECTED && msgType != FSM_MSG_STOP_AUTH_FSM) && para == NULL) {
161         AUTH_LOGE(AUTH_FSM, "invalid msgType. msgType=%{public}d", msgType);
162         return NULL;
163     }
164     return authFsm;
165 }
166 
GetNextAuthFsmId(void)167 static uint32_t GetNextAuthFsmId(void)
168 {
169     static uint32_t authFsmId = 0;
170     return ++authFsmId;
171 }
172 
IsNeedExchangeNetworkId(uint32_t feature, AuthCapability capaBit)173 static bool IsNeedExchangeNetworkId(uint32_t feature, AuthCapability capaBit)
174 {
175     return ((feature & (1 << (uint32_t)capaBit)) != 0);
176 }
177 
AddUdidInfo(uint32_t requestId, bool isServer, AuthConnInfo *connInfo)178 static void AddUdidInfo(uint32_t requestId, bool isServer, AuthConnInfo *connInfo)
179 {
180     if (isServer) {
181         AUTH_LOGD(AUTH_FSM, "is not client");
182         return;
183     }
184     AuthRequest request;
185     (void)memset_s(&request, sizeof(request), 0, sizeof(request));
186     if (GetAuthRequestNoLock(requestId, &request) != SOFTBUS_OK) {
187         AUTH_LOGE(AUTH_FSM, "get auth request fail");
188         return;
189     }
190     switch (connInfo->type) {
191         case AUTH_LINK_TYPE_BR:
192             break;
193         case AUTH_LINK_TYPE_WIFI:
194             (void)memcpy_s(connInfo->info.ipInfo.deviceIdHash, UDID_HASH_LEN, request.connInfo.info.ipInfo.deviceIdHash,
195                 UDID_HASH_LEN);
196             break;
197         case AUTH_LINK_TYPE_BLE:
198             (void)memcpy_s(connInfo->info.bleInfo.deviceIdHash, UDID_HASH_LEN,
199                 request.connInfo.info.bleInfo.deviceIdHash, UDID_HASH_LEN);
200             break;
201         case AUTH_LINK_TYPE_P2P:
202         case AUTH_LINK_TYPE_ENHANCED_P2P:
203             if (strcpy_s(connInfo->info.ipInfo.udid, UDID_BUF_LEN, request.connInfo.info.ipInfo.udid) != EOK) {
204                 AUTH_LOGE(AUTH_FSM, "strcpy udid fail");
205                 return;
206             }
207             break;
208         default :
209             AUTH_LOGE(AUTH_FSM, "error type");
210     }
211 }
212 
ProcAuthFsm(uint32_t requestId, bool isServer, AuthFsm *authFsm)213 static int32_t ProcAuthFsm(uint32_t requestId, bool isServer, AuthFsm *authFsm)
214 {
215     AuthRequest request;
216     NodeInfo nodeInfo;
217     (void)memset_s(&request, sizeof(request), 0, sizeof(request));
218     (void)memset_s(&nodeInfo, sizeof(nodeInfo), 0, sizeof(nodeInfo));
219     AddUdidInfo(requestId, isServer, &authFsm->info.connInfo);
220     if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE) {
221         if (GetAuthRequestNoLock(requestId, &request) != SOFTBUS_OK) {
222             AUTH_LOGE(AUTH_FSM, "get auth request fail");
223             return SOFTBUS_ERR;
224         }
225         char udidHash[SHORT_UDID_HASH_HEX_LEN + 1] = {0};
226         int32_t ret = ConvertBytesToHexString(udidHash, SHORT_UDID_HASH_HEX_LEN + 1,
227             (const unsigned char *)request.connInfo.info.bleInfo.deviceIdHash, SHORT_UDID_HASH_LEN);
228         if (ret == SOFTBUS_OK && LnnRetrieveDeviceInfo((const char *)udidHash, &nodeInfo) == SOFTBUS_OK &&
229             IsNeedExchangeNetworkId(nodeInfo.authCapacity, BIT_SUPPORT_EXCHANGE_NETWORKID)) {
230             AUTH_LOGI(AUTH_FSM, "LnnRetrieveDeviceInfo success");
231             authFsm->info.idType = EXCHANGE_NETWORKID;
232         }
233     }
234     return SOFTBUS_OK;
235 }
236 
FillSessionInfoModule(uint32_t requestId, AuthSessionInfo *info)237 static int32_t FillSessionInfoModule(uint32_t requestId, AuthSessionInfo *info)
238 {
239     if (!info->isServer) {
240         AuthRequest request;
241         (void)memset_s(&request, sizeof(request), 0, sizeof(request));
242         int32_t ret = GetAuthRequestNoLock(requestId, &request);
243         if (ret != SOFTBUS_OK) {
244             AUTH_LOGE(AUTH_FSM, "get auth request fail");
245             return ret;
246         }
247         info->module = request.module;
248     }
249     return SOFTBUS_OK;
250 }
251 
CreateAuthFsm(int64_t authSeq, uint32_t requestId, uint64_t connId, const AuthConnInfo *connInfo, bool isServer)252 static AuthFsm *CreateAuthFsm(int64_t authSeq, uint32_t requestId, uint64_t connId,
253     const AuthConnInfo *connInfo, bool isServer)
254 {
255     AuthFsm *authFsm = (AuthFsm *)SoftBusCalloc(sizeof(AuthFsm));
256     if (authFsm == NULL) {
257         AUTH_LOGE(AUTH_FSM, "malloc AuthFsm fail");
258         return NULL;
259     }
260     authFsm->id = GetNextAuthFsmId();
261     authFsm->authSeq = authSeq;
262     authFsm->info.requestId = requestId;
263     authFsm->info.isServer = isServer;
264     authFsm->info.isConnectServer = isServer;
265     authFsm->info.connId = connId;
266     authFsm->info.connInfo = *connInfo;
267     authFsm->info.version = SOFTBUS_NEW_V2;
268     authFsm->info.idType = EXCHANGE_UDID;
269     if (FillSessionInfoModule(requestId, &authFsm->info) != SOFTBUS_OK) {
270         AUTH_LOGE(AUTH_FSM, "fill module fail");
271         return NULL;
272     }
273     if (!isServer) {
274         if (ProcAuthFsm(requestId, isServer, authFsm) != SOFTBUS_OK) {
275             SoftBusFree(authFsm);
276             return NULL;
277         }
278     }
279     if (sprintf_s(authFsm->fsmName, sizeof(authFsm->fsmName), "AuthFsm-%u", authFsm->id) == -1) {
280         AUTH_LOGE(AUTH_FSM, "format auth fsm name fail");
281         SoftBusFree(authFsm);
282         return NULL;
283     }
284     if (LnnFsmInit(&authFsm->fsm, NULL, authFsm->fsmName, AuthFsmDeinitCallback) != SOFTBUS_OK) {
285         AUTH_LOGE(AUTH_FSM, "init fsm fail");
286         SoftBusFree(authFsm);
287         return NULL;
288     }
289     for (int32_t i = 0; i < STATE_NUM_MAX; ++i) {
290         LnnFsmAddState(&authFsm->fsm, &g_states[i]);
291     }
292     ListNodeInsert(&g_authFsmList, &authFsm->node);
293     AUTH_LOGI(AUTH_FSM,
294         "create auth fsm. authSeq=%{public}" PRId64 ", name=%{public}s, side=%{public}s, requestId=%{public}u, "
295         "" CONN_INFO, authFsm->authSeq, authFsm->fsmName, GetAuthSideStr(isServer), requestId, CONN_DATA(connId));
296     return authFsm;
297 }
298 
DestroyAuthFsm(AuthFsm *authFsm)299 static void DestroyAuthFsm(AuthFsm *authFsm)
300 {
301     AUTH_LOGI(AUTH_FSM, "destroy auth. authSeq=%{public}" PRId64 ", side=%{public}s, requestId=%{public}u",
302         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), authFsm->info.requestId);
303     ListDelete(&authFsm->node);
304     if (authFsm->info.deviceInfoData != NULL) {
305         SoftBusFree(authFsm->info.deviceInfoData);
306         authFsm->info.deviceInfoData = NULL;
307     }
308     if (authFsm->info.normalizedKey != NULL) {
309         SoftBusFree(authFsm->info.normalizedKey);
310         authFsm->info.normalizedKey = NULL;
311     }
312     SoftBusFree(authFsm);
313 }
314 
AuthFsmDeinitCallback(FsmStateMachine *fsm)315 static void AuthFsmDeinitCallback(FsmStateMachine *fsm)
316 {
317     static uint32_t callCount = 0;
318     AUTH_LOGI(AUTH_FSM, "auth fsm deinit callback enter, callCount=%{public}u", callCount++);
319     if (fsm == NULL) {
320         AUTH_LOGE(AUTH_FSM, "fsm is null");
321         return;
322     }
323     if (!RequireAuthLock()) {
324         return;
325     }
326     DestroyAuthFsm(TO_AUTH_FSM(fsm));
327     ReleaseAuthLock();
328 }
329 
NewMessagePara(const uint8_t *data, uint32_t len)330 static MessagePara *NewMessagePara(const uint8_t *data, uint32_t len)
331 {
332     MessagePara *para = (MessagePara *)SoftBusCalloc(sizeof(MessagePara) + len);
333     if (para == NULL) {
334         AUTH_LOGE(AUTH_FSM, "malloc ExchangeDataPara fail");
335         return NULL;
336     }
337     para->len = len;
338     if (data != NULL && len > 0 && memcpy_s(para->data, len, data, len) != EOK) {
339         AUTH_LOGE(AUTH_FSM, "copy data fail");
340         SoftBusFree(para);
341         return NULL;
342     }
343     return para;
344 }
345 
FreeMessagePara(MessagePara *para)346 static void FreeMessagePara(MessagePara *para)
347 {
348     if (para != NULL) {
349         SoftBusFree(para);
350     }
351 }
352 
ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)353 static SoftBusLinkType ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)
354 {
355     switch (type) {
356         case AUTH_LINK_TYPE_WIFI:
357             return SOFTBUS_HISYSEVT_LINK_TYPE_WLAN;
358         case AUTH_LINK_TYPE_BR:
359             return SOFTBUS_HISYSEVT_LINK_TYPE_BR;
360         case AUTH_LINK_TYPE_BLE:
361             return SOFTBUS_HISYSEVT_LINK_TYPE_BLE;
362         case AUTH_LINK_TYPE_P2P:
363             return SOFTBUS_HISYSEVT_LINK_TYPE_P2P;
364         default:
365             return SOFTBUS_HISYSEVT_LINK_TYPE_BUTT;
366     }
367 }
368 
DfxRecordLnnAuthEnd(AuthFsm *authFsm, uint64_t costTime, int32_t reason)369 static void DfxRecordLnnAuthEnd(AuthFsm *authFsm, uint64_t costTime, int32_t reason)
370 {
371     LnnEventExtra extra = { 0 };
372     LnnEventExtraInit(&extra);
373     extra.errcode = reason;
374     extra.authCostTime = (int32_t)costTime;
375     extra.result = (reason == SOFTBUS_OK) ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED;
376 
377     if (authFsm != NULL) {
378         extra.authLinkType = authFsm->info.connInfo.type;
379         extra.authId = (int32_t)authFsm->authSeq;
380         extra.authRequestId = (int32_t)authFsm->info.requestId;
381     }
382     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH, extra);
383 }
384 
ReportAuthResultEvt(AuthFsm *authFsm, int32_t result)385 static void ReportAuthResultEvt(AuthFsm *authFsm, int32_t result)
386 {
387     AUTH_LOGE(AUTH_FSM, "report auth result evt enter");
388     SoftBusLinkType linkType = ConvertAuthLinkTypeToHisysEvtLinkType(authFsm->info.connInfo.type);
389     if (linkType == SOFTBUS_HISYSEVT_LINK_TYPE_BUTT) {
390         return;
391     }
392     authFsm->statisticData.endAuthTime = (uint64_t)LnnUpTimeMs();
393     uint64_t costTime = authFsm->statisticData.endAuthTime - authFsm->statisticData.startAuthTime;
394     DfxRecordLnnAuthEnd(authFsm, costTime, result);
395     AuthFailStage stage = AUTH_STAGE_BUTT;
396 
397     if (result == SOFTBUS_OK) {
398         if (SoftBusRecordAuthResult(linkType, SOFTBUS_OK, costTime, AUTH_STAGE_BUTT) != SOFTBUS_OK) {
399             AUTH_LOGE(AUTH_FSM, "report static auth result fail");
400         }
401         return;
402     } else if (result == SOFTBUS_AUTH_SYNC_DEVID_FAIL || result == SOFTBUS_AUTH_SYNC_DEVINFO_FAIL ||
403         result == SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL || result == SOFTBUS_AUTH_SEND_FAIL ||
404         result == SOFTBUS_AUTH_NOT_SUPPORT_THREE_STATE) {
405         stage = AUTH_EXCHANGE_STAGE;
406     } else if (result == SOFTBUS_AUTH_DEVICE_DISCONNECTED) {
407         stage = AUTH_CONNECT_STAGE;
408     } else if (result == SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL || result == SOFTBUS_AUTH_TIMEOUT ||
409         result == SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED) {
410         stage = AUTH_VERIFY_STAGE;
411     } else if (result >= SOFTBUS_HICHAIN_MIN && result <= SOFTBUS_HICHAIN_MAX) {
412         stage = AUTH_VERIFY_STAGE;
413     } else {
414         AUTH_LOGE(AUTH_FSM, "unsupport result=%{public}d.", result);
415         return;
416     }
417 
418     if (SoftBusRecordAuthResult(linkType, SOFTBUS_ERR, costTime, stage) != SOFTBUS_OK) {
419         AUTH_LOGE(AUTH_FSM, "report static auth result fail");
420     }
421     SoftBusFaultEvtInfo info;
422     (void)memset_s(&info, sizeof(SoftBusFaultEvtInfo), 0, sizeof(SoftBusFaultEvtInfo));
423     info.moduleType = MODULE_TYPE_AUTH;
424     info.linkType = linkType;
425     info.errorCode = result;
426     if (SoftBusReportBusCenterFaultEvt(&info) != SOFTBUS_OK) {
427         AUTH_LOGE(AUTH_FSM, "report buscenter fault evt fail");
428     }
429 }
430 
SaveDeviceKey(AuthFsm *authFsm, int32_t keyType, AuthLinkType type)431 static void SaveDeviceKey(AuthFsm *authFsm, int32_t keyType, AuthLinkType type)
432 {
433     AuthDeviceKeyInfo deviceKey;
434     SessionKey sessionKey;
435     (void)memset_s(&deviceKey, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
436     (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
437     if (AuthManagerGetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey) != SOFTBUS_OK) {
438         AUTH_LOGE(AUTH_FSM, "get session key fail");
439         return;
440     }
441     if (memcpy_s(deviceKey.deviceKey, sizeof(deviceKey.deviceKey),
442         sessionKey.value, sizeof(sessionKey.value)) != EOK) {
443         AUTH_LOGE(AUTH_FSM, "session key cpy fail");
444         (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
445         return;
446     }
447     deviceKey.keyLen = sessionKey.len;
448     deviceKey.keyIndex = authFsm->authSeq;
449     deviceKey.keyType = keyType;
450     deviceKey.isServerSide = authFsm->info.isServer;
451     if (AuthInsertDeviceKey(&authFsm->info.nodeInfo, &deviceKey, type) != SOFTBUS_OK) {
452         AUTH_LOGE(AUTH_FSM, "insert deviceKey fail");
453     }
454     (void)memset_s(&deviceKey, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
455     (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
456 }
457 
GetAuthFsmByConnInfo(const AuthConnInfo *connInfo, bool isServer)458 static AuthFsm *GetAuthFsmByConnInfo(const AuthConnInfo *connInfo, bool isServer)
459 {
460     AuthFsm *item = NULL;
461     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
462         if (!CompareConnInfo(&item->info.connInfo, connInfo, true) || item->info.isConnectServer != isServer) {
463             continue;
464         }
465         if (item->isDead) {
466             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
467             break;
468         }
469         return item;
470     }
471     return NULL;
472 }
473 
ProcessTimeoutErrorCode(AuthFsm *authFsm, int32_t *result)474 static void ProcessTimeoutErrorCode(AuthFsm *authFsm, int32_t *result)
475 {
476     AuthFsmStateIndex curState = authFsm->curState;
477     if (curState == STATE_SYNC_NEGOTIATION || curState == STATE_SYNC_DEVICE_ID) {
478         *result = SOFTBUS_AUTH_SYNC_DEVICEID_TIMEOUT;
479     } else if (curState == STATE_DEVICE_AUTH) {
480         *result = (authFsm->info.normalizedType == NORMALIZED_SUPPORT || authFsm->info.isSupportFastAuth) ?
481             SOFTBUS_AUTH_SAVE_SESSIONKEY_TIMEOUT : SOFTBUS_AUTH_HICHAIN_TIMEOUT;
482     } else if (curState == STATE_SYNC_DEVICE_INFO) {
483         *result = SOFTBUS_AUTH_SYNC_DEVICEINFO_TIMEOUT;
484     } else {
485         AUTH_LOGE(AUTH_FSM, "authFsm state error, curState=%{public}d", curState);
486     }
487 }
488 
CompleteAuthSession(AuthFsm *authFsm, int32_t result)489 static void CompleteAuthSession(AuthFsm *authFsm, int32_t result)
490 {
491     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
492     AUTH_LOGI(AUTH_FSM, "auth fsm complete. authSeq=%{public}" PRId64 ", side=%{public}s, result=%{public}d",
493         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), result);
494     ReportAuthResultEvt(authFsm, result);
495     if (result == SOFTBUS_OK) {
496         AuthManagerSetAuthFinished(authFsm->authSeq, &authFsm->info);
497         if (authFsm->info.normalizedType == NORMALIZED_KEY_ERROR) {
498             AUTH_LOGI(AUTH_FSM, "only hichain verify, save the device key");
499             SaveDeviceKey(authFsm, AUTH_LINK_TYPE_NORMALIZED, authFsm->info.connInfo.type);
500         } else if ((authFsm->info.normalizedType == NORMALIZED_NOT_SUPPORT) &&
501             (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE) &&
502             !authFsm->info.isSupportFastAuth) {
503             AUTH_LOGI(AUTH_FSM, "save device key for fast auth");
504             SaveDeviceKey(authFsm, AUTH_LINK_TYPE_BLE, AUTH_LINK_TYPE_BLE);
505         }
506         if (!authFsm->info.isServer) {
507             NotifyNormalizeRequestSuccess(authFsm->authSeq, true);
508         }
509         // Disconnect another request and notify auth success
510         if (authFsm->info.isConnectServer && authFsm->info.peerState != AUTH_STATE_COMPATIBLE) {
511             AuthFsm *stopFsm = GetAuthFsmByConnInfo(&authFsm->info.connInfo, !authFsm->info.isConnectServer);
512             if (stopFsm != NULL) {
513                 AuthNotifyAuthPassed(stopFsm->authSeq, &stopFsm->info);
514                 LnnFsmPostMessage(&stopFsm->fsm, FSM_MSG_STOP_AUTH_FSM, NULL);
515             }
516         }
517     } else {
518         if (result == SOFTBUS_AUTH_TIMEOUT) {
519             ProcessTimeoutErrorCode(authFsm, &result);
520         }
521         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
522         if (!authFsm->info.isServer) {
523             NotifyNormalizeRequestFail(authFsm->authSeq, result);
524         }
525         AuthManagerSetAuthFailed(authFsm->authSeq, &authFsm->info, result);
526     }
527 
528     authFsm->isDead = true;
529     LnnFsmStop(&authFsm->fsm);
530     LnnFsmDeinit(&authFsm->fsm);
531     SoftbusHitraceStop();
532 }
533 
StopAuthFsm(AuthFsm *authFsm)534 static void StopAuthFsm(AuthFsm *authFsm)
535 {
536     authFsm->isDead = true;
537     LnnFsmStop(&authFsm->fsm);
538     LnnFsmDeinit(&authFsm->fsm);
539 }
540 
HandleCommonMsg(AuthFsm *authFsm, int32_t msgType, MessagePara *msgPara)541 static void HandleCommonMsg(AuthFsm *authFsm, int32_t msgType, MessagePara *msgPara)
542 {
543     (void)msgPara;
544     switch (msgType) {
545         case FSM_MSG_AUTH_TIMEOUT:
546             AUTH_LOGE(AUTH_FSM, "auth fsm timeout. authSeq=%{public}" PRId64 "", authFsm->authSeq);
547             CompleteAuthSession(authFsm, SOFTBUS_AUTH_TIMEOUT);
548             HichainCancelRequest(authFsm->authSeq);
549             break;
550         case FSM_MSG_DEVICE_NOT_TRUSTED:
551             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED);
552             HichainCancelRequest(authFsm->authSeq);
553             break;
554         case FSM_MSG_DEVICE_DISCONNECTED:
555             if (authFsm->info.isNodeInfoReceived && authFsm->info.isCloseAckReceived) {
556                 AUTH_LOGW(AUTH_FSM,
557                     "auth fsm wait for the finish event, ignore this disconnect event. authSeq=%{public}" PRId64 "",
558                     authFsm->authSeq);
559                 /*
560                 * Note: Local hichain NOT onFinish, but remote hichain already onFinish
561                 *      Regard this situation as auth finish
562                 */
563                 CompleteAuthSession(authFsm, SOFTBUS_OK);
564                 break;
565             }
566             CompleteAuthSession(authFsm, SOFTBUS_AUTH_DEVICE_DISCONNECTED);
567             HichainCancelRequest(authFsm->authSeq);
568             break;
569         case FSM_MSG_STOP_AUTH_FSM:
570             StopAuthFsm(authFsm);
571             break;
572         default:
573             AUTH_LOGE(AUTH_FSM,
574                 "auth fsm cannot handle msgType. authSeq=%{public}" PRId64 ", msgType=%{public}d",
575                 authFsm->authSeq, msgType);
576             break;
577     }
578 }
579 
AddConcurrentAuthRequest(AuthFsm *authFsm)580 static uint32_t AddConcurrentAuthRequest(AuthFsm *authFsm)
581 {
582     uint32_t num = 0;
583     if (strlen(authFsm->info.udidHash) == 0) {
584         AUTH_LOGE(AUTH_FSM, "udidHash is null, authSeq=%{public}" PRId64, authFsm->authSeq);
585         return num;
586     }
587     NormalizeRequest normalizeRequest = {
588         .authSeq = authFsm->authSeq,
589         .connInfo = authFsm->info.connInfo,
590         .isConnectServer = authFsm->info.isConnectServer
591     };
592     if (strcpy_s(normalizeRequest.udidHash, sizeof(normalizeRequest.udidHash), authFsm->info.udidHash) != EOK) {
593         AUTH_LOGE(AUTH_FSM, "strcpy udid hash fail. authSeq=%{public}" PRId64, authFsm->authSeq);
594         return num;
595     }
596     num = AddNormalizeRequest(&normalizeRequest);
597     char *anonyUdidHash = NULL;
598     Anonymize(normalizeRequest.udidHash, &anonyUdidHash);
599     AUTH_LOGI(AUTH_CONN, "add normalize queue, num=%{public}d, udidHash=%{public}s",
600         num, AnonymizeWrapper(anonyUdidHash));
601     AnonymizeFree(anonyUdidHash);
602     return num;
603 }
604 
SyncNegotiationEnter(FsmStateMachine *fsm)605 static void SyncNegotiationEnter(FsmStateMachine *fsm)
606 {
607     if (fsm == NULL) {
608         AUTH_LOGE(AUTH_FSM, "fsm is null");
609         return;
610     }
611     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
612     if (authFsm == NULL) {
613         AUTH_LOGE(AUTH_FSM, "authFsm is null");
614         return;
615     }
616     authFsm->curState = STATE_SYNC_NEGOTIATION;
617     AUTH_LOGI(AUTH_FSM, "SyncNegotiationState: auth fsm enter. authSeq=%{public}" PRId64, authFsm->authSeq);
618     if (!authFsm->info.isServer) {
619         if (PostDeviceIdMessage(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
620             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
621         }
622     }
623 }
624 
HandleMsgPostDeviceId(AuthFsm *authFsm, const MessagePara *para)625 static void HandleMsgPostDeviceId(AuthFsm *authFsm, const MessagePara *para)
626 {
627     (void)para;
628     AuthSessionInfo *info = &authFsm->info;
629     if (PostDeviceIdMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
630         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
631         return;
632     }
633     if (info->isServer) {
634         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
635     }
636 }
637 
SyncDevIdStateEnter(FsmStateMachine *fsm)638 static void SyncDevIdStateEnter(FsmStateMachine *fsm)
639 {
640     if (fsm == NULL) {
641         AUTH_LOGE(AUTH_FSM, "fsm is null");
642         return;
643     }
644     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
645     if (authFsm == NULL) {
646         AUTH_LOGE(AUTH_FSM, "authFsm is null");
647         return;
648     }
649     authFsm->curState = STATE_SYNC_DEVICE_ID;
650     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
651     AUTH_LOGI(AUTH_FSM, "SyncDevIdState: auth fsm enter. authSeq=%{public}" PRId64 "", authFsm->authSeq);
652     if (!authFsm->info.isServer) {
653         if (authFsm->info.localState == AUTH_STATE_START) {
654             if (!AuthIsRepeatedAuthRequest(authFsm->authSeq) && AddConcurrentAuthRequest(authFsm) > 1) {
655                 AUTH_LOGI(AUTH_FSM, "wait another auth, authSeq=%{public}" PRId64 "", authFsm->authSeq);
656                 return;
657             }
658         }
659         if (PostDeviceIdMessage(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
660             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
661         }
662     }
663     SoftbusHitraceStop();
664 }
665 
SaveLastAuthSeq(const unsigned char *udidHash, int64_t authSeq)666 static void SaveLastAuthSeq(const unsigned char *udidHash, int64_t authSeq)
667 {
668     AUTH_LOGI(AUTH_FSM, "save auth seq.authSeq=%{public}" PRId64, authSeq);
669     char hashStr[SHORT_UDID_HASH_HEX_LEN + 1] = {0};
670     if (ConvertBytesToHexString(hashStr, SHORT_UDID_HASH_HEX_LEN + 1,
671         udidHash, SHORT_UDID_HASH_HEX_LEN / HEXIFY_UNIT_LEN) != SOFTBUS_OK) {
672         AUTH_LOGE(AUTH_FSM, "convert udidhash to hexstr fail.");
673         return;
674     }
675     NodeInfo deviceInfo;
676     (void)memset_s(&deviceInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
677     if (LnnRetrieveDeviceInfo(hashStr, &deviceInfo) != SOFTBUS_OK) {
678         AUTH_LOGE(AUTH_FSM, "no this device info.");
679         return;
680     }
681     deviceInfo.lastAuthSeq = authSeq;
682     if (LnnSaveRemoteDeviceInfo(&deviceInfo) != SOFTBUS_OK) {
683         AUTH_LOGE(AUTH_FSM, "save device info fail.");
684     }
685 }
686 
RecoveryNormalizedDeviceKey(AuthFsm *authFsm)687 static int32_t RecoveryNormalizedDeviceKey(AuthFsm *authFsm)
688 {
689     if (authFsm->info.normalizedKey == NULL) {
690         AUTH_LOGE(AUTH_FSM, "normalizedKey is NULL, auth fail");
691         return SOFTBUS_ERR;
692     }
693     uint8_t hash[SHA_256_HASH_LEN] = {0};
694     int32_t ret = SoftBusGenerateStrHash((uint8_t *)authFsm->info.udid, strlen(authFsm->info.udid), hash);
695     if (ret != SOFTBUS_OK) {
696         AUTH_LOGE(AUTH_FSM, "generate udidHash fail");
697         return ret;
698     }
699     char udidShortHash[SHORT_UDID_HASH_HEX_LEN + 1] = {0};
700     if (ConvertBytesToUpperCaseHexString(udidShortHash, SHORT_UDID_HASH_HEX_LEN + 1,
701         hash, SHORT_UDID_HASH_LEN) != SOFTBUS_OK) {
702         AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
703         return SOFTBUS_ERR;
704     }
705     AuthUpdateNormalizeKeyIndex(udidShortHash, authFsm->info.normalizedIndex, authFsm->info.connInfo.type,
706         authFsm->info.normalizedKey, authFsm->info.isServer);
707     if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE) {
708         SaveLastAuthSeq(hash, authFsm->authSeq);
709     }
710     ret = AuthSessionSaveSessionKey(authFsm->authSeq, authFsm->info.normalizedKey->value,
711         authFsm->info.normalizedKey->len);
712     if (ret != SOFTBUS_OK) {
713         AUTH_LOGE(AUTH_FSM, "post save sessionKey event fail");
714         return SOFTBUS_ERR;
715     }
716     return AuthSessionHandleAuthFinish(authFsm->authSeq);
717 }
718 
RecoveryFastAuthKey(AuthFsm *authFsm)719 static int32_t RecoveryFastAuthKey(AuthFsm *authFsm)
720 {
721     AuthDeviceKeyInfo key = {0};
722     uint8_t hash[SHA_256_HASH_LEN] = {0};
723     int32_t ret = SoftBusGenerateStrHash((uint8_t *)authFsm->info.udid, strlen(authFsm->info.udid), hash);
724     if (ret != SOFTBUS_OK) {
725         AUTH_LOGE(AUTH_FSM, "generate udidHash fail");
726         return ret;
727     }
728     char udidShortHash[SHORT_UDID_HASH_HEX_LEN + 1] = {0};
729     if (ConvertBytesToUpperCaseHexString(udidShortHash, SHORT_UDID_HASH_HEX_LEN + 1,
730         hash, SHORT_UDID_HASH_LEN) != SOFTBUS_OK) {
731         AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
732         return SOFTBUS_ERR;
733     }
734     AuthLinkType linkType = authFsm->info.connInfo.type;
735     if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_ENHANCED_P2P) {
736         // enhanced p2p reuse ble authKey
737         linkType = AUTH_LINK_TYPE_BLE;
738     }
739     if (AuthFindDeviceKey(udidShortHash, linkType, &key) != SOFTBUS_OK) {
740         AUTH_LOGE(AUTH_FSM, "find key fail, fastAuth error");
741         return SOFTBUS_ERR;
742     }
743     AuthUpdateKeyIndex(udidShortHash, authFsm->info.connInfo.type, authFsm->authSeq, authFsm->info.isServer);
744     authFsm->info.oldIndex = key.keyIndex;
745     ret = AuthSessionSaveSessionKey(authFsm->authSeq, key.deviceKey, key.keyLen);
746     if (ret != SOFTBUS_OK) {
747         AUTH_LOGE(AUTH_FSM, "post save sessionKey event");
748         (void)memset_s(&key, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
749         return ret;
750     }
751     (void)memset_s(&key, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
752     return AuthSessionHandleAuthFinish(authFsm->authSeq);
753 }
754 
AuditReportSetPeerDevInfo(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info)755 static void AuditReportSetPeerDevInfo(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info)
756 {
757     if (lnnAuditExtra == NULL || info == NULL) {
758         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra or info is null");
759         return;
760     }
761     char *anonyBrMac = NULL;
762     char *anonyBleMac = NULL;
763     char *anonyIp = NULL;
764     switch (info->connInfo.type) {
765         case AUTH_LINK_TYPE_BR:
766             Anonymize(info->connInfo.info.brInfo.brMac, &anonyBrMac);
767             if (strcpy_s((char *)lnnAuditExtra->peerBrMac, BT_MAC_LEN, AnonymizeWrapper(anonyBrMac)) != EOK) {
768                 AUTH_LOGE(AUTH_FSM, "BR MAC COPY ERROR");
769             }
770             AnonymizeFree(anonyBrMac);
771             break;
772         case AUTH_LINK_TYPE_BLE:
773             Anonymize(info->connInfo.info.bleInfo.bleMac, &anonyBleMac);
774             if (strcpy_s((char *)lnnAuditExtra->peerBleMac, BT_MAC_LEN, AnonymizeWrapper(anonyBleMac)) != EOK) {
775                 AUTH_LOGE(AUTH_FSM, "BLE MAC COPY ERROR");
776             }
777             AnonymizeFree(anonyBleMac);
778             break;
779         case AUTH_LINK_TYPE_WIFI:
780         case AUTH_LINK_TYPE_P2P:
781         case AUTH_LINK_TYPE_ENHANCED_P2P:
782             Anonymize(info->connInfo.info.ipInfo.ip, &anonyIp);
783             if (strcpy_s((char *)lnnAuditExtra->peerIp, IP_STR_MAX_LEN, AnonymizeWrapper(anonyIp)) != EOK) {
784                 AUTH_LOGE(AUTH_FSM, "IP COPY ERROR");
785             }
786             AnonymizeFree(anonyIp);
787             lnnAuditExtra->peerAuthPort = info->connInfo.info.ipInfo.port;
788             break;
789         default:
790             AUTH_LOGW(AUTH_FSM, "unknow param type!");
791             break;
792     }
793 }
794 
GetLocalDevReportInfo(AuditReportDevInfo *reportInfo, LnnAuditExtra *lnnAuditExtra)795 static void GetLocalDevReportInfo(AuditReportDevInfo *reportInfo, LnnAuditExtra *lnnAuditExtra)
796 {
797     (void)LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, reportInfo->localIp, IP_LEN);
798     char *anonyLocalIp = NULL;
799     Anonymize(reportInfo->localIp, &anonyLocalIp);
800     if (strcpy_s((char *)lnnAuditExtra->localIp, IP_LEN, AnonymizeWrapper(anonyLocalIp)) != EOK) {
801         AUTH_LOGE(AUTH_FSM, "LOCAL IP COPY ERROR");
802     }
803     AnonymizeFree(anonyLocalIp);
804 
805     (void)LnnGetLocalStrInfo(STRING_KEY_BT_MAC, reportInfo->localBrMac, MAC_LEN);
806     char *anonyLocalBrMac = NULL;
807     Anonymize(reportInfo->localBrMac, &anonyLocalBrMac);
808     if (strcpy_s((char *)lnnAuditExtra->localBrMac, MAC_LEN, AnonymizeWrapper(anonyLocalBrMac)) != EOK) {
809         AUTH_LOGE(AUTH_FSM, "LOCAL BR MAC COPY ERROR");
810     }
811     AnonymizeFree(anonyLocalBrMac);
812 
813     (void)LnnGetLocalStrInfo(STRING_KEY_BLE_MAC, reportInfo->localBleMac, MAC_LEN);
814     char *anonyLocalBleMac = NULL;
815     Anonymize(reportInfo->localBleMac, &anonyLocalBleMac);
816     if (strcpy_s((char *)lnnAuditExtra->localBleMac, MAC_LEN, AnonymizeWrapper(anonyLocalBleMac)) != EOK) {
817         AUTH_LOGE(AUTH_FSM, "LOCAL BLE MAC COPY ERROR");
818     }
819     AnonymizeFree(anonyLocalBleMac);
820 
821     (void)LnnGetLocalStrInfo(STRING_KEY_NETWORKID, reportInfo->localNetworkId, NETWORK_ID_BUF_LEN);
822     char *anonyLocalNetworkId = NULL;
823     Anonymize(reportInfo->localNetworkId, &anonyLocalNetworkId);
824     if (strcpy_s((char *)lnnAuditExtra->localNetworkId, NETWORK_ID_BUF_LEN,
825         AnonymizeWrapper(anonyLocalNetworkId)) != EOK) {
826         AUTH_LOGE(AUTH_FSM, "LOCAL NETWORKID COPY ERROR");
827     }
828     AnonymizeFree(anonyLocalNetworkId);
829 
830     (void)LnnGetLocalStrInfo(STRING_KEY_DEV_NAME, reportInfo->localDevName, DEVICE_NAME_BUF_LEN);
831     char *anonyLocalDevName = NULL;
832     Anonymize(reportInfo->localDevName, &anonyLocalDevName);
833     if (strcpy_s((char *)lnnAuditExtra->localDevName, DEVICE_NAME_BUF_LEN,
834         AnonymizeWrapper(anonyLocalDevName)) != EOK) {
835         AUTH_LOGE(AUTH_FSM, "LOCAL DEVICE NAME COPY ERROR");
836     }
837     AnonymizeFree(anonyLocalDevName);
838 }
839 
AuditReportSetLocalDevInfo(LnnAuditExtra *lnnAuditExtra)840 static void AuditReportSetLocalDevInfo(LnnAuditExtra *lnnAuditExtra)
841 {
842     if (lnnAuditExtra == NULL) {
843         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra is null");
844         return;
845     }
846     AuditReportDevInfo reportInfo;
847     (void)memset_s(&reportInfo, sizeof(AuditReportDevInfo), 0, sizeof(AuditReportDevInfo));
848     GetLocalDevReportInfo(&reportInfo, lnnAuditExtra);
849     (void)LnnGetLocalNumInfo(NUM_KEY_AUTH_PORT, &lnnAuditExtra->localAuthPort);
850     (void)LnnGetLocalNumInfo(NUM_KEY_PROXY_PORT, &lnnAuditExtra->localProxyPort);
851     (void)LnnGetLocalNumInfo(NUM_KEY_SESSION_PORT, &lnnAuditExtra->localSessionPort);
852     (void)LnnGetLocalNumInfo(NUM_KEY_DEV_TYPE_ID, &lnnAuditExtra->localDevType);
853     char udid[UDID_BUF_LEN] = {0};
854     uint8_t udidHash[SHA_256_HASH_LEN] = {0};
855     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, udid, UUID_BUF_LEN) != SOFTBUS_OK) {
856         AUTH_LOGE(AUTH_FSM, "get local udid fail");
857         return;
858     }
859     int32_t ret = SoftBusGenerateStrHash((const unsigned char *)udid, strlen(udid), udidHash);
860     if (ret != SOFTBUS_OK) {
861         AUTH_LOGE(AUTH_FSM, "generate udid hash fail");
862         return;
863     }
864     if (ConvertBytesToUpperCaseHexString(reportInfo.localUdid, SHA_256_HEX_HASH_LEN, udidHash, SHA_256_HASH_LEN) !=
865         SOFTBUS_OK) {
866         AUTH_LOGE(AUTH_FSM, "convert hash to upper hex str fail");
867     }
868     char *anonyLocalUdid = NULL;
869     Anonymize(reportInfo.localUdid, &anonyLocalUdid);
870     if (strcpy_s((char *)lnnAuditExtra->localUdid, SHA_256_HEX_HASH_LEN, AnonymizeWrapper(anonyLocalUdid)) != EOK) {
871         AUTH_LOGE(AUTH_FSM, "LOCAL UDID COPY ERROR");
872     }
873     AnonymizeFree(anonyLocalUdid);
874 }
875 
BuildLnnAuditEvent(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info, int32_t result, int32_t errCode, SoftbusAuditType auditType)876 static void BuildLnnAuditEvent(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info, int32_t result,
877     int32_t errCode, SoftbusAuditType auditType)
878 {
879     if (lnnAuditExtra == NULL || info == NULL) {
880         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra or info is null");
881         return;
882     }
883     (void)AuditReportSetPeerDevInfo(lnnAuditExtra, info);
884     (void)AuditReportSetLocalDevInfo(lnnAuditExtra);
885     lnnAuditExtra->result = result;
886     lnnAuditExtra->errCode = errCode;
887     lnnAuditExtra->auditType = auditType;
888     lnnAuditExtra->connId = info->connId;
889     lnnAuditExtra->authLinkType = info->connInfo.type;
890     lnnAuditExtra->authRequestId = info->requestId;
891     (void)LnnGetAllOnlineNodeNum(&(lnnAuditExtra->onlineNum));
892 }
893 
ClientSetExchangeIdType(AuthFsm *authFsm)894 static int32_t ClientSetExchangeIdType(AuthFsm *authFsm)
895 {
896     AuthSessionInfo *info = &authFsm->info;
897     if (info->idType == EXCHANGE_FAIL) {
898         AUTH_LOGE(AUTH_FSM, "fsm switch to reauth due to not find networkId");
899         info->idType = EXCHANGE_UDID;
900         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID);
901         return SOFTBUS_ERR;
902     }
903     return SOFTBUS_OK;
904 }
905 
UpdateUdidHashIfEmpty(AuthFsm *authFsm, AuthSessionInfo *info)906 static void UpdateUdidHashIfEmpty(AuthFsm *authFsm, AuthSessionInfo *info)
907 {
908     if (info->connInfo.type == AUTH_LINK_TYPE_BLE && strlen(info->udid) != 0 &&
909         authFsm->info.connInfo.info.bleInfo.deviceIdHash[0] == '\0') {
910         char *anonyUdid = NULL;
911         Anonymize(info->udid, &anonyUdid);
912         AUTH_LOGW(AUTH_FSM, "udidhash is empty, udid=%{public}s", AnonymizeWrapper(anonyUdid));
913         AnonymizeFree(anonyUdid);
914         if (SoftBusGenerateStrHash((unsigned char *)info->udid, strlen(info->udid),
915             (unsigned char *)authFsm->info.connInfo.info.bleInfo.deviceIdHash) != SOFTBUS_OK) {
916             AUTH_LOGE(AUTH_FSM, "generate udidhash fail");
917         }
918     }
919 }
920 
HandleMsgRecvDeviceId(AuthFsm *authFsm, const MessagePara *para)921 static void HandleMsgRecvDeviceId(AuthFsm *authFsm, const MessagePara *para)
922 {
923     int32_t ret = SOFTBUS_OK;
924     AuthSessionInfo *info = &authFsm->info;
925     do {
926         if (ProcessDeviceIdMessage(info, para->data, para->len) != SOFTBUS_OK) {
927             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
928             LnnAuditExtra lnnAuditExtra = {0};
929             BuildLnnAuditEvent(&lnnAuditExtra, info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
930                 ret, AUDIT_EVENT_PACKETS_ERROR);
931             LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_DEV_ID, lnnAuditExtra);
932             break;
933         }
934         UpdateUdidHashIfEmpty(authFsm, info);
935         if (info->isServer) {
936             if (PostDeviceIdMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
937                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
938                 break;
939             }
940         } else {
941             if (info->normalizedType == NORMALIZED_NOT_SUPPORT || info->peerState == AUTH_STATE_COMPATIBLE) {
942                 NotifyNormalizeRequestSuccess(authFsm->authSeq, false);
943             }
944         }
945         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
946     } while (false);
947 
948     if (ret != SOFTBUS_OK) {
949         AUTH_LOGE(AUTH_FSM, "handle devId msg fail, ret=%{public}d", ret);
950         CompleteAuthSession(authFsm, ret);
951     }
952 }
953 
HandleMsgRecvDeviceIdNego(AuthFsm *authFsm, const MessagePara *para)954 static void HandleMsgRecvDeviceIdNego(AuthFsm *authFsm, const MessagePara *para)
955 {
956     int32_t ret = SOFTBUS_OK;
957     AuthSessionInfo *info = &authFsm->info;
958     do {
959         if (ProcessDeviceIdMessage(info, para->data, para->len) != SOFTBUS_OK) {
960             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
961             LnnAuditExtra lnnAuditExtra = {0};
962             BuildLnnAuditEvent(&lnnAuditExtra, info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
963                 ret, AUDIT_EVENT_PACKETS_ERROR);
964             LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_DEV_ID, lnnAuditExtra);
965             break;
966         }
967         UpdateUdidHashIfEmpty(authFsm, info);
968         if (UpdateLocalAuthState(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
969             AUTH_LOGE(AUTH_FSM, "update auth state fail, authSeq=%{public}" PRId64, authFsm->authSeq);
970             return;
971         }
972         if (info->peerState == AUTH_STATE_COMPATIBLE) {
973             NotifyNormalizeRequestSuccess(authFsm->authSeq, false);
974         }
975         if (info->localState == AUTH_STATE_START) {
976             info->isServer = false;
977             LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID);
978         } else if (info->localState == AUTH_STATE_ACK) {
979             info->isServer = true;
980             ret = PostDeviceIdMessage(authFsm->authSeq, info);
981             LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
982         } else if (info->localState == AUTH_STATE_WAIT) {
983             info->isServer = true;
984             ret = PostDeviceIdMessage(authFsm->authSeq, info);
985         } else if (info->localState == AUTH_STATE_COMPATIBLE) {
986             if (info->isServer) {
987                 ret = PostDeviceIdMessage(authFsm->authSeq, info);
988             }
989             LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
990         } else if (info->localState == AUTH_STATE_UNKNOW) {
991             ret = PostDeviceIdMessage(authFsm->authSeq, info);
992         } else {
993             AUTH_LOGE(AUTH_FSM, "local auth state error");
994             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
995         }
996     } while (false);
997 
998     if (ret != SOFTBUS_OK) {
999         AUTH_LOGE(AUTH_FSM, "handle devId msg fail, ret=%{public}d", ret);
1000         CompleteAuthSession(authFsm, ret);
1001     }
1002 }
1003 
SyncNegotiationStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)1004 static bool SyncNegotiationStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
1005 {
1006     MessagePara *msgPara = (MessagePara *)para;
1007     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
1008     if (authFsm == NULL) {
1009         FreeMessagePara(msgPara);
1010         return false;
1011     }
1012     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
1013     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64 ", message=%{public}s",
1014         authFsm->authSeq, FsmMsgTypeToStr(msgType));
1015     switch (msgType) {
1016         case FSM_MSG_RECV_DEVICE_ID:
1017             HandleMsgRecvDeviceIdNego(authFsm, msgPara);
1018             break;
1019         case FSM_MSG_DEVICE_POST_DEVICEID:
1020             HandleMsgPostDeviceId(authFsm, msgPara);
1021             break;
1022         default:
1023             HandleCommonMsg(authFsm, msgType, msgPara);
1024             break;
1025     }
1026     FreeMessagePara(msgPara);
1027     SoftbusHitraceStop();
1028     return true;
1029 }
1030 
SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)1031 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
1032 {
1033     MessagePara *msgPara = (MessagePara *)para;
1034     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
1035     if (authFsm == NULL) {
1036         FreeMessagePara(msgPara);
1037         return false;
1038     }
1039     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
1040     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64 ", message=%{public}s",
1041         authFsm->authSeq, FsmMsgTypeToStr(msgType));
1042     switch (msgType) {
1043         case FSM_MSG_RECV_DEVICE_ID:
1044             HandleMsgRecvDeviceId(authFsm, msgPara);
1045             break;
1046         case FSM_MSG_DEVICE_POST_DEVICEID:
1047             HandleMsgPostDeviceId(authFsm, msgPara);
1048             break;
1049         default:
1050             HandleCommonMsg(authFsm, msgType, msgPara);
1051             break;
1052     }
1053     FreeMessagePara(msgPara);
1054     SoftbusHitraceStop();
1055     return true;
1056 }
1057 
HandleMsgRecvAuthData(AuthFsm *authFsm, const MessagePara *para)1058 static void HandleMsgRecvAuthData(AuthFsm *authFsm, const MessagePara *para)
1059 {
1060     int32_t ret = HichainProcessData(authFsm->authSeq, para->data, para->len);
1061     if (ret != SOFTBUS_OK) {
1062         LnnAuditExtra lnnAuditExtra = {0};
1063         BuildLnnAuditEvent(&lnnAuditExtra, &authFsm->info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
1064             ret, AUDIT_EVENT_PACKETS_ERROR);
1065         LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_AUTH_DATA, lnnAuditExtra);
1066         AUTH_LOGE(AUTH_FSM, "process hichain data fail");
1067         if (!authFsm->info.isAuthFinished) {
1068             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL);
1069         } else {
1070             AUTH_LOGD(AUTH_FSM, "auth has finished, ignore this processing failure");
1071         }
1072     }
1073 }
1074 
TrySyncDeviceInfo(int64_t authSeq, const AuthSessionInfo *info)1075 static int32_t TrySyncDeviceInfo(int64_t authSeq, const AuthSessionInfo *info)
1076 {
1077     switch (info->connInfo.type) {
1078         case AUTH_LINK_TYPE_WIFI:
1079             /* WIFI: client firstly send device info, server just reponse it. */
1080             if (!info->isServer) {
1081                 return PostDeviceInfoMessage(authSeq, info);
1082             }
1083             return SOFTBUS_OK;
1084         case AUTH_LINK_TYPE_BR:
1085         case AUTH_LINK_TYPE_BLE:
1086         case AUTH_LINK_TYPE_P2P:
1087         case AUTH_LINK_TYPE_ENHANCED_P2P:
1088             return PostDeviceInfoMessage(authSeq, info);
1089         default:
1090             break;
1091     }
1092     return SOFTBUS_ERR;
1093 }
1094 
HandleMsgSaveSessionKey(AuthFsm *authFsm, const MessagePara *para)1095 static void HandleMsgSaveSessionKey(AuthFsm *authFsm, const MessagePara *para)
1096 {
1097     SessionKey sessionKey = {.len = para->len};
1098     if (memcpy_s(sessionKey.value, sizeof(sessionKey.value), para->data, para->len) != EOK) {
1099         AUTH_LOGE(AUTH_FSM, "copy session key fail.");
1100         (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
1101         return;
1102     }
1103     if (AuthManagerSetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey, true, false) != SOFTBUS_OK) {
1104         AUTH_LOGE(AUTH_FSM, "auth fsm save session key fail. authSeq=%{public}" PRId64 "", authFsm->authSeq);
1105     }
1106 
1107     (void)CalcHKDF((uint8_t *)(&sessionKey.value), sessionKey.len,
1108         (uint8_t *)(&authFsm->info.sessionKeyRandomNum), sizeof(authFsm->info.sessionKeyRandomNum));
1109     (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
1110     if (LnnGenerateLocalPtk(authFsm->info.udid, authFsm->info.uuid) != SOFTBUS_OK) {
1111         AUTH_LOGE(AUTH_FSM, "generate ptk fail");
1112     }
1113     if (TrySyncDeviceInfo(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
1114         AUTH_LOGE(AUTH_FSM, "auth fsm sync device info fail. authSeq=%{public}" PRId64 "", authFsm->authSeq);
1115         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
1116         return;
1117     }
1118     if (authFsm->info.deviceInfoData != NULL) {
1119         AUTH_LOGE(AUTH_FSM, "auth fsm dispatch device info to next state. authSeq=%{public}" PRId64, authFsm->authSeq);
1120         (void)AuthSessionProcessDevInfoData(authFsm->authSeq,
1121             authFsm->info.deviceInfoData, authFsm->info.deviceInfoDataLen);
1122         SoftBusFree(authFsm->info.deviceInfoData);
1123         authFsm->info.deviceInfoData = NULL;
1124     }
1125     LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_INFO);
1126     authFsm->curState = STATE_SYNC_DEVICE_INFO;
1127 }
1128 
HandleMsgAuthError(AuthFsm *authFsm, const MessagePara *para)1129 static void HandleMsgAuthError(AuthFsm *authFsm, const MessagePara *para)
1130 {
1131     int32_t result = *((int32_t *)(para->data));
1132     AUTH_LOGE(AUTH_FSM,
1133         "auth fsm handle hichain error, authSeq=%{public}" PRId64", reason=%{public}d", authFsm->authSeq, result);
1134     if (result == HICHAIN_RETURN_NOT_TRUSTED) {
1135         AUTH_LOGE(AUTH_FSM, "device not has trust relation, begin to offline");
1136         AuthDeviceNotTrust(authFsm->info.udid);
1137     }
1138     CompleteAuthSession(authFsm, result);
1139 }
1140 
HandleMsgRecvDevInfoEarly(AuthFsm *authFsm, const MessagePara *para)1141 static void HandleMsgRecvDevInfoEarly(AuthFsm *authFsm, const MessagePara *para)
1142 {
1143     AUTH_LOGI(AUTH_FSM, "auth fsm recv device info early, save it. authSeq=%{public}" PRId64 "", authFsm->authSeq);
1144     AuthSessionInfo *info = &authFsm->info;
1145     if (info->deviceInfoData != NULL) {
1146         SoftBusFree(info->deviceInfoData);
1147         info->deviceInfoData = NULL;
1148     }
1149     info->deviceInfoData = DupMemBuffer(para->data, para->len);
1150     if (info->deviceInfoData == NULL) {
1151         AUTH_LOGE(AUTH_FSM, "dup device info fail.");
1152         return;
1153     }
1154     info->deviceInfoDataLen = para->len;
1155 }
1156 
TryFinishAuthSession(AuthFsm *authFsm)1157 static void TryFinishAuthSession(AuthFsm *authFsm)
1158 {
1159     AuthSessionInfo *info = &authFsm->info;
1160     AUTH_LOGI(AUTH_FSM,
1161         "Try finish auth fsm session, authSeq=%{public}" PRId64", devInfo=%{public}d, closeAck=%{public}d, "
1162         "authFinish=%{public}d",
1163         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived, info->isAuthFinished);
1164     if (info->isNodeInfoReceived && info->isCloseAckReceived && info->isAuthFinished) {
1165         CompleteAuthSession(authFsm, SOFTBUS_OK);
1166     }
1167 }
1168 
HandleMsgAuthFinish(AuthFsm *authFsm, MessagePara *para)1169 static void HandleMsgAuthFinish(AuthFsm *authFsm, MessagePara *para)
1170 {
1171     (void)para;
1172     AuthSessionInfo *info = &authFsm->info;
1173     AUTH_LOGI(AUTH_FSM,
1174         "auth fsm hichain finished, authSeq=%{public}" PRId64", devInfo=%{public}d, closeAck=%{public}d",
1175         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived);
1176     info->isAuthFinished = true;
1177     TryFinishAuthSession(authFsm);
1178 }
1179 
TryRecoveryKey(AuthFsm *authFsm)1180 static int32_t TryRecoveryKey(AuthFsm *authFsm)
1181 {
1182     int32_t ret = SOFTBUS_OK;
1183     if (authFsm->info.normalizedType == NORMALIZED_SUPPORT) {
1184         AUTH_LOGI(AUTH_FSM, "normalized auth succ");
1185         if (RecoveryNormalizedDeviceKey(authFsm) != SOFTBUS_OK) {
1186             AUTH_LOGE(AUTH_FSM, "normalized auth recovery device key fail");
1187             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
1188         }
1189         return ret;
1190     }
1191     if (authFsm->info.isSupportFastAuth) {
1192         AUTH_LOGI(AUTH_FSM, "fast auth succ");
1193         if (RecoveryFastAuthKey(authFsm) != SOFTBUS_OK) {
1194             AUTH_LOGE(AUTH_FSM, "fast auth recovery device key fail");
1195             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
1196         }
1197     }
1198     return ret;
1199 }
1200 
ProcessClientAuthState(AuthFsm *authFsm)1201 static int32_t ProcessClientAuthState(AuthFsm *authFsm)
1202 {
1203     /* just client need start authDevice */
1204     if (ClientSetExchangeIdType(authFsm) != SOFTBUS_OK) {
1205         return SOFTBUS_OK;
1206     }
1207     char *anonyUdid = NULL;
1208     Anonymize(authFsm->info.udid, &anonyUdid);
1209     AUTH_LOGI(AUTH_FSM, "start auth send udid=%{public}s", AnonymizeWrapper(anonyUdid));
1210     AnonymizeFree(anonyUdid);
1211     return HichainStartAuth(authFsm->authSeq, authFsm->info.udid, authFsm->info.connInfo.peerUid);
1212 }
1213 
DeviceAuthStateEnter(FsmStateMachine *fsm)1214 static void DeviceAuthStateEnter(FsmStateMachine *fsm)
1215 {
1216     if (fsm == NULL) {
1217         AUTH_LOGE(AUTH_FSM, "fsm is null");
1218         return;
1219     }
1220     int32_t ret = SOFTBUS_OK;
1221     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
1222     if (authFsm == NULL) {
1223         AUTH_LOGE(AUTH_FSM, "authFsm is null");
1224         return;
1225     }
1226     AUTH_LOGI(AUTH_FSM, "auth state enter, authSeq=%{public}" PRId64, authFsm->authSeq);
1227     authFsm->curState = STATE_DEVICE_AUTH;
1228     AuthSessionInfo *info = &authFsm->info;
1229     if (info->normalizedType == NORMALIZED_SUPPORT || info->isSupportFastAuth) {
1230         ret = TryRecoveryKey(authFsm);
1231         if (ret != SOFTBUS_OK) {
1232             goto ERR_EXIT;
1233         }
1234         return;
1235     }
1236     if (!info->isServer) {
1237         ret = ProcessClientAuthState(authFsm);
1238     }
1239     if (ret != SOFTBUS_OK) {
1240         goto ERR_EXIT;
1241     }
1242     return;
1243 ERR_EXIT:
1244     AUTH_LOGE(AUTH_FSM, "auth state enter, fail ret=%{public}d", ret);
1245     CompleteAuthSession(authFsm, ret);
1246 }
1247 
DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)1248 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
1249 {
1250     MessagePara *msgPara = (MessagePara *)para;
1251     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
1252     if (authFsm == NULL) {
1253         FreeMessagePara(msgPara);
1254         return false;
1255     }
1256     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
1257     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64", message=%{public}s",
1258         authFsm->authSeq, FsmMsgTypeToStr(msgType));
1259     switch (msgType) {
1260         case FSM_MSG_RECV_DEVICE_ID:
1261             HandleMsgRecvDeviceId(authFsm, msgPara);
1262             break;
1263         case FSM_MSG_RECV_AUTH_DATA:
1264             HandleMsgRecvAuthData(authFsm, msgPara);
1265             break;
1266         case FSM_MSG_SAVE_SESSION_KEY:
1267             HandleMsgSaveSessionKey(authFsm, msgPara);
1268             break;
1269         case FSM_MSG_AUTH_ERROR:
1270             HandleMsgAuthError(authFsm, msgPara);
1271             break;
1272         case FSM_MSG_RECV_DEVICE_INFO:
1273             HandleMsgRecvDevInfoEarly(authFsm, msgPara);
1274             break;
1275         case FSM_MSG_AUTH_FINISH:
1276             HandleMsgAuthFinish(authFsm, msgPara);
1277             break;
1278         default:
1279             HandleCommonMsg(authFsm, msgType, msgPara);
1280             break;
1281     }
1282     FreeMessagePara(msgPara);
1283     SoftbusHitraceStop();
1284     return true;
1285 }
1286 
HandleCloseAckMessage(AuthFsm *authFsm, const AuthSessionInfo *info)1287 static int32_t HandleCloseAckMessage(AuthFsm *authFsm, const AuthSessionInfo *info)
1288 {
1289     if ((info->connInfo.type == AUTH_LINK_TYPE_BLE) && (SoftBusGetBrState() == BR_DISABLE) &&
1290         (info->nodeInfo.feature & 1 << BIT_SUPPORT_THREE_STATE) == 0) {
1291         AUTH_LOGE(AUTH_FSM, "peer not support three state");
1292         CompleteAuthSession(authFsm, SOFTBUS_AUTH_NOT_SUPPORT_THREE_STATE);
1293         return SOFTBUS_ERR;
1294     }
1295     if (PostCloseAckMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
1296         AUTH_LOGE(AUTH_FSM, "post close ack fail");
1297         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SEND_FAIL);
1298         return SOFTBUS_ERR;
1299     }
1300     return SOFTBUS_OK;
1301 }
1302 
HandleMsgRecvDeviceInfo(AuthFsm *authFsm, const MessagePara *para)1303 static void HandleMsgRecvDeviceInfo(AuthFsm *authFsm, const MessagePara *para)
1304 {
1305     AuthSessionInfo *info = &authFsm->info;
1306     if (ProcessDeviceInfoMessage(authFsm->authSeq, info, para->data, para->len) != SOFTBUS_OK) {
1307         LnnAuditExtra lnnAuditExtra = {0};
1308         BuildLnnAuditEvent(&lnnAuditExtra, info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
1309             SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL, AUDIT_EVENT_PACKETS_ERROR);
1310         LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_DEV_INFO, lnnAuditExtra);
1311         AUTH_LOGE(AUTH_FSM, "process device info msg fail");
1312         CompleteAuthSession(authFsm, SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL);
1313         return;
1314     }
1315     info->isNodeInfoReceived = true;
1316     if (strcpy_s(info->nodeInfo.uuid, UUID_BUF_LEN, info->uuid) != EOK) {
1317         AUTH_LOGE(AUTH_FSM, "copy uuid fail.");
1318         return;
1319     }
1320     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
1321         info->isCloseAckReceived = true; /* WiFi auth no need close ack, set true directly */
1322         if (!info->isServer) {
1323             LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
1324             AuthManagerSetAuthPassed(authFsm->authSeq, info);
1325             TryFinishAuthSession(authFsm);
1326             return;
1327         }
1328         /* WIFI: server should response device info */
1329         if (PostDeviceInfoMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
1330             AUTH_LOGE(AUTH_FSM, "server: response device info fail");
1331             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
1332             return;
1333         }
1334         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
1335         AuthManagerSetAuthPassed(authFsm->authSeq, info);
1336         TryFinishAuthSession(authFsm);
1337         return;
1338     }
1339     if (HandleCloseAckMessage(authFsm, info) != SOFTBUS_OK) {
1340         AUTH_LOGE(AUTH_FSM, "handle close ack fail");
1341         return;
1342     }
1343     if (info->isCloseAckReceived) {
1344         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
1345         AuthManagerSetAuthPassed(authFsm->authSeq, info);
1346         TryFinishAuthSession(authFsm);
1347     }
1348 }
1349 
HandleMsgRecvCloseAck(AuthFsm *authFsm, MessagePara *para)1350 static void HandleMsgRecvCloseAck(AuthFsm *authFsm, MessagePara *para)
1351 {
1352     (void)para;
1353     AuthSessionInfo *info = &authFsm->info;
1354     AUTH_LOGI(AUTH_FSM, "auth fsm recv close ack, fsm=%{public}" PRId64 ", isNodeInfoReceived=%{public}d",
1355         authFsm->authSeq, info->isNodeInfoReceived);
1356     info->isCloseAckReceived = true;
1357     if (info->isNodeInfoReceived) {
1358         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
1359         AuthManagerSetAuthPassed(authFsm->authSeq, info);
1360     } else {
1361         AUTH_LOGI(AUTH_FSM, "close ack received before device info");
1362     }
1363     TryFinishAuthSession(authFsm);
1364 }
1365 
SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)1366 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
1367 {
1368     MessagePara *msgPara = (MessagePara *)para;
1369     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
1370     if (authFsm == NULL) {
1371         FreeMessagePara(msgPara);
1372         return false;
1373     }
1374     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
1375     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64", message=%{public}s",
1376         authFsm->authSeq, FsmMsgTypeToStr(msgType));
1377     switch (msgType) {
1378         case FSM_MSG_RECV_DEVICE_INFO:
1379             HandleMsgRecvDeviceInfo(authFsm, msgPara);
1380             break;
1381         case FSM_MSG_RECV_CLOSE_ACK:
1382             HandleMsgRecvCloseAck(authFsm, msgPara);
1383             break;
1384         case FSM_MSG_RECV_AUTH_DATA:
1385             HandleMsgRecvAuthData(authFsm, msgPara);
1386             break;
1387         case FSM_MSG_AUTH_FINISH:
1388             HandleMsgAuthFinish(authFsm, msgPara);
1389             break;
1390         default:
1391             HandleCommonMsg(authFsm, msgType, msgPara);
1392             break;
1393     }
1394     FreeMessagePara(msgPara);
1395     SoftbusHitraceStop();
1396     return true;
1397 }
1398 
GetAuthFsmByAuthSeq(int64_t authSeq)1399 static AuthFsm *GetAuthFsmByAuthSeq(int64_t authSeq)
1400 {
1401     AuthFsm *item = NULL;
1402     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1403         if (item->authSeq != authSeq) {
1404             continue;
1405         }
1406         if (item->isDead) {
1407             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1408             break;
1409         }
1410         return item;
1411     }
1412     AUTH_LOGE(AUTH_FSM, "auth fsm not found. authSeq=%{public}" PRId64 "", authSeq);
1413     return NULL;
1414 }
1415 
GetAuthFsmByConnId(uint64_t connId, bool isServer, bool isConnectSide)1416 AuthFsm *GetAuthFsmByConnId(uint64_t connId, bool isServer, bool isConnectSide)
1417 {
1418     AuthFsm *item = NULL;
1419     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1420         if (isConnectSide && (item->info.connId != connId || item->info.isConnectServer != isServer)) {
1421             continue;
1422         }
1423         if (!isConnectSide && (item->info.connId != connId || item->info.isServer != isServer)) {
1424             continue;
1425         }
1426         if (item->isDead) {
1427             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1428             break;
1429         }
1430         return item;
1431     }
1432     AUTH_LOGE(AUTH_FSM, "auth fsm not found. " CONN_INFO, CONN_DATA(connId));
1433     return NULL;
1434 }
1435 
GetSessionInfoFromAuthFsm(int64_t authSeq, AuthSessionInfo *info)1436 static int32_t GetSessionInfoFromAuthFsm(int64_t authSeq, AuthSessionInfo *info)
1437 {
1438     if (!RequireAuthLock()) {
1439         return SOFTBUS_LOCK_ERR;
1440     }
1441     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
1442     if (authFsm == NULL) {
1443         AUTH_LOGE(AUTH_FSM, "auth fsm not found. authSeq=%{public}" PRId64 "", authSeq);
1444         ReleaseAuthLock();
1445         return SOFTBUS_AUTH_NOT_FOUND;
1446     }
1447     *info = authFsm->info;
1448     info->deviceInfoData = NULL;
1449     info->deviceInfoDataLen = 0;
1450     ReleaseAuthLock();
1451     return SOFTBUS_OK;
1452 }
1453 
PostMessageToAuthFsm(int32_t msgType, int64_t authSeq, const uint8_t *data, uint32_t len)1454 static int32_t PostMessageToAuthFsm(int32_t msgType, int64_t authSeq, const uint8_t *data, uint32_t len)
1455 {
1456     MessagePara *para = NewMessagePara(data, len);
1457     if (para == NULL) {
1458         return SOFTBUS_MALLOC_ERR;
1459     }
1460     if (!RequireAuthLock()) {
1461         SoftBusFree(para);
1462         return SOFTBUS_LOCK_ERR;
1463     }
1464     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
1465     if (authFsm == NULL) {
1466         ReleaseAuthLock();
1467         SoftBusFree(para);
1468         return SOFTBUS_AUTH_GET_FSM_FAIL;
1469     }
1470     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
1471         AUTH_LOGE(AUTH_FSM, "post message to auth fsm fail");
1472         ReleaseAuthLock();
1473         SoftBusFree(para);
1474         return SOFTBUS_AUTH_SEND_FAIL;
1475     }
1476     ReleaseAuthLock();
1477     return SOFTBUS_OK;
1478 }
1479 
PostMessageToAuthFsmByConnId(int32_t msgType, uint64_t connId, bool isServer, const uint8_t *data, uint32_t len)1480 static int32_t PostMessageToAuthFsmByConnId(int32_t msgType, uint64_t connId, bool isServer,
1481     const uint8_t *data, uint32_t len)
1482 {
1483     MessagePara *para = NewMessagePara(data, len);
1484     if (para == NULL) {
1485         return SOFTBUS_MALLOC_ERR;
1486     }
1487     if (!RequireAuthLock()) {
1488         SoftBusFree(para);
1489         return SOFTBUS_LOCK_ERR;
1490     }
1491     AuthFsm *authFsm = GetAuthFsmByConnId(connId, isServer, false);
1492     if (authFsm == NULL) {
1493         ReleaseAuthLock();
1494         SoftBusFree(para);
1495         return SOFTBUS_AUTH_GET_FSM_FAIL;
1496     }
1497     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
1498         AUTH_LOGE(AUTH_FSM, "post message to auth fsm by connId fail");
1499         ReleaseAuthLock();
1500         SoftBusFree(para);
1501         return SOFTBUS_AUTH_SEND_FAIL;
1502     }
1503     ReleaseAuthLock();
1504     return SOFTBUS_OK;
1505 }
1506 
SetAuthStartTime(AuthFsm *authFsm)1507 static void SetAuthStartTime(AuthFsm *authFsm)
1508 {
1509     authFsm->statisticData.startAuthTime = (uint64_t)LnnUpTimeMs();
1510 }
1511 
IsPeerSupportNegoAuth(AuthSessionInfo *info)1512 static bool IsPeerSupportNegoAuth(AuthSessionInfo *info)
1513 {
1514     char udidHash[SHORT_UDID_HASH_HEX_LEN + 1] = { 0 };
1515     if (!GetUdidShortHash(info, udidHash, SHORT_UDID_HASH_HEX_LEN + 1)) {
1516         return true;
1517     }
1518     NodeInfo nodeInfo;
1519     (void)memset_s(&nodeInfo, sizeof(nodeInfo), 0, sizeof(nodeInfo));
1520     if (LnnRetrieveDeviceInfo((const char *)udidHash, &nodeInfo) != SOFTBUS_OK) {
1521         AUTH_LOGE(AUTH_FSM, "retrive deviceInfo fail");
1522         return true;
1523     }
1524     if (IsSupportFeatureByCapaBit(nodeInfo.authCapacity, BIT_SUPPORT_NEGOTIATION_AUTH)) {
1525         return true;
1526     }
1527     return false;
1528 }
1529 
GetFirstFsmState(AuthSessionInfo *info, int64_t authSeq, AuthFsmStateIndex *state)1530 static int32_t GetFirstFsmState(AuthSessionInfo *info, int64_t authSeq, AuthFsmStateIndex *state)
1531 {
1532     CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
1533     CHECK_NULL_PTR_RETURN_VALUE(state, SOFTBUS_INVALID_PARAM);
1534     if (info->isConnectServer) {
1535         *state = STATE_SYNC_NEGOTIATION;
1536     } else {
1537         if (!IsPeerSupportNegoAuth(info)) {
1538             info->localState = AUTH_STATE_COMPATIBLE;
1539             AUTH_LOGI(AUTH_FSM, "peer not support nego, localState change, authSeq=%{public}" PRId64, authSeq);
1540         }
1541         if (info->localState == AUTH_STATE_START || info->localState == AUTH_STATE_COMPATIBLE) {
1542             *state = STATE_SYNC_DEVICE_ID;
1543         } else {
1544             *state = STATE_SYNC_NEGOTIATION;
1545         }
1546     }
1547     return SOFTBUS_OK;
1548 }
1549 
AuthSessionStartAuth(const AuthParam *authParam, const AuthConnInfo *connInfo)1550 int32_t AuthSessionStartAuth(const AuthParam *authParam, const AuthConnInfo *connInfo)
1551 {
1552     AUTH_CHECK_AND_RETURN_RET_LOGE(connInfo != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "connInfo is NULL");
1553     AUTH_CHECK_AND_RETURN_RET_LOGE(authParam != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "authParam is NULL");
1554     if (!RequireAuthLock()) {
1555         return SOFTBUS_LOCK_ERR;
1556     }
1557     AuthFsm *authFsm = CreateAuthFsm(authParam->authSeq, authParam->requestId, authParam->connId,
1558         connInfo, authParam->isServer);
1559     if (authFsm == NULL) {
1560         ReleaseAuthLock();
1561         return SOFTBUS_MEM_ERR;
1562     }
1563     authFsm->info.isNeedFastAuth = authParam->isFastAuth;
1564     (void)UpdateLocalAuthState(authFsm->authSeq, &authFsm->info);
1565     AuthFsmStateIndex nextState = STATE_SYNC_DEVICE_ID;
1566     if (GetFirstFsmState(&authFsm->info, authFsm->authSeq, &nextState) != SOFTBUS_OK ||
1567         LnnFsmStart(&authFsm->fsm, g_states + nextState) != SOFTBUS_OK) {
1568         AUTH_LOGE(AUTH_FSM, "start auth fsm fail. authSeq=%{public}" PRId64 "", authFsm->authSeq);
1569         DestroyAuthFsm(authFsm);
1570         ReleaseAuthLock();
1571         return SOFTBUS_ERR;
1572     }
1573     SetAuthStartTime(authFsm);
1574     LnnFsmPostMessageDelay(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT, NULL, AUTH_TIMEOUT_MS);
1575     ReleaseAuthLock();
1576     return SOFTBUS_OK;
1577 }
1578 
AuthSessionProcessDevIdData(int64_t authSeq, const uint8_t *data, uint32_t len)1579 int32_t AuthSessionProcessDevIdData(int64_t authSeq, const uint8_t *data, uint32_t len)
1580 {
1581     if (data == NULL) {
1582         AUTH_LOGE(AUTH_FSM, "data is null");
1583         return SOFTBUS_INVALID_PARAM;
1584     }
1585     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_ID, authSeq, data, len);
1586 }
1587 
AuthSessionPostAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)1588 int32_t AuthSessionPostAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
1589 {
1590     AuthSessionInfo info;
1591     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
1592         return SOFTBUS_AUTH_GET_SESSION_INFO_FAIL;
1593     }
1594     if (PostHichainAuthMessage(authSeq, &info, data, len) != SOFTBUS_OK) {
1595         return SOFTBUS_AUTH_SYNC_DEVID_FAIL;
1596     }
1597     return SOFTBUS_OK;
1598 }
1599 
AuthSessionProcessAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)1600 int32_t AuthSessionProcessAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
1601 {
1602     if (data == NULL) {
1603         AUTH_LOGE(AUTH_FSM, "data is null");
1604         return SOFTBUS_INVALID_PARAM;
1605     }
1606     return PostMessageToAuthFsm(FSM_MSG_RECV_AUTH_DATA, authSeq, data, len);
1607 }
1608 
AuthSessionGetUdid(int64_t authSeq, char *udid, uint32_t size)1609 int32_t AuthSessionGetUdid(int64_t authSeq, char *udid, uint32_t size)
1610 {
1611     if (udid == NULL) {
1612         AUTH_LOGE(AUTH_FSM, "udid is null");
1613         return SOFTBUS_INVALID_PARAM;
1614     }
1615     AuthSessionInfo info = {0};
1616     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
1617         return SOFTBUS_AUTH_GET_SESSION_INFO_FAIL;
1618     }
1619     if (memcpy_s(udid, size, info.udid, sizeof(info.udid)) != EOK) {
1620         AUTH_LOGE(AUTH_FSM, "copy udid fail");
1621         return SOFTBUS_MEM_ERR;
1622     }
1623     return SOFTBUS_OK;
1624 }
1625 
AuthSessionSaveSessionKey(int64_t authSeq, const uint8_t *key, uint32_t len)1626 int32_t AuthSessionSaveSessionKey(int64_t authSeq, const uint8_t *key, uint32_t len)
1627 {
1628     if (key == NULL) {
1629         AUTH_LOGE(AUTH_FSM, "key is null");
1630         return SOFTBUS_INVALID_PARAM;
1631     }
1632     return PostMessageToAuthFsm(FSM_MSG_SAVE_SESSION_KEY, authSeq, key, len);
1633 }
1634 
AuthSessionHandleAuthFinish(int64_t authSeq)1635 int32_t AuthSessionHandleAuthFinish(int64_t authSeq)
1636 {
1637     return PostMessageToAuthFsm(FSM_MSG_AUTH_FINISH, authSeq, NULL, 0);
1638 }
1639 
AuthSessionHandleAuthError(int64_t authSeq, int32_t reason)1640 int32_t AuthSessionHandleAuthError(int64_t authSeq, int32_t reason)
1641 {
1642     return PostMessageToAuthFsm(FSM_MSG_AUTH_ERROR, authSeq, (uint8_t *)&reason, sizeof(reason));
1643 }
1644 
AuthSessionProcessDevInfoData(int64_t authSeq, const uint8_t *data, uint32_t len)1645 int32_t AuthSessionProcessDevInfoData(int64_t authSeq, const uint8_t *data, uint32_t len)
1646 {
1647     if (data == NULL) {
1648         AUTH_LOGE(AUTH_FSM, "data is null");
1649         return SOFTBUS_INVALID_PARAM;
1650     }
1651     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_INFO, authSeq, data, len);
1652 }
1653 
AuthSessionProcessCloseAck(int64_t authSeq, const uint8_t *data, uint32_t len)1654 int32_t AuthSessionProcessCloseAck(int64_t authSeq, const uint8_t *data, uint32_t len)
1655 {
1656     if (data == NULL) {
1657         AUTH_LOGE(AUTH_FSM, "data is null");
1658         return SOFTBUS_INVALID_PARAM;
1659     }
1660     return PostMessageToAuthFsm(FSM_MSG_RECV_CLOSE_ACK, authSeq, data, len);
1661 }
1662 
AuthSessionProcessDevInfoDataByConnId(uint64_t connId, bool isServer, const uint8_t *data, uint32_t len)1663 int32_t AuthSessionProcessDevInfoDataByConnId(uint64_t connId, bool isServer, const uint8_t *data,
1664     uint32_t len)
1665 {
1666     if (data == NULL) {
1667         AUTH_LOGE(AUTH_FSM, "data is null");
1668         return SOFTBUS_INVALID_PARAM;
1669     }
1670     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_DEVICE_INFO, connId, isServer, data, len);
1671 }
1672 
AuthSessionProcessCloseAckByConnId(uint64_t connId, bool isServer, const uint8_t *data, uint32_t len)1673 int32_t AuthSessionProcessCloseAckByConnId(uint64_t connId, bool isServer, const uint8_t *data,
1674     uint32_t len)
1675 {
1676     if (data == NULL) {
1677         AUTH_LOGE(AUTH_FSM, "data is null");
1678         return SOFTBUS_INVALID_PARAM;
1679     }
1680     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_CLOSE_ACK, connId, isServer, data, len);
1681 }
1682 
AuthSessionProcessCancelAuthByConnId(uint64_t connId, bool isConnectServer, const uint8_t *data, uint32_t len)1683 int32_t AuthSessionProcessCancelAuthByConnId(uint64_t connId, bool isConnectServer, const uint8_t *data, uint32_t len)
1684 {
1685     if (!RequireAuthLock()) {
1686         return SOFTBUS_LOCK_ERR;
1687     }
1688     AuthFsm *authFsm = GetAuthFsmByConnId(connId, isConnectServer, true);
1689     if (authFsm == NULL) {
1690         ReleaseAuthLock();
1691         return SOFTBUS_AUTH_GET_FSM_FAIL;
1692     }
1693     if (LnnFsmPostMessage(&authFsm->fsm, FSM_MSG_DEVICE_DISCONNECTED, NULL) != SOFTBUS_OK) {
1694         AUTH_LOGE(AUTH_FSM, "post message to auth fsm by connId fail");
1695         ReleaseAuthLock();
1696         return SOFTBUS_AUTH_SEND_FAIL;
1697     }
1698     ReleaseAuthLock();
1699     return SOFTBUS_OK;
1700 }
1701 
AuthSessionHandleDeviceNotTrusted(const char *udid)1702 int32_t AuthSessionHandleDeviceNotTrusted(const char *udid)
1703 {
1704     if (udid == NULL || udid[0] == '\0') {
1705         AUTH_LOGE(AUTH_FSM, "invalid udid");
1706         return SOFTBUS_INVALID_PARAM;
1707     }
1708     if (!RequireAuthLock()) {
1709         return SOFTBUS_LOCK_ERR;
1710     }
1711     AuthFsm *item = NULL;
1712     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1713         if (strcmp(item->info.udid, udid) != 0) {
1714             continue;
1715         }
1716         if (item->isDead) {
1717             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1718             continue;
1719         }
1720         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_NOT_TRUSTED, NULL);
1721     }
1722     ReleaseAuthLock();
1723     return SOFTBUS_OK;
1724 }
1725 
AuthSessionHandleDeviceDisconnected(uint64_t connId)1726 int32_t AuthSessionHandleDeviceDisconnected(uint64_t connId)
1727 {
1728     if (!RequireAuthLock()) {
1729         return SOFTBUS_LOCK_ERR;
1730     }
1731     AuthFsm *item = NULL;
1732     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1733         if (item->info.connId != connId) {
1734             continue;
1735         }
1736         if (item->isDead) {
1737             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1738             continue;
1739         }
1740         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_DISCONNECTED, NULL);
1741     }
1742     ReleaseAuthLock();
1743     return SOFTBUS_OK;
1744 }
1745 
AuthNotifyRequestVerify(int64_t authSeq)1746 int32_t AuthNotifyRequestVerify(int64_t authSeq)
1747 {
1748     return PostMessageToAuthFsm(FSM_MSG_DEVICE_POST_DEVICEID, authSeq, NULL, 0);
1749 }
1750 
AuthSessionFsmExit(void)1751 void AuthSessionFsmExit(void)
1752 {
1753     HichainDestroy();
1754     if (!RequireAuthLock()) {
1755         return;
1756     }
1757     AuthFsm *item = NULL;
1758     AuthFsm *next = NULL;
1759     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authFsmList, AuthFsm, node) {
1760         DestroyAuthFsm(item);
1761     }
1762     ListInit(&g_authFsmList);
1763     ReleaseAuthLock();
1764 }
1765