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