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