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