• 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 "anonymizer.h"
21 #include "auth_connection.h"
22 #include "auth_device_common_key.h"
23 #include "auth_hichain.h"
24 #include "auth_log.h"
25 #include "auth_manager.h"
26 #include "auth_request.h"
27 #include "auth_session_message.h"
28 #include "bus_center_manager.h"
29 #include "lnn_event.h"
30 #include "softbus_adapter_hitrace.h"
31 #include "softbus_adapter_mem.h"
32 #include "softbus_def.h"
33 
34 #define AUTH_TIMEOUT_MS (10 * 1000)
35 #define TO_AUTH_FSM(ptr) CONTAINER_OF(ptr, AuthFsm, fsm)
36 #define SHORT_UDID_HASH_LEN 8
37 #define SHORT_UDID_HASH_HEX_LEN 16
38 
39 typedef enum {
40     STATE_SYNC_DEVICE_ID = 0,
41     STATE_DEVICE_AUTH,
42     STATE_SYNC_DEVICE_INFO,
43     STATE_NUM_MAX
44 } AuthFsmStateIndex;
45 
46 typedef enum {
47     FSM_MSG_RECV_DEVICE_ID,
48     FSM_MSG_RECV_AUTH_DATA,
49     FSM_MSG_SAVE_SESSION_KEY,
50     FSM_MSG_AUTH_ERROR,
51     FSM_MSG_RECV_DEVICE_INFO,
52     FSM_MSG_RECV_CLOSE_ACK,
53     FSM_MSG_AUTH_FINISH,
54     FSM_MSG_AUTH_TIMEOUT,
55     FSM_MSG_DEVICE_NOT_TRUSTED,
56     FSM_MSG_DEVICE_DISCONNECTED,
57     FSM_MSG_UNKNOWN,
58 } StateMessageType;
59 typedef struct {
60     StateMessageType type;
61     char *msg;
62 } StateMsgMap;
63 
64 static const StateMsgMap g_StateMsgMap[] = {
65     {FSM_MSG_RECV_DEVICE_ID, (char *)"RECV_DEVICE_ID"},
66     {FSM_MSG_RECV_AUTH_DATA, (char *)"RECV_AUTH_DATA"},
67     {FSM_MSG_SAVE_SESSION_KEY, (char *)"SAVE_SESSION_KEY"},
68     {FSM_MSG_AUTH_ERROR, (char *)"AUTH_ERROR"},
69     {FSM_MSG_RECV_DEVICE_INFO, (char *)"RECV_DEVICE_INFO"},
70     {FSM_MSG_RECV_CLOSE_ACK, (char *)"RECV_CLOSE_ACK"},
71     {FSM_MSG_AUTH_FINISH, (char *)"AUTH_FINISH"},
72     {FSM_MSG_AUTH_TIMEOUT, (char *)"AUTH_TIMEOUT"},
73     {FSM_MSG_DEVICE_NOT_TRUSTED, (char *)"DEVICE_NOT_TRUSTED"},
74     {FSM_MSG_DEVICE_DISCONNECTED, (char *)"DEVICE_DISCONNECTED"},
75     {FSM_MSG_UNKNOWN, (char *)"UNKNOWN MSG!!"},
76 };
77 
78 typedef struct {
79     uint32_t len;
80     uint8_t data[0];
81 } MessagePara;
82 
83 typedef struct {
84     int64_t param1;
85     bool param2;
86     AuthFsm *(*getFunc)(int64_t param1, bool param2);
87 } AuthFsmGetFunc;
88 
89 static ListNode g_authFsmList = { &g_authFsmList, &g_authFsmList };
90 
91 static void SyncDevIdStateEnter(FsmStateMachine *fsm);
92 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
93 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
94 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para);
95 static void AuthFsmDeinitCallback(FsmStateMachine *fsm);
96 
97 static FsmState g_states[STATE_NUM_MAX] = {
98     [STATE_SYNC_DEVICE_ID] = {
99         .enter = SyncDevIdStateEnter,
100         .process = SyncDevIdStateProcess,
101         .exit = NULL,
102     },
103     [STATE_DEVICE_AUTH] = {
104         .enter = NULL,
105         .process = DeviceAuthStateProcess,
106         .exit = NULL,
107     },
108     [STATE_SYNC_DEVICE_INFO] = {
109         .enter = NULL,
110         .process = SyncDevInfoStateProcess,
111         .exit = NULL,
112     },
113 };
114 
FsmMsgTypeToStr(int32_t type)115 static char *FsmMsgTypeToStr(int32_t type)
116 {
117     if (type < FSM_MSG_RECV_DEVICE_ID || type > FSM_MSG_DEVICE_DISCONNECTED) {
118         return g_StateMsgMap[FSM_MSG_UNKNOWN].msg;
119     }
120     return g_StateMsgMap[type].msg;
121 }
122 
TranslateToAuthFsm(FsmStateMachine * fsm,int32_t msgType,MessagePara * para)123 static AuthFsm *TranslateToAuthFsm(FsmStateMachine *fsm, int32_t msgType, MessagePara *para)
124 {
125     if (fsm == NULL) {
126         AUTH_LOGE(AUTH_FSM, "fsm is null");
127         return NULL;
128     }
129     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
130     if (authFsm == NULL) {
131         AUTH_LOGE(AUTH_FSM, "authFsm is null");
132         return NULL;
133     }
134     if (authFsm->isDead) {
135         AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", authFsm->authSeq);
136         return NULL;
137     }
138     /* check para */
139     if ((msgType != FSM_MSG_AUTH_TIMEOUT &&
140         msgType != FSM_MSG_DEVICE_NOT_TRUSTED &&
141         msgType != FSM_MSG_DEVICE_DISCONNECTED) && para == NULL) {
142         AUTH_LOGE(AUTH_FSM, "invalid msgType. msgType=%{public}d", msgType);
143         return NULL;
144     }
145     return authFsm;
146 }
147 
GetNextAuthFsmId(void)148 static uint32_t GetNextAuthFsmId(void)
149 {
150     static uint32_t authFsmId = 0;
151     return ++authFsmId;
152 }
153 
IsNeedExchangeNetworkId(uint32_t feature,AuthCapability capaBit)154 static bool IsNeedExchangeNetworkId(uint32_t feature, AuthCapability capaBit)
155 {
156     return ((feature & (1 << (uint32_t)capaBit)) != 0);
157 }
158 
AddUdidInfo(uint32_t requestId,bool isServer,AuthConnInfo * connInfo)159 static void AddUdidInfo(uint32_t requestId, bool isServer, AuthConnInfo *connInfo)
160 {
161     if (isServer || connInfo->type != AUTH_LINK_TYPE_ENHANCED_P2P) {
162         AUTH_LOGD(AUTH_FSM, "is not server or enhancedP2p");
163         return;
164     }
165     AuthRequest request;
166     (void)memset_s(&request, sizeof(request), 0, sizeof(request));
167     if (GetAuthRequestNoLock(requestId, &request) != SOFTBUS_OK) {
168         AUTH_LOGE(AUTH_FSM, "get auth request fail");
169         return;
170     }
171     if (strcpy_s(connInfo->info.ipInfo.udid, UDID_BUF_LEN,
172         request.connInfo.info.ipInfo.udid) != EOK) {
173         AUTH_LOGE(AUTH_FSM, "strcpy udid fail");
174         return;
175     }
176 }
177 
ProcAuthFsm(uint32_t requestId,bool isServer,AuthFsm * authFsm)178 static int32_t ProcAuthFsm(uint32_t requestId, bool isServer, AuthFsm *authFsm)
179 {
180     AuthRequest request;
181     NodeInfo nodeInfo;
182     (void)memset_s(&request, sizeof(request), 0, sizeof(request));
183     (void)memset_s(&nodeInfo, sizeof(nodeInfo), 0, sizeof(nodeInfo));
184     AddUdidInfo(requestId, isServer, &authFsm->info.connInfo);
185     if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE) {
186         if (GetAuthRequestNoLock(requestId, &request) != SOFTBUS_OK) {
187             AUTH_LOGE(AUTH_FSM, "get auth request fail");
188             return SOFTBUS_ERR;
189         }
190         char udidHash[SHORT_UDID_HASH_HEX_LEN + 1] = {0};
191         int32_t ret = ConvertBytesToHexString(udidHash, SHORT_UDID_HASH_HEX_LEN + 1,
192             (const unsigned char *)request.connInfo.info.bleInfo.deviceIdHash, SHORT_UDID_HASH_LEN);
193         if (ret == SOFTBUS_OK && LnnRetrieveDeviceInfo((const char *)udidHash, &nodeInfo) == SOFTBUS_OK &&
194             IsNeedExchangeNetworkId(nodeInfo.authCapacity, BIT_SUPPORT_EXCHANGE_NETWORKID)) {
195             AUTH_LOGI(AUTH_FSM, "LnnRetrieveDeviceInfo success");
196             authFsm->info.idType = EXCHANGE_NETWORKID;
197         }
198     }
199     return SOFTBUS_OK;
200 }
201 
CreateAuthFsm(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer)202 static AuthFsm *CreateAuthFsm(int64_t authSeq, uint32_t requestId, uint64_t connId,
203     const AuthConnInfo *connInfo, bool isServer)
204 {
205     AuthFsm *authFsm = (AuthFsm *)SoftBusCalloc(sizeof(AuthFsm));
206     if (authFsm == NULL) {
207         AUTH_LOGE(AUTH_FSM, "malloc AuthFsm fail");
208         return NULL;
209     }
210     authFsm->id = GetNextAuthFsmId();
211     authFsm->authSeq = authSeq;
212     authFsm->info.requestId = requestId;
213     authFsm->info.isServer = isServer;
214     authFsm->info.connId = connId;
215     authFsm->info.connInfo = *connInfo;
216     authFsm->info.version = SOFTBUS_NEW_V2;
217     authFsm->info.idType = EXCHANHE_UDID;
218     if (!isServer) {
219         if (ProcAuthFsm(requestId, isServer, authFsm) != SOFTBUS_OK) {
220             SoftBusFree(authFsm);
221             return NULL;
222         }
223     }
224     if (sprintf_s(authFsm->fsmName, sizeof(authFsm->fsmName), "AuthFsm-%u", authFsm->id) == -1) {
225         AUTH_LOGE(AUTH_FSM, "format auth fsm name fail");
226         SoftBusFree(authFsm);
227         return NULL;
228     }
229     if (LnnFsmInit(&authFsm->fsm, NULL, authFsm->fsmName, AuthFsmDeinitCallback) != SOFTBUS_OK) {
230         AUTH_LOGE(AUTH_FSM, "init fsm fail");
231         SoftBusFree(authFsm);
232         return NULL;
233     }
234     for (int32_t i = 0; i < STATE_NUM_MAX; ++i) {
235         LnnFsmAddState(&authFsm->fsm, &g_states[i]);
236     }
237     ListNodeInsert(&g_authFsmList, &authFsm->node);
238     AUTH_LOGI(AUTH_FSM,
239         "create auth fsm. authSeq=%{public}" PRId64 ", name=%{public}s, side=%{public}s, reqId=%{public}u, " CONN_INFO,
240         authFsm->authSeq, authFsm->fsmName, GetAuthSideStr(isServer), requestId, CONN_DATA(connId));
241     return authFsm;
242 }
243 
DestroyAuthFsm(AuthFsm * authFsm)244 static void DestroyAuthFsm(AuthFsm *authFsm)
245 {
246     AUTH_LOGI(AUTH_FSM, "destroy auth. authSeq=%{public}" PRId64 ", side=%{public}s, reqId=%{public}u",
247         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), authFsm->info.requestId);
248     ListDelete(&authFsm->node);
249     if (authFsm->info.deviceInfoData != NULL) {
250         SoftBusFree(authFsm->info.deviceInfoData);
251         authFsm->info.deviceInfoData = NULL;
252     }
253     SoftBusFree(authFsm);
254 }
255 
AuthFsmDeinitCallback(FsmStateMachine * fsm)256 static void AuthFsmDeinitCallback(FsmStateMachine *fsm)
257 {
258     AUTH_LOGI(AUTH_FSM, "auth fsm deinit callback enter");
259     if (fsm == NULL) {
260         AUTH_LOGE(AUTH_FSM, "fsm is null");
261         return;
262     }
263     if (!RequireAuthLock()) {
264         return;
265     }
266     DestroyAuthFsm(TO_AUTH_FSM(fsm));
267     ReleaseAuthLock();
268 }
269 
NewMessagePara(const uint8_t * data,uint32_t len)270 static MessagePara *NewMessagePara(const uint8_t *data, uint32_t len)
271 {
272     MessagePara *para = (MessagePara *)SoftBusCalloc(sizeof(MessagePara) + len);
273     if (para == NULL) {
274         AUTH_LOGE(AUTH_FSM, "malloc ExchangeDataPara fail");
275         return NULL;
276     }
277     para->len = len;
278     if (data != NULL && len > 0 && memcpy_s(para->data, len, data, len) != EOK) {
279         AUTH_LOGE(AUTH_FSM, "copy data fail");
280         SoftBusFree(para);
281         return NULL;
282     }
283     return para;
284 }
285 
FreeMessagePara(MessagePara * para)286 static void FreeMessagePara(MessagePara *para)
287 {
288     if (para != NULL) {
289         SoftBusFree(para);
290     }
291 }
292 
ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)293 static SoftBusLinkType ConvertAuthLinkTypeToHisysEvtLinkType(AuthLinkType type)
294 {
295     switch (type) {
296         case AUTH_LINK_TYPE_WIFI:
297             return SOFTBUS_HISYSEVT_LINK_TYPE_WLAN;
298         case AUTH_LINK_TYPE_BR:
299             return SOFTBUS_HISYSEVT_LINK_TYPE_BR;
300         case AUTH_LINK_TYPE_BLE:
301             return SOFTBUS_HISYSEVT_LINK_TYPE_BLE;
302         case AUTH_LINK_TYPE_P2P:
303             return SOFTBUS_HISYSEVT_LINK_TYPE_P2P;
304         default:
305             return SOFTBUS_HISYSEVT_LINK_TYPE_BUTT;
306     }
307 }
308 
DfxRecordLnnAuthEnd(AuthFsm * authFsm,uint64_t costTime,int32_t reason)309 static void DfxRecordLnnAuthEnd(AuthFsm *authFsm, uint64_t costTime, int32_t reason)
310 {
311     LnnEventExtra extra = { 0 };
312     LnnEventExtraInit(&extra);
313     extra.errcode = reason;
314     extra.authCostTime = (int32_t)costTime;
315     extra.result = (reason == SOFTBUS_OK) ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED;
316 
317     if (authFsm != NULL) {
318         extra.authLinkType = authFsm->info.connInfo.type;
319         extra.authId = (int32_t)authFsm->authSeq;
320     }
321     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH, extra);
322 }
323 
ReportAuthResultEvt(AuthFsm * authFsm,int32_t result)324 static void ReportAuthResultEvt(AuthFsm *authFsm, int32_t result)
325 {
326     AUTH_LOGE(AUTH_FSM, "report auth result evt enter");
327     SoftBusLinkType linkType = ConvertAuthLinkTypeToHisysEvtLinkType(authFsm->info.connInfo.type);
328     if (linkType == SOFTBUS_HISYSEVT_LINK_TYPE_BUTT) {
329         return;
330     }
331     authFsm->statisticData.endAuthTime = LnnUpTimeMs();
332     uint64_t costTime = authFsm->statisticData.endAuthTime - authFsm->statisticData.startAuthTime;
333     DfxRecordLnnAuthEnd(authFsm, costTime, result);
334     AuthFailStage stage;
335     switch (result) {
336         case SOFTBUS_OK:
337             if (SoftBusRecordAuthResult(linkType, SOFTBUS_OK, costTime, AUTH_STAGE_BUTT) != SOFTBUS_OK) {
338                 AUTH_LOGE(AUTH_FSM, "report static auth result fail");
339             }
340             return;
341         case SOFTBUS_AUTH_SYNC_DEVID_FAIL:
342         case SOFTBUS_AUTH_SYNC_DEVINFO_FAIL:
343         case SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL:
344         case SOFTBUS_AUTH_SEND_FAIL:
345             stage = AUTH_EXCHANGE_STAGE;
346             break;
347         case SOFTBUS_AUTH_DEVICE_DISCONNECTED:
348             stage = AUTH_CONNECT_STAGE;
349             break;
350         case SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL:
351         case SOFTBUS_AUTH_HICHAIN_AUTH_ERROR:
352         case SOFTBUS_AUTH_TIMEOUT:
353         case SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED:
354             stage = AUTH_VERIFY_STAGE;
355             break;
356         default:
357             AUTH_LOGE(AUTH_FSM, "unsupport reasn=%{public}d.", result);
358             return;
359     }
360     if (SoftBusRecordAuthResult(linkType, SOFTBUS_ERR, costTime, stage) != SOFTBUS_OK) {
361         AUTH_LOGE(AUTH_FSM, "report static auth result fail");
362     }
363     SoftBusFaultEvtInfo info;
364     (void)memset_s(&info, sizeof(SoftBusFaultEvtInfo), 0, sizeof(SoftBusFaultEvtInfo));
365     info.moduleType = MODULE_TYPE_AUTH;
366     info.linkType = linkType;
367     info.errorCode = result;
368     if (SoftBusReportBusCenterFaultEvt(&info) != SOFTBUS_OK) {
369         AUTH_LOGE(AUTH_FSM, "report buscenter fault evt fail");
370     }
371 }
372 
SaveDeviceKey(AuthFsm * authFsm)373 static void SaveDeviceKey(AuthFsm *authFsm)
374 {
375     AuthDeviceKeyInfo deviceKey;
376     SessionKey sessionKey;
377     (void)memset_s(&deviceKey, sizeof(AuthDeviceKeyInfo), 0, sizeof(AuthDeviceKeyInfo));
378     (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
379     if (AuthManagerGetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey) != SOFTBUS_OK) {
380         AUTH_LOGE(AUTH_FSM, "get session key fail");
381         return;
382     }
383     if (memcpy_s(deviceKey.deviceKey, sizeof(deviceKey.deviceKey),
384         sessionKey.value, sizeof(sessionKey.value)) != EOK) {
385         AUTH_LOGE(AUTH_FSM, "session key cpy fail");
386         return;
387     }
388     deviceKey.keyLen = sessionKey.len;
389     deviceKey.keyIndex = authFsm->authSeq;
390     deviceKey.keyType = authFsm->info.connInfo.type;
391     deviceKey.isServerSide = authFsm->info.isServer;
392     if (AuthInsertDeviceKey(&authFsm->info.nodeInfo, &deviceKey) != SOFTBUS_OK) {
393         AUTH_LOGE(AUTH_FSM, "insert deviceKey fail");
394         return;
395     }
396 }
397 
CompleteAuthSession(AuthFsm * authFsm,int32_t result)398 static void CompleteAuthSession(AuthFsm *authFsm, int32_t result)
399 {
400     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
401     AUTH_LOGI(AUTH_FSM, "auth fsm complete. authSeq=%{public}" PRId64 ", side=%{public}s, result=%{public}d",
402         authFsm->authSeq, GetAuthSideStr(authFsm->info.isServer), result);
403     ReportAuthResultEvt(authFsm, result);
404     if (result == SOFTBUS_OK) {
405         AuthManagerSetAuthFinished(authFsm->authSeq, &authFsm->info);
406         if ((!authFsm->info.isSupportFastAuth) && (authFsm->info.connInfo.type == AUTH_LINK_TYPE_BLE)) {
407             AUTH_LOGI(AUTH_FSM, "only hichain verify, save the device key");
408             SaveDeviceKey(authFsm);
409         }
410     } else {
411         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
412         AuthManagerSetAuthFailed(authFsm->authSeq, &authFsm->info, result);
413     }
414 
415     authFsm->isDead = true;
416     LnnFsmStop(&authFsm->fsm);
417     LnnFsmDeinit(&authFsm->fsm);
418     SoftbusHitraceStop();
419 }
420 
HandleCommonMsg(AuthFsm * authFsm,int32_t msgType,MessagePara * msgPara)421 static void HandleCommonMsg(AuthFsm *authFsm, int32_t msgType, MessagePara *msgPara)
422 {
423     (void)msgPara;
424     switch (msgType) {
425         case FSM_MSG_AUTH_TIMEOUT:
426             AUTH_LOGE(AUTH_FSM, "auth fsm timeout. authSeq=%{public}" PRId64 "", authFsm->authSeq);
427             CompleteAuthSession(authFsm, SOFTBUS_AUTH_TIMEOUT);
428             break;
429         case FSM_MSG_DEVICE_NOT_TRUSTED:
430             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED);
431             break;
432         case FSM_MSG_DEVICE_DISCONNECTED:
433             if (authFsm->info.isNodeInfoReceived && authFsm->info.isCloseAckReceived) {
434                 AUTH_LOGW(AUTH_FSM,
435                     "auth fsm wait for the finish event, ignore this disconnect event. authSeq=%{public}" PRId64 "",
436                     authFsm->authSeq);
437                 /*
438                 * Note: Local hichain NOT onFinish, but remote hichain already onFinish
439                 *      Regard this situation as auth finish
440                 */
441                 CompleteAuthSession(authFsm, SOFTBUS_OK);
442                 break;
443             }
444             CompleteAuthSession(authFsm, SOFTBUS_AUTH_DEVICE_DISCONNECTED);
445             HichainCancelRequest(authFsm->authSeq);
446             break;
447         default:
448             AUTH_LOGE(AUTH_FSM,
449                 "auth fsm cannot handle msgType. authSeq=%{public}" PRId64 ", msgType=%{public}d",
450                 authFsm->authSeq, msgType);
451             break;
452     }
453 }
454 
SyncDevIdStateEnter(FsmStateMachine * fsm)455 static void SyncDevIdStateEnter(FsmStateMachine *fsm)
456 {
457     if (fsm == NULL) {
458         AUTH_LOGE(AUTH_FSM, "fsm is null");
459         return;
460     }
461     AuthFsm *authFsm = TO_AUTH_FSM(fsm);
462     if (authFsm == NULL) {
463         AUTH_LOGE(AUTH_FSM, "authFsm is null");
464         return;
465     }
466     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
467     AUTH_LOGI(AUTH_FSM, "SyncDevIdState: auth fsm enter. authSeq=%{public}" PRId64 "", authFsm->authSeq);
468     if (!authFsm->info.isServer) {
469         if (PostDeviceIdMessage(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
470             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVID_FAIL);
471         }
472     }
473     SoftbusHitraceStop();
474 }
475 
RecoveryDeviceKey(AuthFsm * authFsm)476 static int32_t RecoveryDeviceKey(AuthFsm *authFsm)
477 {
478 #define UDID_SHORT_HASH_LEN_TEMP 8
479 #define UDID_SHORT_HASH_HEX_STRING 17
480     AuthDeviceKeyInfo key = {0};
481     uint8_t hash[SHA_256_HASH_LEN] = {0};
482     int ret = SoftBusGenerateStrHash((uint8_t *)authFsm->info.udid, strlen(authFsm->info.udid), hash);
483     if (ret != SOFTBUS_OK) {
484         AUTH_LOGE(AUTH_FSM, "generate udidHash fail");
485         return ret;
486     }
487     char udidShortHash[UDID_SHORT_HASH_HEX_STRING] = {0};
488     if (ConvertBytesToUpperCaseHexString(udidShortHash, UDID_SHORT_HASH_HEX_STRING,
489         hash, UDID_SHORT_HASH_LEN_TEMP) != SOFTBUS_OK) {
490         AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
491         return SOFTBUS_ERR;
492     }
493     AuthLinkType linkType = authFsm->info.connInfo.type;
494     if (authFsm->info.connInfo.type == AUTH_LINK_TYPE_ENHANCED_P2P) {
495         // enhanced p2p reuse ble authKey
496         linkType = AUTH_LINK_TYPE_BLE;
497     }
498     if (AuthFindDeviceKey(udidShortHash, linkType, &key) != SOFTBUS_OK) {
499         AUTH_LOGE(AUTH_FSM, "find key fail, fastAuth error");
500         return SOFTBUS_ERR;
501     }
502     AuthUpdateKeyIndex(udidShortHash, authFsm->info.connInfo.type, authFsm->authSeq, authFsm->info.isServer);
503     authFsm->info.oldIndex = key.keyIndex;
504     ret = AuthSessionSaveSessionKey(authFsm->authSeq, key.deviceKey, key.keyLen);
505     if (ret != SOFTBUS_OK) {
506         AUTH_LOGE(AUTH_FSM, "post save sessionKey event");
507         return ret;
508     }
509     return AuthSessionHandleAuthFinish(authFsm->authSeq);
510 }
511 
AuditReportSetPeerDevInfo(LnnAuditExtra * lnnAuditExtra,AuthSessionInfo * info)512 static void AuditReportSetPeerDevInfo(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info)
513 {
514     if (lnnAuditExtra == NULL || info == NULL) {
515         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra or info is null");
516         return;
517     }
518     switch (info->connInfo.type) {
519         case AUTH_LINK_TYPE_BR:
520             if (strcpy_s((char *)lnnAuditExtra->peerBrMac, BT_MAC_LEN, info->connInfo.info.brInfo.brMac) != EOK) {
521                 AUTH_LOGE(AUTH_FSM, "BR MAC COPY ERROR");
522             }
523             break;
524         case AUTH_LINK_TYPE_BLE:
525             if (strcpy_s((char *)lnnAuditExtra->peerBleMac, BT_MAC_LEN, info->connInfo.info.bleInfo.bleMac) != EOK) {
526                 AUTH_LOGE(AUTH_FSM, "BLE MAC COPY ERROR");
527             }
528             break;
529         case AUTH_LINK_TYPE_WIFI:
530         case AUTH_LINK_TYPE_P2P:
531         case AUTH_LINK_TYPE_ENHANCED_P2P:
532             if (strcpy_s((char *)lnnAuditExtra->peerIp, IP_STR_MAX_LEN, info->connInfo.info.ipInfo.ip) != EOK) {
533                 AUTH_LOGE(AUTH_FSM, "IP COPY ERROR");
534             }
535             lnnAuditExtra->peerAuthPort = info->connInfo.info.ipInfo.port;
536             break;
537         default:
538             AUTH_LOGW(AUTH_FSM, "unknow param type!");
539             break;
540     }
541 }
542 
AuditReportSetLocalDevInfo(LnnAuditExtra * lnnAuditExtra)543 static void AuditReportSetLocalDevInfo(LnnAuditExtra *lnnAuditExtra)
544 {
545     if (lnnAuditExtra == NULL) {
546         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra is null");
547         return;
548     }
549     (void)LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, (char *)lnnAuditExtra->localIp, IP_LEN);
550     (void)LnnGetLocalStrInfo(STRING_KEY_BT_MAC, (char *)lnnAuditExtra->localBrMac, MAC_LEN);
551     (void)LnnGetLocalStrInfo(STRING_KEY_BLE_MAC, (char *)lnnAuditExtra->localBleMac, MAC_LEN);
552     (void)LnnGetLocalStrInfo(STRING_KEY_NETWORKID, (char *)lnnAuditExtra->localNetworkId, NETWORK_ID_BUF_LEN);
553     (void)LnnGetLocalStrInfo(STRING_KEY_DEV_NAME, (char *)lnnAuditExtra->localDevName, DEVICE_NAME_BUF_LEN);
554     (void)LnnGetLocalNumInfo(NUM_KEY_AUTH_PORT, &lnnAuditExtra->localAuthPort);
555     (void)LnnGetLocalNumInfo(NUM_KEY_PROXY_PORT, &lnnAuditExtra->localProxyPort);
556     (void)LnnGetLocalNumInfo(NUM_KEY_SESSION_PORT, &lnnAuditExtra->localSessionPort);
557     (void)LnnGetLocalNumInfo(NUM_KEY_DEV_TYPE_ID, &lnnAuditExtra->localDevType);
558     char udid[UDID_BUF_LEN] = {0};
559     uint8_t udidHash[SHA_256_HASH_LEN] = {0};
560     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, udid, UUID_BUF_LEN) != SOFTBUS_OK) {
561         AUTH_LOGE(AUTH_FSM, "get local udid fail");
562         return;
563     }
564     int32_t ret = SoftBusGenerateStrHash((const unsigned char *)udid, strlen(udid), udidHash);
565     if (ret != SOFTBUS_OK) {
566         AUTH_LOGE(AUTH_FSM, "generate udid hash fail");
567         return;
568     }
569     if (ConvertBytesToUpperCaseHexString((char *)lnnAuditExtra->localUdid, SHA_256_HEX_HASH_LEN,
570         udidHash, SHA_256_HASH_LEN) != SOFTBUS_OK) {
571         AUTH_LOGE(AUTH_FSM, "convert hash to upper hex str fail");
572     }
573 }
574 
BuildLnnAuditEvent(LnnAuditExtra * lnnAuditExtra,AuthSessionInfo * info,int32_t result,int32_t errCode,SoftbusAuditType auditType)575 static void BuildLnnAuditEvent(LnnAuditExtra *lnnAuditExtra, AuthSessionInfo *info, int32_t result,
576     int32_t errCode, SoftbusAuditType auditType)
577 {
578     if (lnnAuditExtra == NULL || info == NULL) {
579         AUTH_LOGE(AUTH_FSM, "lnnAuditExtra or info is null");
580         return;
581     }
582     (void)AuditReportSetPeerDevInfo(lnnAuditExtra, info);
583     (void)AuditReportSetLocalDevInfo(lnnAuditExtra);
584     lnnAuditExtra->result = result;
585     lnnAuditExtra->errCode = errCode;
586     lnnAuditExtra->auditType = auditType;
587     lnnAuditExtra->connId = info->connId;
588     lnnAuditExtra->authLinkType = info->connInfo.type;
589     lnnAuditExtra->authRequestId = info->requestId;
590     (void)LnnGetAllOnlineNodeNum(&(lnnAuditExtra->onlineNum));
591 }
592 
ClientSetExchangeIdType(AuthFsm * authFsm)593 static int32_t ClientSetExchangeIdType(AuthFsm *authFsm)
594 {
595     AuthSessionInfo *info = &authFsm->info;
596     if (info->idType == EXCHANGE_FAIL) {
597         AUTH_LOGE(AUTH_FSM, "fsm switch to reauth due to not find networkId");
598         info->idType = EXCHANHE_UDID;
599         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID);
600         return SOFTBUS_ERR;
601     }
602     return SOFTBUS_OK;
603 }
604 
HandleMsgRecvDeviceId(AuthFsm * authFsm,const MessagePara * para)605 static void HandleMsgRecvDeviceId(AuthFsm *authFsm, const MessagePara *para)
606 {
607     int32_t ret;
608     AuthSessionInfo *info = &authFsm->info;
609     do {
610         if (ProcessDeviceIdMessage(info, para->data, para->len) != SOFTBUS_OK) {
611             ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
612             LnnAuditExtra lnnAuditExtra = {0};
613             BuildLnnAuditEvent(&lnnAuditExtra, info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
614                 ret, AUDIT_EVENT_PACKETS_ERROR);
615             LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_DEV_ID, lnnAuditExtra);
616             break;
617         }
618         if (info->isServer) {
619             if (info->connInfo.type == AUTH_LINK_TYPE_BLE && strlen(info->udid) != 0 &&
620                 authFsm->info.connInfo.info.bleInfo.deviceIdHash[0] == '\0') {
621                 (void)SoftBusGenerateStrHash((unsigned char *)info->udid, strlen(info->nodeInfo.deviceInfo.deviceUdid),
622                     (unsigned char *)authFsm->info.connInfo.info.bleInfo.deviceIdHash);
623             }
624             if (PostDeviceIdMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
625                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
626                 break;
627             }
628         }
629         LnnFsmTransactState(&authFsm->fsm, g_states + STATE_DEVICE_AUTH);
630         if (info->isSupportFastAuth) {
631             AUTH_LOGI(AUTH_FSM, "fast auth succ");
632             if (RecoveryDeviceKey(authFsm) != SOFTBUS_OK) {
633                 AUTH_LOGE(AUTH_FSM, "fast auth recovery device key fail");
634                 ret = SOFTBUS_AUTH_SYNC_DEVID_FAIL;
635                 break;
636             }
637         } else if (!info->isServer) {
638             /* just client need start authDevice. */
639             if (ClientSetExchangeIdType(authFsm) != SOFTBUS_OK) {
640                 ret = SOFTBUS_OK;
641                 break;
642             }
643             char *anonyUdid = NULL;
644             Anonymize(info->udid, &anonyUdid);
645             AUTH_LOGI(AUTH_FSM, "start auth send udid=%{public}s", anonyUdid);
646             AnonymizeFree(anonyUdid);
647             if (HichainStartAuth(authFsm->authSeq, info->udid, info->connInfo.peerUid) != SOFTBUS_OK) {
648                 ret = SOFTBUS_AUTH_HICHAIN_AUTH_FAIL;
649                 break;
650             }
651         }
652         ret = SOFTBUS_OK;
653     } while (false);
654 
655     if (ret != SOFTBUS_OK) {
656         AUTH_LOGE(AUTH_FSM, "handle devId msg fail, ret=%{public}d", ret);
657         CompleteAuthSession(authFsm, ret);
658     }
659 }
660 
SyncDevIdStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)661 static bool SyncDevIdStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
662 {
663     MessagePara *msgPara = (MessagePara *)para;
664     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
665     if (authFsm == NULL) {
666         FreeMessagePara(msgPara);
667         return false;
668     }
669     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
670     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64 ", message=%{public}s",
671         authFsm->authSeq, FsmMsgTypeToStr(msgType));
672     switch (msgType) {
673         case FSM_MSG_RECV_DEVICE_ID:
674             HandleMsgRecvDeviceId(authFsm, msgPara);
675             break;
676         default:
677             HandleCommonMsg(authFsm, msgType, msgPara);
678             break;
679     }
680     FreeMessagePara(msgPara);
681     SoftbusHitraceStop();
682     return true;
683 }
684 
HandleMsgRecvAuthData(AuthFsm * authFsm,const MessagePara * para)685 static void HandleMsgRecvAuthData(AuthFsm *authFsm, const MessagePara *para)
686 {
687     int32_t ret = HichainProcessData(authFsm->authSeq, para->data, para->len);
688     if (ret != SOFTBUS_OK) {
689         LnnAuditExtra lnnAuditExtra = {0};
690         BuildLnnAuditEvent(&lnnAuditExtra, &authFsm->info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
691             ret, AUDIT_EVENT_PACKETS_ERROR);
692         LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_AUTH_DATA, lnnAuditExtra);
693         AUTH_LOGE(AUTH_FSM, "process hichain data fail");
694         if (!authFsm->info.isAuthFinished) {
695             CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL);
696         } else {
697             AUTH_LOGD(AUTH_FSM, "auth has finished, ignore this processing failure");
698         }
699     }
700 }
701 
TrySyncDeviceInfo(int64_t authSeq,const AuthSessionInfo * info)702 static int32_t TrySyncDeviceInfo(int64_t authSeq, const AuthSessionInfo *info)
703 {
704     switch (info->connInfo.type) {
705         case AUTH_LINK_TYPE_WIFI:
706             /* WIFI: client firstly send device info, server just reponse it. */
707             if (!info->isServer) {
708                 return PostDeviceInfoMessage(authSeq, info);
709             }
710             return SOFTBUS_OK;
711         case AUTH_LINK_TYPE_BR:
712         case AUTH_LINK_TYPE_BLE:
713         case AUTH_LINK_TYPE_P2P:
714         case AUTH_LINK_TYPE_ENHANCED_P2P:
715             return PostDeviceInfoMessage(authSeq, info);
716         default:
717             break;
718     }
719     return SOFTBUS_ERR;
720 }
721 
HandleMsgSaveSessionKey(AuthFsm * authFsm,const MessagePara * para)722 static void HandleMsgSaveSessionKey(AuthFsm *authFsm, const MessagePara *para)
723 {
724     SessionKey sessionKey = {.len = para->len};
725     if (memcpy_s(sessionKey.value, sizeof(sessionKey.value), para->data, para->len) != EOK) {
726         AUTH_LOGE(AUTH_FSM, "copy session key fail.");
727         (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
728         return;
729     }
730     if (AuthManagerSetSessionKey(authFsm->authSeq, &authFsm->info, &sessionKey, true) != SOFTBUS_OK) {
731         AUTH_LOGE(AUTH_FSM, "auth fsm save session key fail. authSeq=%{public}" PRId64 "", authFsm->authSeq);
732     }
733     (void)memset_s(&sessionKey, sizeof(sessionKey), 0, sizeof(sessionKey));
734     if (LnnGenerateLocalPtk(authFsm->info.udid, authFsm->info.uuid) != SOFTBUS_OK) {
735         AUTH_LOGE(AUTH_FSM, "generate ptk fail");
736     }
737     if (TrySyncDeviceInfo(authFsm->authSeq, &authFsm->info) != SOFTBUS_OK) {
738         AUTH_LOGE(AUTH_FSM, "auth fsm sync device info fail. authSeq=%{public}" PRId64 "", authFsm->authSeq);
739         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
740         return;
741     }
742     if (authFsm->info.deviceInfoData != NULL) {
743         AUTH_LOGE(AUTH_FSM, "auth fsm dispatch device info to next state. authSeq=%{public}" PRId64, authFsm->authSeq);
744         (void)AuthSessionProcessDevInfoData(authFsm->authSeq,
745             authFsm->info.deviceInfoData, authFsm->info.deviceInfoDataLen);
746         SoftBusFree(authFsm->info.deviceInfoData);
747         authFsm->info.deviceInfoData = NULL;
748     }
749     LnnFsmTransactState(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_INFO);
750 }
751 
HandleMsgAuthError(AuthFsm * authFsm,const MessagePara * para)752 static void HandleMsgAuthError(AuthFsm *authFsm, const MessagePara *para)
753 {
754     int32_t result = *((int32_t *)(para->data));
755     AUTH_LOGE(AUTH_FSM,
756         "auth fsm handle hichain error, authSeq=%{public}" PRId64", reason=%{public}d", authFsm->authSeq, result);
757     CompleteAuthSession(authFsm, SOFTBUS_AUTH_HICHAIN_AUTH_ERROR);
758 }
759 
HandleMsgRecvDevInfoEarly(AuthFsm * authFsm,const MessagePara * para)760 static void HandleMsgRecvDevInfoEarly(AuthFsm *authFsm, const MessagePara *para)
761 {
762     AUTH_LOGI(AUTH_FSM, "auth fsm recv device info early, save it. authSeq=%{public}" PRId64 "", authFsm->authSeq);
763     AuthSessionInfo *info = &authFsm->info;
764     if (info->deviceInfoData != NULL) {
765         SoftBusFree(info->deviceInfoData);
766         info->deviceInfoData = NULL;
767     }
768     info->deviceInfoData = DupMemBuffer(para->data, para->len);
769     if (info->deviceInfoData == NULL) {
770         AUTH_LOGE(AUTH_FSM, "dup device info fail.");
771         return;
772     }
773     info->deviceInfoDataLen = para->len;
774 }
775 
TryFinishAuthSession(AuthFsm * authFsm)776 static void TryFinishAuthSession(AuthFsm *authFsm)
777 {
778     AuthSessionInfo *info = &authFsm->info;
779     AUTH_LOGI(AUTH_FSM,
780         "Try finish auth fsm session, authSeq=%{public}" PRId64", devInfo=%{public}d, closeAck=%{public}d, "
781         "authFinish=%{public}d",
782         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived, info->isAuthFinished);
783     if (info->isNodeInfoReceived && info->isCloseAckReceived && info->isAuthFinished) {
784         CompleteAuthSession(authFsm, SOFTBUS_OK);
785     }
786 }
787 
HandleMsgAuthFinish(AuthFsm * authFsm,MessagePara * para)788 static void HandleMsgAuthFinish(AuthFsm *authFsm, MessagePara *para)
789 {
790     (void)para;
791     AuthSessionInfo *info = &authFsm->info;
792     AUTH_LOGI(AUTH_FSM,
793         "auth fsm hichain finished, authSeq=%{public}" PRId64", devInfo=%{public}d, closeAck=%{public}d",
794         authFsm->authSeq, info->isNodeInfoReceived, info->isCloseAckReceived);
795     info->isAuthFinished = true;
796     TryFinishAuthSession(authFsm);
797 }
798 
DeviceAuthStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)799 static bool DeviceAuthStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
800 {
801     MessagePara *msgPara = (MessagePara *)para;
802     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
803     if (authFsm == NULL) {
804         FreeMessagePara(msgPara);
805         return false;
806     }
807     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
808     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64", message=%{public}s",
809         authFsm->authSeq, FsmMsgTypeToStr(msgType));
810     switch (msgType) {
811         case FSM_MSG_RECV_DEVICE_ID:
812             HandleMsgRecvDeviceId(authFsm, msgPara);
813             break;
814         case FSM_MSG_RECV_AUTH_DATA:
815             HandleMsgRecvAuthData(authFsm, msgPara);
816             break;
817         case FSM_MSG_SAVE_SESSION_KEY:
818             HandleMsgSaveSessionKey(authFsm, msgPara);
819             break;
820         case FSM_MSG_AUTH_ERROR:
821             HandleMsgAuthError(authFsm, msgPara);
822             break;
823         case FSM_MSG_RECV_DEVICE_INFO:
824             HandleMsgRecvDevInfoEarly(authFsm, msgPara);
825             break;
826         case FSM_MSG_AUTH_FINISH:
827             HandleMsgAuthFinish(authFsm, msgPara);
828             break;
829         default:
830             HandleCommonMsg(authFsm, msgType, msgPara);
831             break;
832     }
833     FreeMessagePara(msgPara);
834     SoftbusHitraceStop();
835     return true;
836 }
837 
HandleMsgRecvDeviceInfo(AuthFsm * authFsm,const MessagePara * para)838 static void HandleMsgRecvDeviceInfo(AuthFsm *authFsm, const MessagePara *para)
839 {
840     AuthSessionInfo *info = &authFsm->info;
841     if (ProcessDeviceInfoMessage(authFsm->authSeq, info, para->data, para->len) != SOFTBUS_OK) {
842         LnnAuditExtra lnnAuditExtra = {0};
843         BuildLnnAuditEvent(&lnnAuditExtra, info, AUDIT_HANDLE_MSG_FAIL_END_AUTH,
844             SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL, AUDIT_EVENT_PACKETS_ERROR);
845         LNN_AUDIT(AUDIT_SCENE_HANDLE_MSG_DEV_INFO, lnnAuditExtra);
846         AUTH_LOGE(AUTH_FSM, "process device info msg fail");
847         CompleteAuthSession(authFsm, SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL);
848         return;
849     }
850     info->isNodeInfoReceived = true;
851 
852     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
853         info->isCloseAckReceived = true; /* WiFi auth no need close ack, set true directly */
854         if (!info->isServer) {
855             LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
856             AuthManagerSetAuthPassed(authFsm->authSeq, info);
857             TryFinishAuthSession(authFsm);
858             return;
859         }
860         /* WIFI: server should response device info */
861         if (PostDeviceInfoMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
862             AUTH_LOGE(AUTH_FSM, "server: response device info fail");
863             CompleteAuthSession(authFsm, SOFTBUS_AUTH_SYNC_DEVINFO_FAIL);
864             return;
865         }
866         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
867         AuthManagerSetAuthPassed(authFsm->authSeq, info);
868         TryFinishAuthSession(authFsm);
869         return;
870     }
871     if (info->connInfo.type == AUTH_LINK_TYPE_BLE &&
872         strlen(info->nodeInfo.deviceInfo.deviceUdid) != 0) {
873             (void)SoftBusGenerateStrHash((unsigned char *)info->nodeInfo.deviceInfo.deviceUdid,
874                 strlen(info->nodeInfo.deviceInfo.deviceUdid),
875                 (unsigned char *)authFsm->info.connInfo.info.bleInfo.deviceIdHash);
876     }
877     if (PostCloseAckMessage(authFsm->authSeq, info) != SOFTBUS_OK) {
878         AUTH_LOGE(AUTH_FSM, "post close ack fail");
879         CompleteAuthSession(authFsm, SOFTBUS_AUTH_SEND_FAIL);
880         return;
881     }
882     if (info->isCloseAckReceived) {
883         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
884         AuthManagerSetAuthPassed(authFsm->authSeq, info);
885         TryFinishAuthSession(authFsm);
886     }
887 }
888 
HandleMsgRecvCloseAck(AuthFsm * authFsm,MessagePara * para)889 static void HandleMsgRecvCloseAck(AuthFsm *authFsm, MessagePara *para)
890 {
891     (void)para;
892     AuthSessionInfo *info = &authFsm->info;
893     AUTH_LOGI(AUTH_FSM, "auth fsm recv close ack, fsm=%{public}" PRId64 ", isNodeInfoReceived=%{public}d",
894         authFsm->authSeq, info->isNodeInfoReceived);
895     info->isCloseAckReceived = true;
896     if (info->isNodeInfoReceived) {
897         LnnFsmRemoveMessage(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT);
898         AuthManagerSetAuthPassed(authFsm->authSeq, info);
899     } else {
900         AUTH_LOGI(AUTH_FSM, "close ack received before device info");
901     }
902     TryFinishAuthSession(authFsm);
903 }
904 
SyncDevInfoStateProcess(FsmStateMachine * fsm,int32_t msgType,void * para)905 static bool SyncDevInfoStateProcess(FsmStateMachine *fsm, int32_t msgType, void *para)
906 {
907     MessagePara *msgPara = (MessagePara *)para;
908     AuthFsm *authFsm = TranslateToAuthFsm(fsm, msgType, msgPara);
909     if (authFsm == NULL) {
910         FreeMessagePara(msgPara);
911         return false;
912     }
913     SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)authFsm->authSeq);
914     AUTH_LOGI(AUTH_FSM, "auth fsm process. authSeq=%{public}" PRId64", message=%{public}s",
915         authFsm->authSeq, FsmMsgTypeToStr(msgType));
916     switch (msgType) {
917         case FSM_MSG_RECV_DEVICE_INFO:
918             HandleMsgRecvDeviceInfo(authFsm, msgPara);
919             break;
920         case FSM_MSG_RECV_CLOSE_ACK:
921             HandleMsgRecvCloseAck(authFsm, msgPara);
922             break;
923         case FSM_MSG_RECV_AUTH_DATA:
924             HandleMsgRecvAuthData(authFsm, msgPara);
925             break;
926         case FSM_MSG_AUTH_FINISH:
927             HandleMsgAuthFinish(authFsm, msgPara);
928             break;
929         default:
930             HandleCommonMsg(authFsm, msgType, msgPara);
931             break;
932     }
933     FreeMessagePara(msgPara);
934     SoftbusHitraceStop();
935     return true;
936 }
937 
GetAuthFsmByAuthSeq(int64_t authSeq)938 static AuthFsm *GetAuthFsmByAuthSeq(int64_t authSeq)
939 {
940     AuthFsm *item = NULL;
941     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
942         if (item->authSeq != authSeq) {
943             continue;
944         }
945         if (item->isDead) {
946             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
947             break;
948         }
949         return item;
950     }
951     AUTH_LOGE(AUTH_FSM, "auth fsm not found. authSeq=%{public}" PRId64 "", authSeq);
952     return NULL;
953 }
954 
GetAuthFsmByConnId(uint64_t connId,bool isServer)955 AuthFsm *GetAuthFsmByConnId(uint64_t connId, bool isServer)
956 {
957     AuthFsm *item = NULL;
958     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
959         if (item->info.connId != connId || item->info.isServer != isServer) {
960             continue;
961         }
962         if (item->isDead) {
963             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
964             break;
965         }
966         return item;
967     }
968     AUTH_LOGE(AUTH_FSM, "auth fsm not found. " CONN_INFO, CONN_DATA(connId));
969     return NULL;
970 }
971 
GetSessionInfoFromAuthFsm(int64_t authSeq,AuthSessionInfo * info)972 static int32_t GetSessionInfoFromAuthFsm(int64_t authSeq, AuthSessionInfo *info)
973 {
974     if (!RequireAuthLock()) {
975         return SOFTBUS_LOCK_ERR;
976     }
977     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
978     if (authFsm == NULL) {
979         AUTH_LOGE(AUTH_FSM, "auth fsm not found. authSeq=%{public}" PRId64 "", authSeq);
980         ReleaseAuthLock();
981         return SOFTBUS_AUTH_NOT_FOUND;
982     }
983     *info = authFsm->info;
984     info->deviceInfoData = NULL;
985     info->deviceInfoDataLen = 0;
986     ReleaseAuthLock();
987     return SOFTBUS_OK;
988 }
989 
PostMessageToAuthFsm(int32_t msgType,int64_t authSeq,const uint8_t * data,uint32_t len)990 static int32_t PostMessageToAuthFsm(int32_t msgType, int64_t authSeq, const uint8_t *data, uint32_t len)
991 {
992     MessagePara *para = NewMessagePara(data, len);
993     if (para == NULL) {
994         return SOFTBUS_MALLOC_ERR;
995     }
996     if (!RequireAuthLock()) {
997         SoftBusFree(para);
998         return SOFTBUS_LOCK_ERR;
999     }
1000     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
1001     if (authFsm == NULL) {
1002         ReleaseAuthLock();
1003         SoftBusFree(para);
1004         return SOFTBUS_AUTH_GET_FSM_FAIL;
1005     }
1006     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
1007         AUTH_LOGE(AUTH_FSM, "post message to auth fsm fail");
1008         ReleaseAuthLock();
1009         SoftBusFree(para);
1010         return SOFTBUS_AUTH_SEND_FAIL;
1011     }
1012     ReleaseAuthLock();
1013     return SOFTBUS_OK;
1014 }
1015 
PostMessageToAuthFsmByConnId(int32_t msgType,uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)1016 static int32_t PostMessageToAuthFsmByConnId(int32_t msgType, uint64_t connId, bool isServer,
1017     const uint8_t *data, uint32_t len)
1018 {
1019     MessagePara *para = NewMessagePara(data, len);
1020     if (para == NULL) {
1021         return SOFTBUS_MALLOC_ERR;
1022     }
1023     if (!RequireAuthLock()) {
1024         SoftBusFree(para);
1025         return SOFTBUS_LOCK_ERR;
1026     }
1027     AuthFsm *authFsm = GetAuthFsmByConnId(connId, isServer);
1028     if (authFsm == NULL) {
1029         ReleaseAuthLock();
1030         SoftBusFree(para);
1031         return SOFTBUS_AUTH_GET_FSM_FAIL;
1032     }
1033     if (LnnFsmPostMessage(&authFsm->fsm, msgType, para) != SOFTBUS_OK) {
1034         AUTH_LOGE(AUTH_FSM, "post message to auth fsm by connId fail");
1035         ReleaseAuthLock();
1036         SoftBusFree(para);
1037         return SOFTBUS_AUTH_SEND_FAIL;
1038     }
1039     ReleaseAuthLock();
1040     return SOFTBUS_OK;
1041 }
1042 
SetAuthStartTime(AuthFsm * authFsm)1043 static void SetAuthStartTime(AuthFsm *authFsm)
1044 {
1045     authFsm->statisticData.startAuthTime = LnnUpTimeMs();
1046 }
1047 
AuthSessionStartAuth(int64_t authSeq,uint32_t requestId,uint64_t connId,const AuthConnInfo * connInfo,bool isServer,bool isFastAuth)1048 int32_t AuthSessionStartAuth(int64_t authSeq, uint32_t requestId,
1049     uint64_t connId, const AuthConnInfo *connInfo, bool isServer, bool isFastAuth)
1050 {
1051     AUTH_CHECK_AND_RETURN_RET_LOGE(connInfo != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "connInfo is NULL");
1052     if (!RequireAuthLock()) {
1053         return SOFTBUS_LOCK_ERR;
1054     }
1055     AuthFsm *authFsm = CreateAuthFsm(authSeq, requestId, connId, connInfo, isServer);
1056     if (authFsm == NULL) {
1057         ReleaseAuthLock();
1058         return SOFTBUS_MEM_ERR;
1059     }
1060     authFsm->info.isNeedFastAuth = isFastAuth;
1061     if (LnnFsmStart(&authFsm->fsm, g_states + STATE_SYNC_DEVICE_ID) != SOFTBUS_OK) {
1062         AUTH_LOGE(AUTH_FSM, "start auth fsm. authSeq=%{public}" PRId64 "", authFsm->authSeq);
1063         DestroyAuthFsm(authFsm);
1064         ReleaseAuthLock();
1065         return SOFTBUS_ERR;
1066     }
1067     SetAuthStartTime(authFsm);
1068     LnnFsmPostMessageDelay(&authFsm->fsm, FSM_MSG_AUTH_TIMEOUT, NULL, AUTH_TIMEOUT_MS);
1069     ReleaseAuthLock();
1070     return SOFTBUS_OK;
1071 }
1072 
AuthSessionProcessDevIdData(int64_t authSeq,const uint8_t * data,uint32_t len)1073 int32_t AuthSessionProcessDevIdData(int64_t authSeq, const uint8_t *data, uint32_t len)
1074 {
1075     if (data == NULL) {
1076         AUTH_LOGE(AUTH_FSM, "data is null");
1077         return SOFTBUS_INVALID_PARAM;
1078     }
1079     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_ID, authSeq, data, len);
1080 }
1081 
AuthSessionPostAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)1082 int32_t AuthSessionPostAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
1083 {
1084     AuthSessionInfo info;
1085     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
1086         return SOFTBUS_AUTH_GET_SESSION_INFO_FAIL;
1087     }
1088     if (PostHichainAuthMessage(authSeq, &info, data, len) != SOFTBUS_OK) {
1089         return SOFTBUS_AUTH_SYNC_DEVID_FAIL;
1090     }
1091     return SOFTBUS_OK;
1092 }
1093 
AuthSessionProcessAuthData(int64_t authSeq,const uint8_t * data,uint32_t len)1094 int32_t AuthSessionProcessAuthData(int64_t authSeq, const uint8_t *data, uint32_t len)
1095 {
1096     if (data == NULL) {
1097         AUTH_LOGE(AUTH_FSM, "data is null");
1098         return SOFTBUS_INVALID_PARAM;
1099     }
1100     return PostMessageToAuthFsm(FSM_MSG_RECV_AUTH_DATA, authSeq, data, len);
1101 }
1102 
AuthSessionGetUdid(int64_t authSeq,char * udid,uint32_t size)1103 int32_t AuthSessionGetUdid(int64_t authSeq, char *udid, uint32_t size)
1104 {
1105     if (udid == NULL) {
1106         AUTH_LOGE(AUTH_FSM, "udid is null");
1107         return SOFTBUS_INVALID_PARAM;
1108     }
1109     AuthSessionInfo info = {0};
1110     if (GetSessionInfoFromAuthFsm(authSeq, &info) != SOFTBUS_OK) {
1111         return SOFTBUS_AUTH_GET_SESSION_INFO_FAIL;
1112     }
1113     if (memcpy_s(udid, size, info.udid, sizeof(info.udid)) != EOK) {
1114         AUTH_LOGE(AUTH_FSM, "copy udid fail");
1115         return SOFTBUS_MEM_ERR;
1116     }
1117     return SOFTBUS_OK;
1118 }
1119 
AuthSessionSaveSessionKey(int64_t authSeq,const uint8_t * key,uint32_t len)1120 int32_t AuthSessionSaveSessionKey(int64_t authSeq, const uint8_t *key, uint32_t len)
1121 {
1122     if (key == NULL) {
1123         AUTH_LOGE(AUTH_FSM, "key is null");
1124         return SOFTBUS_INVALID_PARAM;
1125     }
1126     return PostMessageToAuthFsm(FSM_MSG_SAVE_SESSION_KEY, authSeq, key, len);
1127 }
1128 
AuthSessionHandleAuthFinish(int64_t authSeq)1129 int32_t AuthSessionHandleAuthFinish(int64_t authSeq)
1130 {
1131     return PostMessageToAuthFsm(FSM_MSG_AUTH_FINISH, authSeq, NULL, 0);
1132 }
1133 
AuthSessionHandleAuthError(int64_t authSeq,int32_t reason)1134 int32_t AuthSessionHandleAuthError(int64_t authSeq, int32_t reason)
1135 {
1136     return PostMessageToAuthFsm(FSM_MSG_AUTH_ERROR, authSeq, (uint8_t *)&reason, sizeof(reason));
1137 }
1138 
AuthSessionProcessDevInfoData(int64_t authSeq,const uint8_t * data,uint32_t len)1139 int32_t AuthSessionProcessDevInfoData(int64_t authSeq, const uint8_t *data, uint32_t len)
1140 {
1141     if (data == NULL) {
1142         AUTH_LOGE(AUTH_FSM, "data is null");
1143         return SOFTBUS_INVALID_PARAM;
1144     }
1145     return PostMessageToAuthFsm(FSM_MSG_RECV_DEVICE_INFO, authSeq, data, len);
1146 }
1147 
AuthSessionProcessCloseAck(int64_t authSeq,const uint8_t * data,uint32_t len)1148 int32_t AuthSessionProcessCloseAck(int64_t authSeq, const uint8_t *data, uint32_t len)
1149 {
1150     if (data == NULL) {
1151         AUTH_LOGE(AUTH_FSM, "data is null");
1152         return SOFTBUS_INVALID_PARAM;
1153     }
1154     return PostMessageToAuthFsm(FSM_MSG_RECV_CLOSE_ACK, authSeq, data, len);
1155 }
1156 
AuthSessionProcessDevInfoDataByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)1157 int32_t AuthSessionProcessDevInfoDataByConnId(uint64_t connId, bool isServer, const uint8_t *data,
1158     uint32_t len)
1159 {
1160     if (data == NULL) {
1161         AUTH_LOGE(AUTH_FSM, "data is null");
1162         return SOFTBUS_INVALID_PARAM;
1163     }
1164     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_DEVICE_INFO, connId, isServer, data, len);
1165 }
1166 
AuthSessionProcessCloseAckByConnId(uint64_t connId,bool isServer,const uint8_t * data,uint32_t len)1167 int32_t AuthSessionProcessCloseAckByConnId(uint64_t connId, bool isServer, const uint8_t *data,
1168     uint32_t len)
1169 {
1170     if (data == NULL) {
1171         AUTH_LOGE(AUTH_FSM, "data is null");
1172         return SOFTBUS_INVALID_PARAM;
1173     }
1174     return PostMessageToAuthFsmByConnId(FSM_MSG_RECV_CLOSE_ACK, connId, isServer, data, len);
1175 }
1176 
AuthSessionHandleDeviceNotTrusted(const char * udid)1177 int32_t AuthSessionHandleDeviceNotTrusted(const char *udid)
1178 {
1179     if (udid == NULL || udid[0] == '\0') {
1180         AUTH_LOGE(AUTH_FSM, "invalid udid");
1181         return SOFTBUS_INVALID_PARAM;
1182     }
1183     if (!RequireAuthLock()) {
1184         return SOFTBUS_LOCK_ERR;
1185     }
1186     AuthFsm *item = NULL;
1187     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1188         if (strcmp(item->info.udid, udid) != 0) {
1189             continue;
1190         }
1191         if (item->isDead) {
1192             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1193             continue;
1194         }
1195         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_NOT_TRUSTED, NULL);
1196     }
1197     ReleaseAuthLock();
1198     return SOFTBUS_OK;
1199 }
1200 
AuthSessionHandleDeviceDisconnected(uint64_t connId)1201 int32_t AuthSessionHandleDeviceDisconnected(uint64_t connId)
1202 {
1203     if (!RequireAuthLock()) {
1204         return SOFTBUS_LOCK_ERR;
1205     }
1206     AuthFsm *item = NULL;
1207     LIST_FOR_EACH_ENTRY(item, &g_authFsmList, AuthFsm, node) {
1208         if (item->info.connId != connId) {
1209             continue;
1210         }
1211         if (item->isDead) {
1212             AUTH_LOGE(AUTH_FSM, "auth fsm has dead. authSeq=%{public}" PRId64 "", item->authSeq);
1213             continue;
1214         }
1215         LnnFsmPostMessage(&item->fsm, FSM_MSG_DEVICE_DISCONNECTED, NULL);
1216     }
1217     ReleaseAuthLock();
1218     return SOFTBUS_OK;
1219 }
1220 
AuthSessionFsmExit(void)1221 void AuthSessionFsmExit(void)
1222 {
1223     HichainDestroy();
1224     if (!RequireAuthLock()) {
1225         return;
1226     }
1227     AuthFsm *item = NULL;
1228     AuthFsm *next = NULL;
1229     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authFsmList, AuthFsm, node) {
1230         DestroyAuthFsm(item);
1231     }
1232     ListInit(&g_authFsmList);
1233     ReleaseAuthLock();
1234 }
1235