• 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_hichain.h"
22 #include "auth_manager.h"
23 #include "auth_session_message.h"
24 #include "softbus_adapter_mem.h"
25 
26 #define AUTH_TIMEOUT_MS (10 * 1000)
27 #define TO_AUTH_FSM(ptr) CONTAINER_OF(ptr, AuthFsm, fsm)
28 
29 typedef enum {
30     STATE_SYNC_DEVICE_ID = 0,
31     STATE_DEVICE_AUTH,
32     STATE_SYNC_DEVICE_INFO,
33     STATE_NUM_MAX
34 } AuthFsmStateIndex;
35 
36 typedef enum {
37     FSM_MSG_RECV_DEVICE_ID,
38     FSM_MSG_RECV_AUTH_DATA,
39     FSM_MSG_SAVE_SESSION_KEY,
40     FSM_MSG_AUTH_RESULT,
41     FSM_MSG_RECV_DEVICE_INFO,
42     FSM_MSG_RECV_CLOSE_ACK,
43     FSM_MSG_AUTH_TIMEOUT,
44     FSM_MSG_DEVICE_NOT_TRUSTED,
45     FSM_MSG_DEVICE_DISCONNECTED,
46 } StateMessageType;
47 
48 typedef struct {
49     uint32_t len;
50     uint8_t data[0];
51 } MessagePara;
52 
53 typedef struct {
54     int64_t param1;
55     bool param2;
56     AuthFsm *(*getFunc)(int64_t param1, bool param2);
57 } AuthFsmGetFunc;
58 
59 static ListNode g_authFsmList = { &g_authFsmList, &g_authFsmList };
60 
61 static void SyncDevIdStateEnter(FsmStateMachine *fsm);
62 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
63 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
64 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
65 static void AuthFsmDeinitCallback(FsmStateMachine *fsm);
66 
67 static FsmState g_states[STATE_NUM_MAX] = {
68     [STATE_SYNC_DEVICE_ID] = {
69         .enter = SyncDevIdStateEnter,
70         .process = SyncDevIdStateProcess,
71         .exit = NULL,
72     },
73     [STATE_DEVICE_AUTH] = {
74         .enter = NULL,
75         .process = DeviceAuthStateProcess,
76         .exit = NULL,
77     },
78     [STATE_SYNC_DEVICE_INFO] = {
79         .enter = NULL,
80         .process = SyncDevInfoStateProcess,
81         .exit = NULL,
82     },
83 };
84 
TranslateToAuthFsm(FsmStateMachine * fsm,int32_t msgType,MessagePara * para)85 static AuthFsm *TranslateToAuthFsm(FsmStateMachine *fsm, int32_t msgType, MessagePara *para)
86 {
87     if (fsm == NULL) {
88         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
89         return NULL;
90     }
91     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
92     if (authFsm == NULL) {
93         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "authFsm is null");
94         return NULL;
95     }
96     if (authFsm->isDead) {
97         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%"PRId64"] has dead", authFsm->authSeq);
98         return NULL;
99     }
100     /* check para */
101     if ((msgType != FSM_MSG_AUTH_TIMEOUT &&
102         msgType != FSM_MSG_DEVICE_NOT_TRUSTED &&
103         msgType != FSM_MSG_DEVICE_DISCONNECTED) && para == NULL) {
104         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid msgType: %d", msgType);
105         return NULL;
106     }
107     return authFsm;
108 }
109 
GetNextAuthFsmId(void)110 static uint32_t GetNextAuthFsmId(void)
111 {
112     static uint32_t authFsmId = 0;
113     return ++authFsmId;
114 }
115 
CreateAuthFsm(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer)116 static AuthFsm *CreateAuthFsm(int64_t authSeq, uint32_t requestId, uint64_t connId,
117     const AuthConnInfo *connInfo, bool isServer)
118 {
119     AuthFsm *authFsm = SoftBusCalloc(sizeof(AuthFsm));
120     if (authFsm == NULL) {
121         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc AuthFsm fail");
122         return NULL;
123     }
124     authFsm->id = GetNextAuthFsmId();
125     authFsm->authSeq = authSeq;
126     authFsm->info.requestId = requestId;
127     authFsm->info.isServer = isServer;
128     authFsm->info.connId = connId;
129     authFsm->info.connInfo = *connInfo;
130     if (sprintf_s(authFsm->fsmName, sizeof(authFsm->fsmName), "AuthFsm-%u", authFsm->id) == -1) {
131         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "format auth fsm name fail");
132         SoftBusFree(authFsm);
133         return NULL;
134     }
135     if (LnnFsmInit(&authFsm->fsm, NULL, authFsm->fsmName, AuthFsmDeinitCallback) != SOFTBUS_OK) {
136         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "init fsm fail");
137         SoftBusFree(authFsm);
138         return NULL;
139     }
140     for (int32_t i = 0; i < STATE_NUM_MAX; ++i) {
141         LnnFsmAddState(&authFsm->fsm, &g_states[i]);
142     }
143     ListNodeInsert(&g_authFsmList, &authFsm->node);
144     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
145         "create auth fsm[%"PRId64"], name[%s], side[%s], reqId[%u], "CONN_INFO,
146         authFsm->authSeq, authFsm->fsmName, GetAuthSideStr(isServer), requestId, CONN_DATA(connId));
147     return authFsm;
148 }
149 
DestroyAuthFsm(AuthFsm * authFsm)150 static void DestroyAuthFsm(AuthFsm *authFsm)
151 {
152     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "destroy auth fsm[%"PRId64"], side[%s], reqId[%u]",
153         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), authFsm->info.requestId);
154     ListDelete(&authFsm->node);
155     if (authFsm->info.deviceInfoData != NULL) {
156         SoftBusFree(authFsm->info.deviceInfoData);
157         authFsm->info.deviceInfoData = NULL;
158     }
159     SoftBusFree(authFsm);
160 }
161 
AuthFsmDeinitCallback(FsmStateMachine * fsm)162 static void AuthFsmDeinitCallback(FsmStateMachine *fsm)
163 {
164     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth fsm deinit callback enter");
165     if (fsm == NULL) {
166         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
167         return;
168     }
169     if (!RequireAuthLock()) {
170         return;
171     }
172     DestroyAuthFsm(TO_AUTH_FSM(fsm));
173     ReleaseAuthLock();
174 }
175 
NewMessagePara(const uint8_t * data,uint32_t len)176 static MessagePara *NewMessagePara(const uint8_t *data, uint32_t len)
177 {
178     MessagePara *para = (MessagePara *)SoftBusCalloc(sizeof(MessagePara) + len);
179     if (para == NULL) {
180         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc ExchangeDataPara fail");
181         return NULL;
182     }
183     para->len = len;
184     if (memcpy_s(para->data, len, data, len) != EOK) {
185         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy data fail");
186         SoftBusFree(para);
187         return NULL;
188     }
189     return para;
190 }
191 
FreeMessagePara(MessagePara * para)192 static void FreeMessagePara(MessagePara *para)
193 {
194     if (para != NULL) {
195         SoftBusFree(para);
196     }
197 }
198 
CompleteAuthSession(AuthFsm * authFsm,int32_t result)199 static void CompleteAuthSession(AuthFsm *authFsm, int32_t result)
200 {
201     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "auth fsm[%"PRId64"] complete: side=%s, result=%d",
202         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), result);
203     LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
204 
205     if (result == SOFTBUS_OK) {
206         AuthManagerSetAuthPassed(authFsm->authSeq, &authFsm->info);
207     } else {
208         AuthManagerSetAuthFailed(authFsm->authSeq, &authFsm->info, result);
209     }
210 
211     authFsm->isDead = true;
212     LnnFsmStop(&authFsm->fsm);
213     LnnFsmDeinit(&authFsm->fsm);
214 }
215 
HandleCommonMsg(AuthFsm * authFsm,int32_t msgType,MessagePara * msgPara)216 static void HandleCommonMsg(AuthFsm *authFsm, int32_t msgType, MessagePara *msgPara)
217 {
218     (void)msgPara;
219     switch (msgType) {
220         case FSM_MSG_AUTH_TIMEOUT:
221             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%"PRId64"] timeout", authFsm->authSeq);
222             CompleteAuthSession(authFsm, SOFTBUS_AUTH_TIMEOUT);
223             break;
224         case FSM_MSG_DEVICE_NOT_TRUSTED:
225             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED);
226             break;
227         case FSM_MSG_DEVICE_DISCONNECTED:
228             CompleteAuthSession(authFsm, SOFTBUS_AUTH_DEVICE_DISCONNECTED);
229             break;
230         default:
231             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
232                 "auth fsm[%"PRId64"] cannot handle msg: %d", authFsm->authSeq, msgType);
233             break;
234         }
235 }
236 
SyncDevIdStateEnter(FsmStateMachine * fsm)237 static void SyncDevIdStateEnter(FsmStateMachine *fsm)
238 {
239     if (fsm == NULL) {
240         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "fsm is null");
241         return;
242     }
243     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
244     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
245         "SyncDevIdState: auth fsm[%"PRId64"] enter", authFsm->authSeq);
246     if (!authFsm->info.isServer) {
247         if (PostDeviceIdMessage(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
248             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
249         }
250     }
251 }
252 
HandleMsgRecvDeviceId(AuthFsm * authFsm,MessagePara * para)253 static void HandleMsgRecvDeviceId(AuthFsm *authFsm, MessagePara *para)
254 {
255     int32_t ret;
256     AuthSessionInfo *info = &authFsm->info;
257     do {
258         if (ProcessDeviceIdMessage(info, para->data, para->len) != SOFTBUS_OK) {
259             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
260             break;
261         }
262         if (info->isServer) {
263             if (PostDeviceIdMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
264                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
265                 break;
266             }
267         } else {
268             /* just client need start authDevice. */
269             if (HichainStartAuth(authFsm->authSeq, info->udid, info->connInfo.peerUid) != SOFTBUS_OK) {
270                 ret = SOFTBUS_AUTH_HICHAIN_AUTH_FAIL;
271                 break;
272             }
273         }
274         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
275         ret = SOFTBUS_OK;
276     } while (false);
277 
278     if (ret != SOFTBUS_OK) {
279         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "handle devId msg fail, ret=%d", ret);
280         CompleteAuthSession(authFsm, ret);
281     }
282 }
283 
SyncDevIdStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)284 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
285 {
286     MessagePara *msgPara = (MessagePara *)para;
287     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
288     if (authFsm == NULL) {
289         FreeMessagePara(msgPara);
290         return false;
291     }
292     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
293         "SyncDevIdState: auth fsm[%"PRId64"] process message: %d", authFsm->authSeq, msgType);
294     switch (msgType) {
295         case FSM_MSG_RECV_DEVICE_ID:
296             HandleMsgRecvDeviceId(authFsm, msgPara);
297             break;
298         default:
299             HandleCommonMsg(authFsm, msgType, msgPara);
300             break;
301     }
302     FreeMessagePara(msgPara);
303     return true;
304 }
305 
HandleMsgRecvAuthData(AuthFsm * authFsm,MessagePara * para)306 static void HandleMsgRecvAuthData(AuthFsm *authFsm, MessagePara *para)
307 {
308     if (HichainProcessData(authFsm->authSeq, para->data, para->len) != SOFTBUS_OK) {
309         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "process hichain data fail.");
310         CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL);
311     }
312 }
313 
HandleMsgSaveSessionKey(AuthFsm * authFsm,MessagePara * para)314 static void HandleMsgSaveSessionKey(AuthFsm *authFsm, MessagePara *para)
315 {
316     SessionKey sessionKey = {.len = para->len};
317     if (memcpy_s(sessionKey.value, sizeof(sessionKey.value), para->data, para->len) != EOK) {
318         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy session key fail.");
319         (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
320         return;
321     }
322     if (AuthManagerSetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey) != SOFTBUS_OK) {
323         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
324             "auth fsm[%"PRId64"] save session key fail", authFsm->authSeq);
325     }
326     (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
327 }
328 
TrySyncDeviceInfo(int64_t authSeq,AuthSessionInfo * info)329 static int32_t TrySyncDeviceInfo(int64_t authSeq, AuthSessionInfo *info)
330 {
331     switch (info->connInfo.type) {
332         case AUTH_LINK_TYPE_WIFI:
333             /* WIFI: client firstly send device info, server just reponse it. */
334             if (!info->isServer) {
335                 return PostDeviceInfoMessage(authSeq, info);
336             }
337             return SOFTBUS_OK;
338         case AUTH_LINK_TYPE_BR:
339         case AUTH_LINK_TYPE_BLE:
340         case AUTH_LINK_TYPE_P2P:
341             return PostDeviceInfoMessage(authSeq, info);
342         default:
343             break;
344     }
345     return SOFTBUS_ERR;
346 }
347 
HandleMsgAuthResult(AuthFsm * authFsm,MessagePara * para)348 static void HandleMsgAuthResult(AuthFsm *authFsm, MessagePara *para)
349 {
350     int32_t result = *((int32_t *)(para->data));
351     if (result != SOFTBUS_OK) {
352         CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_AUTH_ERROR);
353         return;
354     }
355     if (TrySyncDeviceInfo(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
356         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
357             "auth fsm[%"PRId64"] sync device info fail", authFsm->authSeq);
358         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
359         return;
360     }
361     if (authFsm->info.deviceInfoData != NULL) {
362         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
363             "auth fsm[%"PRId64"] dispatch device info to next state", authFsm->authSeq);
364         (void)AuthSessionProcessDevInfoData(authFsm->authSeq,
365             authFsm->info.deviceInfoData, authFsm->info.deviceInfoDataLen);
366         SoftBusFree(authFsm->info.deviceInfoData);
367         authFsm->info.deviceInfoData = NULL;
368     }
369     LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_INFO);
370 }
371 
HandleMsgRecvDevInfoEarly(AuthFsm * authFsm,MessagePara * para)372 static void HandleMsgRecvDevInfoEarly(AuthFsm *authFsm, MessagePara *para)
373 {
374     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
375         "auth fsm[%"PRId64"] recv device info early, save it", authFsm->authSeq);
376     AuthSessionInfo *info = &authFsm->info;
377     if (info->deviceInfoData != NULL) {
378         SoftBusFree(info->deviceInfoData);
379         info->deviceInfoData = NULL;
380     }
381     info->deviceInfoData = DupMemBuffer(para->data, para->len);
382     if (info->deviceInfoData == NULL) {
383         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "dup device info fail.");
384         return;
385     }
386     info->deviceInfoDataLen = para->len;
387 }
388 
DeviceAuthStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)389 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
390 {
391     MessagePara *msgPara = (MessagePara *)para;
392     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
393     if (authFsm == NULL) {
394         FreeMessagePara(msgPara);
395         return false;
396     }
397     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
398         "DeviceAuthState: auth fsm[%"PRId64"] process message: %d", authFsm->authSeq, msgType);
399     switch (msgType) {
400         case FSM_MSG_RECV_AUTH_DATA:
401             HandleMsgRecvAuthData(authFsm, msgPara);
402             break;
403         case FSM_MSG_SAVE_SESSION_KEY:
404             HandleMsgSaveSessionKey(authFsm, msgPara);
405             break;
406         case FSM_MSG_AUTH_RESULT:
407             HandleMsgAuthResult(authFsm, msgPara);
408             break;
409         case FSM_MSG_RECV_DEVICE_INFO:
410             HandleMsgRecvDevInfoEarly(authFsm, msgPara);
411             break;
412         default:
413             HandleCommonMsg(authFsm, msgType, msgPara);
414             break;
415     }
416     FreeMessagePara(msgPara);
417     return true;
418 }
419 
HandleMsgRecvDeviceInfo(AuthFsm * authFsm,MessagePara * para)420 static void HandleMsgRecvDeviceInfo(AuthFsm *authFsm, MessagePara *para)
421 {
422     AuthSessionInfo *info = &authFsm->info;
423     if (ProcessDeviceInfoMessage(authFsm->authSeq, info, para->data, para->len) != SOFTBUS_OK) {
424         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "process device info msg fail.");
425         CompleteAuthSession(authFsm, SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL);
426         return;
427     }
428     info->isNodeInfoReceived = true;
429 
430     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
431         if (!info->isServer) {
432             CompleteAuthSession(authFsm, SOFTBUS_OK);
433             return;
434         }
435         /* WIFI: server should response device info */
436         if (PostDeviceInfoMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
437             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "server: response device info fail.");
438             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
439             return;
440         }
441         CompleteAuthSession(authFsm, SOFTBUS_OK);
442         return;
443     }
444 
445     if (PostCloseAckMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
446         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "post close ack fail.");
447         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SEND_FAIL);
448         return;
449     }
450     if (info->isCloseAckReceived) {
451         CompleteAuthSession(authFsm, SOFTBUS_OK);
452     }
453 }
454 
HandleMsgRecvCloseAck(AuthFsm * authFsm,MessagePara * para)455 static void HandleMsgRecvCloseAck(AuthFsm *authFsm, MessagePara *para)
456 {
457     (void)para;
458     AuthSessionInfo *info = &authFsm->info;
459     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
460         "auth fsm[%"PRId64"] recv close ack, isNodeInfoReceived=%d", authFsm->authSeq, info->isNodeInfoReceived);
461     if (info->isNodeInfoReceived) {
462         CompleteAuthSession(authFsm, SOFTBUS_OK);
463     } else {
464         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "close ack received before device info");
465         info->isCloseAckReceived = true;
466     }
467 }
468 
SyncDevInfoStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)469 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
470 {
471     MessagePara *msgPara = (MessagePara *)para;
472     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
473     if (authFsm == NULL) {
474         FreeMessagePara(msgPara);
475         return false;
476     }
477     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
478         "SyncDevInfoState: auth fsm[%"PRId64"] process message: %d", authFsm->authSeq, msgType);
479     switch (msgType) {
480         case FSM_MSG_RECV_DEVICE_INFO:
481             HandleMsgRecvDeviceInfo(authFsm, msgPara);
482             break;
483         case FSM_MSG_RECV_CLOSE_ACK:
484             HandleMsgRecvCloseAck(authFsm, msgPara);
485             break;
486         default:
487             HandleCommonMsg(authFsm, msgType, msgPara);
488             break;
489     }
490     FreeMessagePara(msgPara);
491     return true;
492 }
493 
GetAuthFsmByAuthSeq(int64_t authSeq)494 static AuthFsm *GetAuthFsmByAuthSeq(int64_t authSeq)
495 {
496     AuthFsm *item = NULL;
497     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
498         if (item->authSeq != authSeq) {
499             continue;
500         }
501         if (item->isDead) {
502             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
503                 "auth fsm[%"PRId64"] has dead.", item->authSeq);
504             break;
505         }
506         return item;
507     }
508     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%"PRId64"] not found.", authSeq);
509     return NULL;
510 }
511 
GetAuthFsmByConnId(uint64_t connId,bool isServer)512 static AuthFsm *GetAuthFsmByConnId(uint64_t connId, bool isServer)
513 {
514     AuthFsm *item = NULL;
515     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
516         if (item->info.connId != connId || item->info.isServer != isServer) {
517             continue;
518         }
519         if (item->isDead) {
520             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
521                 "auth fsm[%"PRId64"] has dead.", item->authSeq);
522             break;
523         }
524         return item;
525     }
526     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
527         "auth fsm not found by "CONN_INFO, CONN_DATA(connId));
528     return NULL;
529 }
530 
GetSessionInfoFromAuthFsm(int64_t authSeq,AuthSessionInfo * info)531 static int32_t GetSessionInfoFromAuthFsm(int64_t authSeq, AuthSessionInfo *info)
532 {
533     if (!RequireAuthLock()) {
534         return SOFTBUS_LOCK_ERR;
535     }
536     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
537     if (authFsm == NULL) {
538         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth fsm[%"PRId64"] not found.", authSeq);
539         ReleaseAuthLock();
540         return SOFTBUS_ERR;
541     }
542     *info = authFsm->info;
543     info->deviceInfoData = NULL;
544     info->deviceInfoDataLen = 0;
545     ReleaseAuthLock();
546     return SOFTBUS_OK;
547 }
548 
PostMessageToAuthFsm(int32_t msgType,int64_t authSeq,const uint8_t * data,uint32_t len)549 static int32_t PostMessageToAuthFsm(int32_t msgType, int64_t authSeq, const uint8_t *data, uint32_t len)
550 {
551     MessagePara *para = NewMessagePara(data, len);
552     if (para == NULL) {
553         return SOFTBUS_MALLOC_ERR;
554     }
555     if (!RequireAuthLock()) {
556         SoftBusFree(para);
557         return SOFTBUS_LOCK_ERR;
558     }
559     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
560     if (authFsm == NULL) {
561         ReleaseAuthLock();
562         SoftBusFree(para);
563         return SOFTBUS_ERR;
564     }
565     LnnFsmPostMessage(&authFsm->fsm, msgType, para);
566     ReleaseAuthLock();
567     return SOFTBUS_OK;
568 }
569 
PostMessageToAuthFsmByConnId(int32_t msgType,uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)570 static int32_t PostMessageToAuthFsmByConnId(int32_t msgType, uint64_t connId, bool isServer,
571     const uint8_t *data, uint32_t len)
572 {
573     MessagePara *para = NewMessagePara(data, len);
574     if (para == NULL) {
575         return SOFTBUS_MALLOC_ERR;
576     }
577     if (!RequireAuthLock()) {
578         SoftBusFree(para);
579         return SOFTBUS_LOCK_ERR;
580     }
581     AuthFsm *authFsm = GetAuthFsmByConnId(connId, isServer);
582     if (authFsm == NULL) {
583         ReleaseAuthLock();
584         SoftBusFree(para);
585         return SOFTBUS_ERR;
586     }
587     LnnFsmPostMessage(&authFsm->fsm, msgType, para);
588     ReleaseAuthLock();
589     return SOFTBUS_OK;
590 }
591 
AuthSessionStartAuth(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer)592 int32_t AuthSessionStartAuth(int64_t authSeq, uint32_t requestId,
593     uint64_t connId, const AuthConnInfo *connInfo, bool isServer)
594 {
595     CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
596     if (!RequireAuthLock()) {
597         return SOFTBUS_LOCK_ERR;
598     }
599     AuthFsm *authFsm = CreateAuthFsm(authSeq, requestId, connId, connInfo, isServer);
600     if (authFsm == NULL) {
601         ReleaseAuthLock();
602         return SOFTBUS_MEM_ERR;
603     }
604     if (LnnFsmStart(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID) != SOFTBUS_OK) {
605         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "start auth fsm[%"PRId64"]", authFsm->authSeq);
606         DestroyAuthFsm(authFsm);
607         ReleaseAuthLock();
608         return SOFTBUS_ERR;
609     }
610     LnnFsmPostMessageDelay(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT, NULL, AUTH_TIMEOUT_MS);
611     ReleaseAuthLock();
612     return SOFTBUS_OK;
613 }
614 
AuthSessionProcessDevIdData(int64_t authSeq,const uint8_t * data,uint32_t len)615 int32_t AuthSessionProcessDevIdData(int64_t authSeq, const uint8_t *data, uint32_t len)
616 {
617     if (data == NULL) {
618         return SOFTBUS_INVALID_PARAM;
619     }
620     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_ID, authSeq, data, len);
621 }
622 
AuthSessionPostAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)623 int32_t AuthSessionPostAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
624 {
625     AuthSessionInfo info;
626     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
627         return SOFTBUS_ERR;
628     }
629     if (PostHichainAuthMessage(authSeq, &info, data, len) != SOFTBUS_OK) {
630         return SOFTBUS_AUTH_SYNC_DEVID_FAIL;
631     }
632     return SOFTBUS_OK;
633 }
634 
AuthSessionProcessAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)635 int32_t AuthSessionProcessAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
636 {
637     if (data == NULL) {
638         return SOFTBUS_INVALID_PARAM;
639     }
640     return PostMessageToAuthFsm(FSM_MSG_RECV_AUTH_DATA, authSeq, data, len);
641 }
642 
AuthSessionGetUdid(int64_t authSeq,char * udid,uint32_t size)643 int32_t AuthSessionGetUdid(int64_t authSeq, char *udid, uint32_t size)
644 {
645     if (udid == NULL) {
646         return SOFTBUS_INVALID_PARAM;
647     }
648     AuthSessionInfo info = {0};
649     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
650         return SOFTBUS_ERR;
651     }
652     if (memcpy_s(udid, size, info.udid, sizeof(info.udid)) != EOK) {
653         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy udid fail.");
654         return SOFTBUS_MEM_ERR;
655     }
656     return SOFTBUS_OK;
657 }
658 
AuthSessionSaveSessionKey(int64_t authSeq,const uint8_t * key,uint32_t len)659 int32_t AuthSessionSaveSessionKey(int64_t authSeq, const uint8_t *key, uint32_t len)
660 {
661     if (key == NULL) {
662         return SOFTBUS_INVALID_PARAM;
663     }
664     return PostMessageToAuthFsm(FSM_MSG_SAVE_SESSION_KEY, authSeq, key, len);
665 }
666 
AuthSessionHandleAuthResult(int64_t authSeq,int32_t reason)667 int32_t AuthSessionHandleAuthResult(int64_t authSeq, int32_t reason)
668 {
669     return PostMessageToAuthFsm(FSM_MSG_AUTH_RESULT, authSeq, (uint8_t *)&reason, sizeof(reason));
670 }
671 
AuthSessionProcessDevInfoData(int64_t authSeq,const uint8_t * data,uint32_t len)672 int32_t AuthSessionProcessDevInfoData(int64_t authSeq, const uint8_t *data, uint32_t len)
673 {
674     if (data == NULL) {
675         return SOFTBUS_INVALID_PARAM;
676     }
677     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_INFO, authSeq, data, len);
678 }
679 
AuthSessionProcessCloseAck(int64_t authSeq,const uint8_t * data,uint32_t len)680 int32_t AuthSessionProcessCloseAck(int64_t authSeq, const uint8_t *data, uint32_t len)
681 {
682     if (data == NULL) {
683         return SOFTBUS_INVALID_PARAM;
684     }
685     return PostMessageToAuthFsm(FSM_MSG_RECV_CLOSE_ACK, authSeq, data, len);
686 }
687 
AuthSessionProcessDevInfoDataByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)688 int32_t AuthSessionProcessDevInfoDataByConnId(uint64_t connId, bool isServer, const uint8_t *data, uint32_t len)
689 {
690     if (data == NULL) {
691         return SOFTBUS_INVALID_PARAM;
692     }
693     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_DEVICE_INFO, connId, isServer, data, len);
694 }
695 
AuthSessionProcessCloseAckByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)696 int32_t AuthSessionProcessCloseAckByConnId(uint64_t connId, bool isServer, const uint8_t *data, uint32_t len)
697 {
698     if (data == NULL) {
699         return SOFTBUS_INVALID_PARAM;
700     }
701     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_CLOSE_ACK, connId, isServer, data, len);
702 }
703 
AuthSessionHandleDeviceNotTrusted(const char * udid)704 int32_t AuthSessionHandleDeviceNotTrusted(const char *udid)
705 {
706     if (udid == NULL || udid[0] == '\0') {
707         return SOFTBUS_INVALID_PARAM;
708     }
709     if (!RequireAuthLock()) {
710         return SOFTBUS_LOCK_ERR;
711     }
712     AuthFsm *item = NULL;
713     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
714         if (strcmp(item->info.udid, udid) != 0) {
715             continue;
716         }
717         if (item->isDead) {
718             SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR,
719                 "auth fsm[%"PRId64"] has dead.", item->authSeq);
720             continue;
721         }
722         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_NOT_TRUSTED, NULL);
723     }
724     ReleaseAuthLock();
725     return SOFTBUS_OK;
726 }
727 
AuthSessionHandleDeviceDisconnected(uint64_t connId)728 int32_t AuthSessionHandleDeviceDisconnected(uint64_t connId)
729 {
730     if (!RequireAuthLock()) {
731         return SOFTBUS_LOCK_ERR;
732     }
733     AuthFsm *item = NULL;
734     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
735         if (item->info.connId != connId) {
736             continue;
737         }
738         if (item->isDead) {
739             ALOGE("auth fsm[%"PRId64"] has dead.", item->authSeq);
740             continue;
741         }
742         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_DISCONNECTED, NULL);
743     }
744     ReleaseAuthLock();
745     return SOFTBUS_OK;
746 }
747 
AuthSessionFsmExit(void)748 void AuthSessionFsmExit(void)
749 {
750     HichainDestroy();
751     if (!RequireAuthLock()) {
752         return;
753     }
754     AuthFsm *item = NULL;
755     AuthFsm *next = NULL;
756     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authFsmList, AuthFsm, node) {
757         DestroyAuthFsm(item);
758     }
759     ListInit(&g_authFsmList);
760     ReleaseAuthLock();
761 }
762