• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "auth_session_fsm.h"
17 
18 #include <securec.h>
19 
20 #include "auth_connection.h"
21 #include "auth_device_common_key.h"
22 #include "auth_hichain.h"
23 #include "auth_manager.h"
24 #include "auth_request.h"
25 #include "auth_session_message.h"
26 #include "softbus_adapter_hitrace.h"
27 #include "softbus_adapter_mem.h"
28 #include "softbus_def.h"
29 
30 #define AUTH_TIMEOUT_MS (10 * 1000)
31 #define TO_AUTH_FSM(ptr) CONTAINER_OF(ptr, AuthFsm, fsm)
32 
33 typedef enum {
34     STATE_SYNC_DEVICE_ID = 0,
35     STATE_DEVICE_AUTH,
36     STATE_SYNC_DEVICE_INFO,
37     STATE_NUM_MAX
38 } AuthFsmStateIndex;
39 
40 typedef enum {
41     FSM_MSG_RECV_DEVICE_ID,
42     FSM_MSG_RECV_AUTH_DATA,
43     FSM_MSG_SAVE_SESSION_KEY,
44     FSM_MSG_AUTH_ERROR,
45     FSM_MSG_RECV_DEVICE_INFO,
46     FSM_MSG_RECV_CLOSE_ACK,
47     FSM_MSG_AUTH_FINISH,
48     FSM_MSG_AUTH_TIMEOUT,
49     FSM_MSG_DEVICE_NOT_TRUSTED,
50     FSM_MSG_DEVICE_DISCONNECTED,
51     FSM_MSG_UNKNOWN,
52 } StateMessageType;
53 typedef struct {
54     StateMessageType type;
55     char *msg;
56 } StateMsgMap;
57 
58 static const StateMsgMap g_StateMsgMap[] = {
59     {FSM_MSG_RECV_DEVICE_ID, (char *)"RECV_DEVICE_ID"},
60     {FSM_MSG_RECV_AUTH_DATA, (char *)"RECV_AUTH_DATA"},
61     {FSM_MSG_SAVE_SESSION_KEY, (char *)"SAVE_SESSION_KEY"},
62     {FSM_MSG_AUTH_ERROR, (char *)"AUTH_ERROR"},
63     {FSM_MSG_RECV_DEVICE_INFO, (char *)"RECV_DEVICE_INFO"},
64     {FSM_MSG_RECV_CLOSE_ACK, (char *)"RECV_CLOSE_ACK"},
65     {FSM_MSG_AUTH_FINISH, (char *)"AUTH_FINISH"},
66     {FSM_MSG_AUTH_TIMEOUT, (char *)"AUTH_TIMEOUT"},
67     {FSM_MSG_DEVICE_NOT_TRUSTED, (char *)"DEVICE_NOT_TRUSTED"},
68     {FSM_MSG_DEVICE_DISCONNECTED, (char *)"DEVICE_DISCONNECTED"},
69     {FSM_MSG_UNKNOWN, (char *)"UNKNOWN MSG!!"},
70 };
71 
72 typedef struct {
73     uint32_t len;
74     uint8_t data[0];
75 } MessagePara;
76 
77 typedef struct {
78     int64_t param1;
79     bool param2;
80     AuthFsm *(*getFunc)(int64_t param1, bool param2);
81 } AuthFsmGetFunc;
82 
83 static ListNode g_authFsmList = { &g_authFsmList, &g_authFsmList };
84 
85 static void SyncDevIdStateEnter(FsmStateMachine *fsm);
86 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
87 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
88 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
89 static void AuthFsmDeinitCallback(FsmStateMachine *fsm);
90 
91 static FsmState g_states[STATE_NUM_MAX] = {
92     [STATE_SYNC_DEVICE_ID] = {
93         .enter = SyncDevIdStateEnter,
94         .process = SyncDevIdStateProcess,
95         .exit = NULL,
96     },
97     [STATE_DEVICE_AUTH] = {
98         .enter = NULL,
99         .process = DeviceAuthStateProcess,
100         .exit = NULL,
101     },
102     [STATE_SYNC_DEVICE_INFO] = {
103         .enter = NULL,
104         .process = SyncDevInfoStateProcess,
105         .exit = NULL,
106     },
107 };
108 
FsmMsgTypeToStr(int32_t type)109 static char *FsmMsgTypeToStr(int32_t type)
110 {
111     if (type < FSM_MSG_RECV_DEVICE_ID || type > FSM_MSG_DEVICE_DISCONNECTED) {
112         return g_StateMsgMap[FSM_MSG_UNKNOWN].msg;
113     }
114     return g_StateMsgMap[type].msg;
115 }
116 
TranslateToAuthFsm(FsmStateMachine * fsm,int32_t msgType,MessagePara * para)117 static AuthFsm *TranslateToAuthFsm(FsmStateMachine *fsm, int32_t msgType, MessagePara *para)
118 {
119     if (fsm == NULL) {
120         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
121         return NULL;
122     }
123     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
124     if (authFsm == NULL) {
125         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "authFsm is null");
126         return NULL;
127     }
128     if (authFsm->isDead) {
129         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%" PRId64 "] has dead", authFsm->authSeq);
130         return NULL;
131     }
132     /* check para */
133     if ((msgType != FSM_MSG_AUTH_TIMEOUT &&
134         msgType != FSM_MSG_DEVICE_NOT_TRUSTED &&
135         msgType != FSM_MSG_DEVICE_DISCONNECTED) && para == NULL) {
136         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid msgType: %d", msgType);
137         return NULL;
138     }
139     return authFsm;
140 }
141 
GetNextAuthFsmId(void)142 static uint32_t GetNextAuthFsmId(void)
143 {
144     static uint32_t authFsmId = 0;
145     return ++authFsmId;
146 }
147 
CreateAuthFsm(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer)148 static AuthFsm *CreateAuthFsm(int64_t authSeq, uint32_t requestId, uint64_t connId,
149     const AuthConnInfo *connInfo, bool isServer)
150 {
151     AuthFsm *authFsm = (AuthFsm *)SoftBusCalloc(sizeof(AuthFsm));
152     if (authFsm == NULL) {
153         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc AuthFsm fail");
154         return NULL;
155     }
156     authFsm->id = GetNextAuthFsmId();
157     authFsm->authSeq = authSeq;
158     authFsm->info.requestId = requestId;
159     authFsm->info.isServer = isServer;
160     authFsm->info.connId = connId;
161     authFsm->info.connInfo = *connInfo;
162     authFsm->info.version = SOFTBUS_NEW_V2;
163     NodeInfo nodeInfo;
164     AuthRequest request;
165     if (memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo)) != EOK ||
166         memset_s(&request, sizeof(NodeInfo), 0, sizeof(NodeInfo)) != EOK) {
167         ALOGE("memset fail.");
168         SoftBusFree(authFsm);
169         return NULL;
170     }
171     authFsm->info.idType = EXCHANHE_UDID;
172     if (!isServer) {
173         if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE) {
174             if (GetAuthRequestNoLock(requestId, &request) != SOFTBUS_OK) {
175                 ALOGE("get auth request fail");
176                 SoftBusFree(authFsm);
177                 return NULL;
178             }
179             if (LnnRetrieveDeviceInfo(
180                 (const char *)request.connInfo.info.bleInfo.deviceIdHash, &nodeInfo) == SOFTBUS_OK) {
181                 ALOGI("LnnRetrieveDeviceInfo success");
182                 authFsm->info.idType = EXCHANGE_NETWORKID;
183             }
184         }
185     }
186     if (sprintf_s(authFsm->fsmName, sizeof(authFsm->fsmName), "AuthFsm-%u", authFsm->id) == -1) {
187         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "format auth fsm name fail");
188         SoftBusFree(authFsm);
189         return NULL;
190     }
191     if (LnnFsmInit(&authFsm->fsm, NULL, authFsm->fsmName, AuthFsmDeinitCallback) != SOFTBUS_OK) {
192         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init fsm fail");
193         SoftBusFree(authFsm);
194         return NULL;
195     }
196     for (int32_t i = 0; i < STATE_NUM_MAX; ++i) {
197         LnnFsmAddState(&authFsm->fsm, &g_states[i]);
198     }
199     ListNodeInsert(&g_authFsmList, &authFsm->node);
200     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
201         "create auth fsm[%" PRId64 "], name[%s], side[%s], reqId[%u], " CONN_INFO,
202         authFsm->authSeq, authFsm->fsmName, GetAuthSideStr(isServer), requestId, CONN_DATA(connId));
203     return authFsm;
204 }
205 
DestroyAuthFsm(AuthFsm * authFsm)206 static void DestroyAuthFsm(AuthFsm *authFsm)
207 {
208     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "destroy auth fsm[%" PRId64 "], side[%s], reqId[%u]",
209         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), authFsm->info.requestId);
210     ListDelete(&authFsm->node);
211     if (authFsm->info.deviceInfoData != NULL) {
212         SoftBusFree(authFsm->info.deviceInfoData);
213         authFsm->info.deviceInfoData = NULL;
214     }
215     SoftBusFree(authFsm);
216 }
217 
AuthFsmDeinitCallback(FsmStateMachine * fsm)218 NO_SANITIZE("cfi") static void AuthFsmDeinitCallback(FsmStateMachine *fsm)
219 {
220     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth fsm deinit callback enter");
221     if (fsm == NULL) {
222         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
223         return;
224     }
225     if (!RequireAuthLock()) {
226         return;
227     }
228     DestroyAuthFsm(TO_AUTH_FSM(fsm));
229     ReleaseAuthLock();
230 }
231 
NewMessagePara(const uint8_t * data,uint32_t len)232 static MessagePara *NewMessagePara(const uint8_t *data, uint32_t len)
233 {
234     MessagePara *para = (MessagePara *)SoftBusCalloc(sizeof(MessagePara) + len);
235     if (para == NULL) {
236         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc ExchangeDataPara fail");
237         return NULL;
238     }
239     para->len = len;
240     if (data != NULL && len > 0 && memcpy_s(para->data, len, data, len) != EOK) {
241         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy data fail");
242         SoftBusFree(para);
243         return NULL;
244     }
245     return para;
246 }
247 
FreeMessagePara(MessagePara * para)248 static void FreeMessagePara(MessagePara *para)
249 {
250     if (para != NULL) {
251         SoftBusFree(para);
252     }
253 }
254 
ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)255 static SoftBusLinkType ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)
256 {
257     switch (type) {
258         case AUTH_LINK_TYPE_WIFI:
259             return SOFTBUS_HISYSEVT_LINK_TYPE_WLAN;
260         case AUTH_LINK_TYPE_BR:
261             return SOFTBUS_HISYSEVT_LINK_TYPE_BR;
262         case AUTH_LINK_TYPE_BLE:
263             return SOFTBUS_HISYSEVT_LINK_TYPE_BLE;
264         case AUTH_LINK_TYPE_P2P:
265             return SOFTBUS_HISYSEVT_LINK_TYPE_P2P;
266         default:
267             return SOFTBUS_HISYSEVT_LINK_TYPE_BUTT;
268     }
269 }
270 
ReportAuthResultEvt(AuthFsm * authFsm,int32_t result)271 static void ReportAuthResultEvt(AuthFsm *authFsm, int32_t result)
272 {
273     ALOGI("report auth result evt enter");
274     SoftBusLinkType linkType = ConvertAuthLinkTypeToHisysEvtLinkType(authFsm->info.connInfo.type);
275     if (linkType == SOFTBUS_HISYSEVT_LINK_TYPE_BUTT) {
276         return;
277     }
278     authFsm->statisticData.endAuthTime = LnnUpTimeMs();
279     uint64_t costTime = authFsm->statisticData.endAuthTime - authFsm->statisticData.startAuthTime;
280     AuthFailStage stage;
281     switch (result) {
282         case SOFTBUS_OK:
283             if (SoftBusRecordAuthResult(linkType, SOFTBUS_OK, costTime, AUTH_STAGE_BUTT) != SOFTBUS_OK) {
284                 ALOGE("report static auth result fail");
285             }
286             return;
287         case SOFTBUS_AUTH_SYNC_DEVID_FAIL:
288         case SOFTBUS_AUTH_SYNC_DEVINFO_FAIL:
289         case SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL:
290         case SOFTBUS_AUTH_SEND_FAIL:
291             stage = AUTH_EXCHANGE_STAGE;
292             break;
293         case SOFTBUS_AUTH_DEVICE_DISCONNECTED:
294             stage = AUTH_CONNECT_STAGE;
295             break;
296         case SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL:
297         case SOFTBUS_AUTH_HICHAIN_AUTH_ERROR:
298         case SOFTBUS_AUTH_TIMEOUT:
299         case SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED:
300             stage = AUTH_VERIFY_STAGE;
301             break;
302         default:
303             ALOGE("unsupport reasn:%d.", result);
304             return;
305     }
306     if (SoftBusRecordAuthResult(linkType, SOFTBUS_ERR, costTime, stage) != SOFTBUS_OK) {
307         ALOGE("report static auth result fail");
308     }
309     SoftBusFaultEvtInfo info;
310     (void)memset_s(&info, sizeof(SoftBusFaultEvtInfo), 0, sizeof(SoftBusFaultEvtInfo));
311     info.moduleType = MODULE_TYPE_AUTH;
312     info.linkType = linkType;
313     info.errorCode = result;
314     if (SoftBusReportBusCenterFaultEvt(&info) != SOFTBUS_OK) {
315         ALOGE("report buscenter fault evt fail");
316     }
317 }
318 
SaveDeviceKey(AuthFsm * authFsm)319 static void SaveDeviceKey(AuthFsm *authFsm)
320 {
321     AuthDeviceKeyInfo deviceKey;
322     SessionKey sessionKey;
323     (void)memset_s(&deviceKey, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
324     (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
325     if (AuthManagerGetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey) != SOFTBUS_OK) {
326         ALOGE("get session key fail");
327         return;
328     }
329     if (memcpy_s(deviceKey.deviceKey, sizeof(deviceKey.deviceKey),
330         sessionKey.value, sizeof(sessionKey.value)) != EOK) {
331         ALOGE("session key cpy fail");
332         return;
333     }
334     deviceKey.keyLen = sessionKey.len;
335     deviceKey.keyIndex = authFsm->authSeq;
336     deviceKey.keyType = authFsm->info.connInfo.type;
337     deviceKey.isServerSide = authFsm->info.isServer;
338     if (AuthInsertDeviceKey(&authFsm->info.nodeInfo, &deviceKey) != SOFTBUS_OK) {
339         ALOGE("insert deviceKey fail");
340         return;
341     }
342 }
343 
CompleteAuthSession(AuthFsm * authFsm,int32_t result)344 static void CompleteAuthSession(AuthFsm *authFsm, int32_t result)
345 {
346     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
347     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth fsm[%" PRId64 "] complete: side=%s, result=%d",
348         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), result);
349     ReportAuthResultEvt(authFsm, result);
350     if (result == SOFTBUS_OK) {
351         AuthManagerSetAuthFinished(authFsm->authSeq, &authFsm->info);
352         if ((!authFsm->info.isSupportFastAuth) && (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE)) {
353             ALOGI("only hichain verify, save the device key");
354             SaveDeviceKey(authFsm);
355         }
356     } else {
357         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
358         AuthManagerSetAuthFailed(authFsm->authSeq, &authFsm->info, result);
359     }
360 
361     authFsm->isDead = true;
362     LnnFsmStop(&authFsm->fsm);
363     LnnFsmDeinit(&authFsm->fsm);
364     SoftbusHitraceStop();
365 }
366 
HandleCommonMsg(AuthFsm * authFsm,int32_t msgType,MessagePara * msgPara)367 static void HandleCommonMsg(AuthFsm *authFsm, int32_t msgType, MessagePara *msgPara)
368 {
369     (void)msgPara;
370     switch (msgType) {
371         case FSM_MSG_AUTH_TIMEOUT:
372             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%" PRId64 "] timeout", authFsm->authSeq);
373             CompleteAuthSession(authFsm, SOFTBUS_AUTH_TIMEOUT);
374             break;
375         case FSM_MSG_DEVICE_NOT_TRUSTED:
376             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED);
377             break;
378         case FSM_MSG_DEVICE_DISCONNECTED:
379             if (authFsm->info.isNodeInfoReceived && authFsm->info.isCloseAckReceived) {
380                 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN,
381                     "auth fsm[%" PRId64 "] wait for the finish event, ignore this disconnect event", authFsm->authSeq);
382                 break;
383             }
384             CompleteAuthSession(authFsm, SOFTBUS_AUTH_DEVICE_DISCONNECTED);
385             break;
386         default:
387             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
388                 "auth fsm[%" PRId64 "] cannot handle msg: %d", authFsm->authSeq, msgType);
389             break;
390     }
391 }
392 
SyncDevIdStateEnter(FsmStateMachine * fsm)393 static void SyncDevIdStateEnter(FsmStateMachine *fsm)
394 {
395     if (fsm == NULL) {
396         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
397         return;
398     }
399     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
400     if (authFsm == NULL) {
401         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "authFsm is null");
402         return;
403     }
404     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
405     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
406         "SyncDevIdState: auth fsm[%" PRId64 "] enter", authFsm->authSeq);
407     if (!authFsm->info.isServer) {
408         if (PostDeviceIdMessage(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
409             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
410         }
411     }
412     SoftbusHitraceStop();
413 }
414 
RecoveryDeviceKey(AuthFsm * authFsm)415 static int32_t RecoveryDeviceKey(AuthFsm *authFsm)
416 {
417 #define UDID_SHORT_HASH_LEN_TEMP 8
418 #define UDID_SHORT_HASH_HEX_STRING 17
419     AuthDeviceKeyInfo key = {0};
420     uint8_t hash[SHA_256_HASH_LEN] = {0};
421     int ret = SoftBusGenerateStrHash((uint8_t *)authFsm->info.udid, strlen(authFsm->info.udid), hash);
422     if (ret != SOFTBUS_OK) {
423         ALOGE("generate udidHash fail");
424         return SOFTBUS_ERR;
425     }
426     char udidShortHash[UDID_SHORT_HASH_HEX_STRING] = {0};
427     if (ConvertBytesToUpperCaseHexString(udidShortHash, UDID_SHORT_HASH_HEX_STRING,
428         hash, UDID_SHORT_HASH_LEN_TEMP) != SOFTBUS_OK) {
429         ALOGE("convert bytes to string fail");
430         return SOFTBUS_ERR;
431     }
432     if (AuthFindDeviceKey(udidShortHash, authFsm->info.connInfo.type, &key) != SOFTBUS_OK) {
433         ALOGE("find key fail, fastAuth error");
434         return SOFTBUS_ERR;
435     }
436     AuthUpdateKeyIndex(udidShortHash, authFsm->info.connInfo.type, authFsm->authSeq, authFsm->info.isServer);
437     authFsm->info.oldIndex = key.keyIndex;
438     ret = AuthSessionSaveSessionKey(authFsm->authSeq, key.deviceKey, key.keyLen);
439     if (ret != SOFTBUS_OK) {
440         ALOGE("post save sessionKey event");
441         return SOFTBUS_ERR;
442     }
443     return AuthSessionHandleAuthFinish(authFsm->authSeq);
444 }
445 
ClientSetExchangeIdType(AuthFsm * authFsm)446 static int32_t ClientSetExchangeIdType(AuthFsm *authFsm)
447 {
448     AuthSessionInfo *info = &authFsm->info;
449     if (info->idType == EXCHANGE_FAIL) {
450         ALOGI("fsm switch to reauth due to not find networkId");
451         info->idType = EXCHANHE_UDID;
452         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID);
453         return SOFTBUS_ERR;
454     }
455     return SOFTBUS_OK;
456 }
457 
HandleMsgRecvDeviceId(AuthFsm * authFsm,MessagePara * para)458 static void HandleMsgRecvDeviceId(AuthFsm *authFsm, MessagePara *para)
459 {
460     int32_t ret;
461     AuthSessionInfo *info = &authFsm->info;
462     do {
463         if (ProcessDeviceIdMessage(info, para->data, para->len) != SOFTBUS_OK) {
464             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
465             break;
466         }
467         if (info->isServer) {
468             if (PostDeviceIdMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
469                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
470                 break;
471             }
472         }
473         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
474         if (info->isSupportFastAuth) {
475             ALOGI("fast auth succ");
476             if (RecoveryDeviceKey(authFsm) != SOFTBUS_OK) {
477                 ALOGE("fast auth recovery device key fail");
478                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
479                 break;
480             }
481         } else if (!info->isServer) {
482             /* just client need start authDevice. */
483             if (ClientSetExchangeIdType(authFsm) != SOFTBUS_OK) {
484                 ret = SOFTBUS_OK;
485                 break;
486             }
487             ALOGI("start auth send udid=[%s]", AnonymizesUDID(info->udid));
488             if (HichainStartAuth(authFsm->authSeq, info->udid, info->connInfo.peerUid) != SOFTBUS_OK) {
489                 ret = SOFTBUS_AUTH_HICHAIN_AUTH_FAIL;
490                 break;
491             }
492         }
493         ret = SOFTBUS_OK;
494     } while (false);
495 
496     if (ret != SOFTBUS_OK) {
497         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "handle devId msg fail, ret=%d", ret);
498         CompleteAuthSession(authFsm, ret);
499     }
500 }
501 
SyncDevIdStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)502 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
503 {
504     MessagePara *msgPara = (MessagePara *)para;
505     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
506     if (authFsm == NULL) {
507         FreeMessagePara(msgPara);
508         return false;
509     }
510     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
511     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
512         "SyncDevIdState: auth fsm[%" PRId64"] process message: %s", authFsm->authSeq, FsmMsgTypeToStr(msgType));
513     switch (msgType) {
514         case FSM_MSG_RECV_DEVICE_ID:
515             HandleMsgRecvDeviceId(authFsm, msgPara);
516             break;
517         default:
518             HandleCommonMsg(authFsm, msgType, msgPara);
519             break;
520     }
521     FreeMessagePara(msgPara);
522     SoftbusHitraceStop();
523     return true;
524 }
525 
HandleMsgRecvAuthData(AuthFsm * authFsm,MessagePara * para)526 static void HandleMsgRecvAuthData(AuthFsm *authFsm, MessagePara *para)
527 {
528     int32_t ret = HichainProcessData(authFsm->authSeq, para->data, para->len);
529     if (ret != SOFTBUS_OK) {
530         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "process hichain data fail.");
531         if (!authFsm->info.isAuthFinished) {
532             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL);
533         } else {
534             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_DBG, "auth has finished, ignore this processing failure.");
535         }
536     }
537 }
538 
TrySyncDeviceInfo(int64_t authSeq,AuthSessionInfo * info)539 static int32_t TrySyncDeviceInfo(int64_t authSeq, AuthSessionInfo *info)
540 {
541     switch (info->connInfo.type) {
542         case AUTH_LINK_TYPE_WIFI:
543             /* WIFI: client firstly send device info, server just reponse it. */
544             if (!info->isServer) {
545                 return PostDeviceInfoMessage(authSeq, info);
546             }
547             return SOFTBUS_OK;
548         case AUTH_LINK_TYPE_BR:
549         case AUTH_LINK_TYPE_BLE:
550         case AUTH_LINK_TYPE_P2P:
551             return PostDeviceInfoMessage(authSeq, info);
552         default:
553             break;
554     }
555     return SOFTBUS_ERR;
556 }
557 
HandleMsgSaveSessionKey(AuthFsm * authFsm,MessagePara * para)558 static void HandleMsgSaveSessionKey(AuthFsm *authFsm, MessagePara *para)
559 {
560     SessionKey sessionKey = {.len = para->len};
561     if (memcpy_s(sessionKey.value, sizeof(sessionKey.value), para->data, para->len) != EOK) {
562         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy session key fail.");
563         (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
564         return;
565     }
566     if (AuthManagerSetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey, true) != SOFTBUS_OK) {
567         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
568             "auth fsm[%" PRId64 "] save session key fail", authFsm->authSeq);
569     }
570     (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
571 
572     if (TrySyncDeviceInfo(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
573         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
574             "auth fsm[%" PRId64"] sync device info fail", authFsm->authSeq);
575         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
576         return;
577     }
578     if (authFsm->info.deviceInfoData != NULL) {
579         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
580             "auth fsm[%" PRId64"] dispatch device info to next state", authFsm->authSeq);
581         (void)AuthSessionProcessDevInfoData(authFsm->authSeq,
582             authFsm->info.deviceInfoData, authFsm->info.deviceInfoDataLen);
583         SoftBusFree(authFsm->info.deviceInfoData);
584         authFsm->info.deviceInfoData = NULL;
585     }
586     LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_INFO);
587 }
588 
HandleMsgAuthError(AuthFsm * authFsm,MessagePara * para)589 static void HandleMsgAuthError(AuthFsm *authFsm, MessagePara *para)
590 {
591     int32_t result = *((int32_t *)(para->data));
592     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
593         "auth fsm[%" PRId64"] handle hichain error, reason = %d", authFsm->authSeq, result);
594     CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_AUTH_ERROR);
595 }
596 
HandleMsgRecvDevInfoEarly(AuthFsm * authFsm,MessagePara * para)597 static void HandleMsgRecvDevInfoEarly(AuthFsm *authFsm, MessagePara *para)
598 {
599     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
600         "auth fsm[%" PRId64 "] recv device info early, save it", authFsm->authSeq);
601     AuthSessionInfo *info = &authFsm->info;
602     if (info->deviceInfoData != NULL) {
603         SoftBusFree(info->deviceInfoData);
604         info->deviceInfoData = NULL;
605     }
606     info->deviceInfoData = DupMemBuffer(para->data, para->len);
607     if (info->deviceInfoData == NULL) {
608         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "dup device info fail.");
609         return;
610     }
611     info->deviceInfoDataLen = para->len;
612 }
613 
TryFinishAuthSession(AuthFsm * authFsm)614 static void TryFinishAuthSession(AuthFsm *authFsm)
615 {
616     AuthSessionInfo *info = &authFsm->info;
617     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
618         "auth fsm[%" PRId64"] Try finish auth session, devInfo|closeAck|authFinish=%d|%d|%d",
619         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived, info->isAuthFinished);
620     if (info->isNodeInfoReceived && info->isCloseAckReceived && info->isAuthFinished) {
621         CompleteAuthSession(authFsm, SOFTBUS_OK);
622     }
623 }
624 
HandleMsgAuthFinish(AuthFsm * authFsm,MessagePara * para)625 static void HandleMsgAuthFinish(AuthFsm *authFsm, MessagePara *para)
626 {
627     (void)para;
628     AuthSessionInfo *info = &authFsm->info;
629     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
630         "auth fsm[%" PRId64"] hichain finished, devInfo|closeAck=%d|%d",
631         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived);
632     info->isAuthFinished = true;
633     TryFinishAuthSession(authFsm);
634 }
635 
DeviceAuthStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)636 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
637 {
638     MessagePara *msgPara = (MessagePara *)para;
639     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
640     if (authFsm == NULL) {
641         FreeMessagePara(msgPara);
642         return false;
643     }
644     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
645     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
646         "DeviceAuthState: auth fsm[%" PRId64"] process message: %s", authFsm->authSeq, FsmMsgTypeToStr(msgType));
647     switch (msgType) {
648         case FSM_MSG_RECV_DEVICE_ID:
649             HandleMsgRecvDeviceId(authFsm, msgPara);
650             break;
651         case FSM_MSG_RECV_AUTH_DATA:
652             HandleMsgRecvAuthData(authFsm, msgPara);
653             break;
654         case FSM_MSG_SAVE_SESSION_KEY:
655             HandleMsgSaveSessionKey(authFsm, msgPara);
656             break;
657         case FSM_MSG_AUTH_ERROR:
658             HandleMsgAuthError(authFsm, msgPara);
659             break;
660         case FSM_MSG_RECV_DEVICE_INFO:
661             HandleMsgRecvDevInfoEarly(authFsm, msgPara);
662             break;
663         case FSM_MSG_AUTH_FINISH:
664             HandleMsgAuthFinish(authFsm, msgPara);
665             break;
666         default:
667             HandleCommonMsg(authFsm, msgType, msgPara);
668             break;
669     }
670     FreeMessagePara(msgPara);
671     SoftbusHitraceStop();
672     return true;
673 }
674 
HandleMsgRecvDeviceInfo(AuthFsm * authFsm,MessagePara * para)675 static void HandleMsgRecvDeviceInfo(AuthFsm *authFsm, MessagePara *para)
676 {
677     AuthSessionInfo *info = &authFsm->info;
678     if (ProcessDeviceInfoMessage(authFsm->authSeq, info, para->data, para->len) != SOFTBUS_OK) {
679         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "process device info msg fail.");
680         CompleteAuthSession(authFsm, SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL);
681         return;
682     }
683     info->isNodeInfoReceived = true;
684 
685     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
686         info->isCloseAckReceived = true; /* WiFi auth no need close ack, set true directly */
687         if (!info->isServer) {
688             LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
689             AuthManagerSetAuthPassed(authFsm->authSeq, info);
690             TryFinishAuthSession(authFsm);
691             return;
692         }
693         /* WIFI: server should response device info */
694         if (PostDeviceInfoMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
695             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "server: response device info fail.");
696             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
697             return;
698         }
699         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
700         AuthManagerSetAuthPassed(authFsm->authSeq, info);
701         TryFinishAuthSession(authFsm);
702         return;
703     }
704 
705     if (PostCloseAckMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
706         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "post close ack fail.");
707         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SEND_FAIL);
708         return;
709     }
710     if (info->isCloseAckReceived) {
711         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
712         AuthManagerSetAuthPassed(authFsm->authSeq, info);
713         TryFinishAuthSession(authFsm);
714     }
715 }
716 
HandleMsgRecvCloseAck(AuthFsm * authFsm,MessagePara * para)717 static void HandleMsgRecvCloseAck(AuthFsm *authFsm, MessagePara *para)
718 {
719     (void)para;
720     AuthSessionInfo *info = &authFsm->info;
721     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
722         "auth fsm[%" PRId64 "] recv close ack, isNodeInfoReceived=%d", authFsm->authSeq, info->isNodeInfoReceived);
723     info->isCloseAckReceived = true;
724     if (info->isNodeInfoReceived) {
725         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
726         AuthManagerSetAuthPassed(authFsm->authSeq, info);
727     } else {
728         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "close ack received before device info");
729     }
730     TryFinishAuthSession(authFsm);
731 }
732 
SyncDevInfoStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)733 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
734 {
735     MessagePara *msgPara = (MessagePara *)para;
736     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
737     if (authFsm == NULL) {
738         FreeMessagePara(msgPara);
739         return false;
740     }
741     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
742     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
743         "SyncDevInfoState: auth fsm[%" PRId64"] process message: %s", authFsm->authSeq, FsmMsgTypeToStr(msgType));
744     switch (msgType) {
745         case FSM_MSG_RECV_DEVICE_INFO:
746             HandleMsgRecvDeviceInfo(authFsm, msgPara);
747             break;
748         case FSM_MSG_RECV_CLOSE_ACK:
749             HandleMsgRecvCloseAck(authFsm, msgPara);
750             break;
751         case FSM_MSG_RECV_AUTH_DATA:
752             HandleMsgRecvAuthData(authFsm, msgPara);
753             break;
754         case FSM_MSG_AUTH_FINISH:
755             HandleMsgAuthFinish(authFsm, msgPara);
756             break;
757         default:
758             HandleCommonMsg(authFsm, msgType, msgPara);
759             break;
760     }
761     FreeMessagePara(msgPara);
762     SoftbusHitraceStop();
763     return true;
764 }
765 
GetAuthFsmByAuthSeq(int64_t authSeq)766 AuthFsm *GetAuthFsmByAuthSeq(int64_t authSeq)
767 {
768     AuthFsm *item = NULL;
769     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
770         if (item->authSeq != authSeq) {
771             continue;
772         }
773         if (item->isDead) {
774             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
775                 "auth fsm[%" PRId64 "] has dead.", item->authSeq);
776             break;
777         }
778         return item;
779     }
780     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%" PRId64 "] not found.", authSeq);
781     return NULL;
782 }
783 
GetAuthFsmByConnId(uint64_t connId,bool isServer)784 AuthFsm *GetAuthFsmByConnId(uint64_t connId, bool isServer)
785 {
786     AuthFsm *item = NULL;
787     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
788         if (item->info.connId != connId || item->info.isServer != isServer) {
789             continue;
790         }
791         if (item->isDead) {
792             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
793                 "auth fsm[%" PRId64 "] has dead.", item->authSeq);
794             break;
795         }
796         return item;
797     }
798     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
799         "auth fsm not found by " CONN_INFO, CONN_DATA(connId));
800     return NULL;
801 }
802 
GetSessionInfoFromAuthFsm(int64_t authSeq,AuthSessionInfo * info)803 static int32_t GetSessionInfoFromAuthFsm(int64_t authSeq, AuthSessionInfo *info)
804 {
805     if (!RequireAuthLock()) {
806         return SOFTBUS_LOCK_ERR;
807     }
808     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
809     if (authFsm == NULL) {
810         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%" PRId64 "] not found.", authSeq);
811         ReleaseAuthLock();
812         return SOFTBUS_ERR;
813     }
814     *info = authFsm->info;
815     info->deviceInfoData = NULL;
816     info->deviceInfoDataLen = 0;
817     ReleaseAuthLock();
818     return SOFTBUS_OK;
819 }
820 
PostMessageToAuthFsm(int32_t msgType,int64_t authSeq,const uint8_t * data,uint32_t len)821 static int32_t PostMessageToAuthFsm(int32_t msgType, int64_t authSeq, const uint8_t *data, uint32_t len)
822 {
823     MessagePara *para = NewMessagePara(data, len);
824     if (para == NULL) {
825         return SOFTBUS_MALLOC_ERR;
826     }
827     if (!RequireAuthLock()) {
828         SoftBusFree(para);
829         return SOFTBUS_LOCK_ERR;
830     }
831     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
832     if (authFsm == NULL) {
833         ReleaseAuthLock();
834         SoftBusFree(para);
835         return SOFTBUS_ERR;
836     }
837     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
838         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "post message to auth fsm fail.");
839         ReleaseAuthLock();
840         SoftBusFree(para);
841         return SOFTBUS_ERR;
842     }
843     ReleaseAuthLock();
844     return SOFTBUS_OK;
845 }
846 
PostMessageToAuthFsmByConnId(int32_t msgType,uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)847 static int32_t PostMessageToAuthFsmByConnId(int32_t msgType, uint64_t connId, bool isServer,
848     const uint8_t *data, uint32_t len)
849 {
850     MessagePara *para = NewMessagePara(data, len);
851     if (para == NULL) {
852         return SOFTBUS_MALLOC_ERR;
853     }
854     if (!RequireAuthLock()) {
855         SoftBusFree(para);
856         return SOFTBUS_LOCK_ERR;
857     }
858     AuthFsm *authFsm = GetAuthFsmByConnId(connId, isServer);
859     if (authFsm == NULL) {
860         ReleaseAuthLock();
861         SoftBusFree(para);
862         return SOFTBUS_ERR;
863     }
864     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
865         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "post message to auth fsm by connId fail.");
866         ReleaseAuthLock();
867         SoftBusFree(para);
868         return SOFTBUS_ERR;
869     }
870     ReleaseAuthLock();
871     return SOFTBUS_OK;
872 }
873 
SetAuthStartTime(AuthFsm * authFsm)874 static void SetAuthStartTime(AuthFsm *authFsm)
875 {
876     authFsm->statisticData.startAuthTime = LnnUpTimeMs();
877 }
878 
AuthSessionStartAuth(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer)879 NO_SANITIZE("cfi") int32_t AuthSessionStartAuth(int64_t authSeq, uint32_t requestId,
880     uint64_t connId, const AuthConnInfo *connInfo, bool isServer)
881 {
882     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
883     if (!RequireAuthLock()) {
884         return SOFTBUS_LOCK_ERR;
885     }
886     AuthFsm *authFsm = CreateAuthFsm(authSeq, requestId, connId, connInfo, isServer);
887     if (authFsm == NULL) {
888         ReleaseAuthLock();
889         return SOFTBUS_MEM_ERR;
890     }
891     if (LnnFsmStart(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID) != SOFTBUS_OK) {
892         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "start auth fsm[%" PRId64 "]", authFsm->authSeq);
893         DestroyAuthFsm(authFsm);
894         ReleaseAuthLock();
895         return SOFTBUS_ERR;
896     }
897     SetAuthStartTime(authFsm);
898     LnnFsmPostMessageDelay(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT, NULL, AUTH_TIMEOUT_MS);
899     ReleaseAuthLock();
900     return SOFTBUS_OK;
901 }
902 
AuthSessionProcessDevIdData(int64_t authSeq,const uint8_t * data,uint32_t len)903 NO_SANITIZE("cfi") int32_t AuthSessionProcessDevIdData(int64_t authSeq, const uint8_t *data, uint32_t len)
904 {
905     if (data == NULL) {
906         return SOFTBUS_INVALID_PARAM;
907     }
908     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_ID, authSeq, data, len);
909 }
910 
AuthSessionPostAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)911 NO_SANITIZE("cfi") int32_t AuthSessionPostAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
912 {
913     AuthSessionInfo info;
914     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
915         return SOFTBUS_ERR;
916     }
917     if (PostHichainAuthMessage(authSeq, &info, data, len) != SOFTBUS_OK) {
918         return SOFTBUS_AUTH_SYNC_DEVID_FAIL;
919     }
920     return SOFTBUS_OK;
921 }
922 
AuthSessionProcessAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)923 NO_SANITIZE("cfi") int32_t AuthSessionProcessAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
924 {
925     if (data == NULL) {
926         return SOFTBUS_INVALID_PARAM;
927     }
928     return PostMessageToAuthFsm(FSM_MSG_RECV_AUTH_DATA, authSeq, data, len);
929 }
930 
AuthSessionGetUdid(int64_t authSeq,char * udid,uint32_t size)931 NO_SANITIZE("cfi") int32_t AuthSessionGetUdid(int64_t authSeq, char *udid, uint32_t size)
932 {
933     if (udid == NULL) {
934         return SOFTBUS_INVALID_PARAM;
935     }
936     AuthSessionInfo info = {0};
937     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
938         return SOFTBUS_ERR;
939     }
940     if (memcpy_s(udid, size, info.udid, sizeof(info.udid)) != EOK) {
941         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy udid fail.");
942         return SOFTBUS_MEM_ERR;
943     }
944     return SOFTBUS_OK;
945 }
946 
AuthSessionSaveSessionKey(int64_t authSeq,const uint8_t * key,uint32_t len)947 NO_SANITIZE("cfi") int32_t AuthSessionSaveSessionKey(int64_t authSeq, const uint8_t *key, uint32_t len)
948 {
949     if (key == NULL) {
950         return SOFTBUS_INVALID_PARAM;
951     }
952     return PostMessageToAuthFsm(FSM_MSG_SAVE_SESSION_KEY, authSeq, key, len);
953 }
954 
AuthSessionHandleAuthFinish(int64_t authSeq)955 NO_SANITIZE("cfi") int32_t AuthSessionHandleAuthFinish(int64_t authSeq)
956 {
957     return PostMessageToAuthFsm(FSM_MSG_AUTH_FINISH, authSeq, NULL, 0);
958 }
959 
AuthSessionHandleAuthError(int64_t authSeq,int32_t reason)960 NO_SANITIZE("cfi") int32_t AuthSessionHandleAuthError(int64_t authSeq, int32_t reason)
961 {
962     return PostMessageToAuthFsm(FSM_MSG_AUTH_ERROR, authSeq, (uint8_t *)&reason, sizeof(reason));
963 }
964 
AuthSessionProcessDevInfoData(int64_t authSeq,const uint8_t * data,uint32_t len)965 NO_SANITIZE("cfi") int32_t AuthSessionProcessDevInfoData(int64_t authSeq, const uint8_t *data, uint32_t len)
966 {
967     if (data == NULL) {
968         return SOFTBUS_INVALID_PARAM;
969     }
970     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_INFO, authSeq, data, len);
971 }
972 
AuthSessionProcessCloseAck(int64_t authSeq,const uint8_t * data,uint32_t len)973 NO_SANITIZE("cfi") int32_t AuthSessionProcessCloseAck(int64_t authSeq, const uint8_t *data, uint32_t len)
974 {
975     if (data == NULL) {
976         return SOFTBUS_INVALID_PARAM;
977     }
978     return PostMessageToAuthFsm(FSM_MSG_RECV_CLOSE_ACK, authSeq, data, len);
979 }
980 
AuthSessionProcessDevInfoDataByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)981 NO_SANITIZE("cfi") int32_t AuthSessionProcessDevInfoDataByConnId(uint64_t connId, bool isServer, const uint8_t *data,
982     uint32_t len)
983 {
984     if (data == NULL) {
985         return SOFTBUS_INVALID_PARAM;
986     }
987     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_DEVICE_INFO, connId, isServer, data, len);
988 }
989 
AuthSessionProcessCloseAckByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)990 NO_SANITIZE("cfi") int32_t AuthSessionProcessCloseAckByConnId(uint64_t connId, bool isServer, const uint8_t *data,
991     uint32_t len)
992 {
993     if (data == NULL) {
994         return SOFTBUS_INVALID_PARAM;
995     }
996     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_CLOSE_ACK, connId, isServer, data, len);
997 }
998 
AuthSessionHandleDeviceNotTrusted(const char * udid)999 NO_SANITIZE("cfi") int32_t AuthSessionHandleDeviceNotTrusted(const char *udid)
1000 {
1001     if (udid == NULL || udid[0] == '\0') {
1002         return SOFTBUS_INVALID_PARAM;
1003     }
1004     if (!RequireAuthLock()) {
1005         return SOFTBUS_LOCK_ERR;
1006     }
1007     AuthFsm *item = NULL;
1008     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1009         if (strcmp(item->info.udid, udid) != 0) {
1010             continue;
1011         }
1012         if (item->isDead) {
1013             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
1014                 "auth fsm[%" PRId64 "] has dead.", item->authSeq);
1015             continue;
1016         }
1017         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_NOT_TRUSTED, NULL);
1018     }
1019     ReleaseAuthLock();
1020     return SOFTBUS_OK;
1021 }
1022 
AuthSessionHandleDeviceDisconnected(uint64_t connId)1023 NO_SANITIZE("cfi") int32_t AuthSessionHandleDeviceDisconnected(uint64_t connId)
1024 {
1025     if (!RequireAuthLock()) {
1026         return SOFTBUS_LOCK_ERR;
1027     }
1028     AuthFsm *item = NULL;
1029     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1030         if (item->info.connId != connId) {
1031             continue;
1032         }
1033         if (item->isDead) {
1034             ALOGE("auth fsm[%" PRId64 "] has dead.", item->authSeq);
1035             continue;
1036         }
1037         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_DISCONNECTED, NULL);
1038     }
1039     ReleaseAuthLock();
1040     return SOFTBUS_OK;
1041 }
1042 
AuthSessionFsmExit(void)1043 NO_SANITIZE("cfi") void AuthSessionFsmExit(void)
1044 {
1045     HichainDestroy();
1046     if (!RequireAuthLock()) {
1047         return;
1048     }
1049     AuthFsm *item = NULL;
1050     AuthFsm *next = NULL;
1051     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authFsmList, AuthFsm, node) {
1052         DestroyAuthFsm(item);
1053     }
1054     ListInit(&g_authFsmList);
1055     ReleaseAuthLock();
1056 }
1057