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