1 /*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "auth_device.h"
17
18 #include <securec.h>
19 #include "anonymizer.h"
20 #include "auth_connection.h"
21 #include "auth_deviceprofile.h"
22 #include "auth_hichain.h"
23 #include "auth_log.h"
24 #include "auth_request.h"
25 #include "auth_session_message.h"
26 #include "bus_center_manager.h"
27 #include "device_profile_listener.h"
28 #include "lnn_app_bind_interface.h"
29 #include "lnn_decision_db.h"
30 #include "lnn_heartbeat_ctrl.h"
31 #include "lnn_local_net_ledger.h"
32 #include "lnn_ohos_account_adapter.h"
33 #include "lnn_map.h"
34 #include "lnn_net_builder.h"
35 #include "legacy/softbus_adapter_hitrace.h"
36 #include "softbus_adapter_mem.h"
37
38 #define DELAY_AUTH_TIME (8 * 1000L)
39
40 static AuthVerifyListener g_verifyListener = { 0 };
41 static GroupChangeListener g_groupChangeListener = { 0 };
42 static Map g_authLimitMap;
43 static SoftBusMutex g_authLimitMutex;
44 static bool g_isInit = false;
45 static bool g_regDataChangeListener = false;
46
AuthMapInit(void)47 static bool AuthMapInit(void)
48 {
49 if (SoftBusMutexInit(&g_authLimitMutex, NULL) != SOFTBUS_OK) {
50 AUTH_LOGE(AUTH_FSM, "g_authLimit mutex init fail");
51 return false;
52 }
53 LnnMapInit(&g_authLimitMap);
54 g_isInit = true;
55 AUTH_LOGI(AUTH_FSM, "authLimit map init success");
56 return true;
57 }
58
InsertToAuthLimitMap(const char * udidHash,uint64_t currentTime)59 static void InsertToAuthLimitMap(const char *udidHash, uint64_t currentTime)
60 {
61 if (SoftBusMutexLock(&g_authLimitMutex) != SOFTBUS_OK) {
62 AUTH_LOGE(AUTH_FSM, "SoftBusMutexLock fail");
63 return;
64 }
65 if (LnnMapSet(&g_authLimitMap, udidHash, (const void *)¤tTime, sizeof(uint64_t)) != SOFTBUS_OK) {
66 AUTH_LOGE(AUTH_FSM, "LnnMapSet fail");
67 (void)SoftBusMutexUnlock(&g_authLimitMutex);
68 return;
69 }
70 (void)SoftBusMutexUnlock(&g_authLimitMutex);
71 }
72
GetNodeFromAuthLimitMap(const char * udidHash,uint64_t * time)73 static int32_t GetNodeFromAuthLimitMap(const char *udidHash, uint64_t *time)
74 {
75 if (!g_isInit) {
76 return SOFTBUS_OK;
77 }
78 if (SoftBusMutexLock(&g_authLimitMutex) != SOFTBUS_OK) {
79 AUTH_LOGE(AUTH_FSM, "SoftBusMutexLock fail");
80 return SOFTBUS_LOCK_ERR;
81 }
82 uint64_t *ptr = (uint64_t *)LnnMapGet(&g_authLimitMap, udidHash);
83 if (ptr == NULL) {
84 AUTH_LOGE(AUTH_FSM, "LnnMapGet fail");
85 (void)SoftBusMutexUnlock(&g_authLimitMutex);
86 return SOFTBUS_INVALID_PARAM;
87 }
88 *time = *ptr;
89 (void)SoftBusMutexUnlock(&g_authLimitMutex);
90 return SOFTBUS_OK;
91 }
92
IsNeedAuthLimit(const char * udidHash)93 bool IsNeedAuthLimit(const char *udidHash)
94 {
95 if (udidHash == NULL) {
96 AUTH_LOGE(AUTH_FSM, "invalid param");
97 return false;
98 }
99 uint64_t time = 0;
100 uint64_t currentTime = 0;
101 if (GetNodeFromAuthLimitMap(udidHash, &time) != SOFTBUS_OK) {
102 return false;
103 }
104 if (time == 0) {
105 AUTH_LOGI(AUTH_FSM, "no need delay authentication");
106 return false;
107 }
108 currentTime = GetCurrentTimeMs();
109 AUTH_LOGI(AUTH_FSM, "currentTime=%{public}" PRIu64 ", time=%{public}" PRIu64 "", currentTime, time);
110 if (currentTime - time < DELAY_AUTH_TIME) {
111 AUTH_LOGI(AUTH_FSM, "lastest retcode authentication time less than 8s");
112 return true;
113 }
114 return false;
115 }
116
AuthDeleteLimitMap(const char * udidHash)117 void AuthDeleteLimitMap(const char *udidHash)
118 {
119 if (!g_isInit || udidHash == NULL) {
120 return;
121 }
122 if (SoftBusMutexLock(&g_authLimitMutex) != SOFTBUS_OK) {
123 AUTH_LOGE(AUTH_FSM, "SoftBusMutexLock fail");
124 return;
125 }
126 int32_t ret = LnnMapErase(&g_authLimitMap, udidHash);
127 if (ret != SOFTBUS_OK) {
128 AUTH_LOGE(AUTH_FSM, "delete item fail, ret=%{public}d", ret);
129 (void)SoftBusMutexUnlock(&g_authLimitMutex);
130 return;
131 }
132 (void)SoftBusMutexUnlock(&g_authLimitMutex);
133 }
134
ClearAuthLimitMap(void)135 void ClearAuthLimitMap(void)
136 {
137 if (!g_isInit) {
138 return;
139 }
140 if (SoftBusMutexLock(&g_authLimitMutex) != SOFTBUS_OK) {
141 AUTH_LOGE(AUTH_FSM, "SoftBusMutexLock fail");
142 return;
143 }
144 LnnMapDelete(&g_authLimitMap);
145 AUTH_LOGI(AUTH_FSM, "ClearAuthLimitMap success");
146 (void)SoftBusMutexUnlock(&g_authLimitMutex);
147 }
148
AuthAddNodeToLimitMap(const char * udid,int32_t reason)149 void AuthAddNodeToLimitMap(const char *udid, int32_t reason)
150 {
151 AUTH_CHECK_AND_RETURN_LOGE(udid != NULL, AUTH_FSM, "udid is null");
152
153 if (reason == SOFTBUS_AUTH_HICHAIN_LOCAL_IDENTITY_NOT_EXIST || reason == SOFTBUS_AUTH_HICHAIN_GROUP_NOT_EXIST ||
154 reason == SOFTBUS_AUTH_HICHAIN_NO_CANDIDATE_GROUP) {
155 uint64_t currentTime = GetCurrentTimeMs();
156 AUTH_LOGI(AUTH_FSM, "reason=%{public}d, currentTime=%{public}" PRIu64 "", reason, currentTime);
157
158 uint8_t hash[SHA_256_HASH_LEN] = { 0 };
159 char udidHash[SHORT_UDID_HASH_HEX_LEN + 1] = { 0 };
160 if (SoftBusGenerateStrHash((uint8_t *)udid, strlen(udid), hash) != SOFTBUS_OK) {
161 AUTH_LOGE(AUTH_FSM, "GenerateUdidShortHash fail.");
162 return;
163 }
164 if (ConvertBytesToUpperCaseHexString(udidHash, SHORT_UDID_HASH_HEX_LEN + 1, hash, UDID_SHORT_HASH_LEN_TEMP) !=
165 SOFTBUS_OK) {
166 AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
167 return;
168 }
169 if (!g_isInit && !AuthMapInit()) {
170 return;
171 }
172 InsertToAuthLimitMap(udidHash, currentTime);
173 }
174 }
175
AuthDevicePostTransData(AuthHandle authHandle,const AuthTransData * dataInfo)176 int32_t AuthDevicePostTransData(AuthHandle authHandle, const AuthTransData *dataInfo)
177 {
178 if (dataInfo == NULL) {
179 AUTH_LOGE(AUTH_CONN, "dataInfo is null");
180 return SOFTBUS_INVALID_PARAM;
181 }
182 if (authHandle.type < AUTH_LINK_TYPE_WIFI || authHandle.type >= AUTH_LINK_TYPE_MAX) {
183 AUTH_LOGE(AUTH_CONN, "authHandle type error");
184 return SOFTBUS_INVALID_PARAM;
185 }
186 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
187 if (auth == NULL) {
188 return SOFTBUS_AUTH_NOT_FOUND;
189 }
190 AuthDataHead head;
191 head.dataType = DATA_TYPE_CONNECTION;
192 head.module = dataInfo->module;
193 head.seq = dataInfo->seq;
194 head.flag = dataInfo->flag;
195 head.len = 0;
196 uint8_t *encData = NULL;
197 InDataInfo inDataInfo = { .inData = dataInfo->data, .inLen = dataInfo->len };
198 if (EncryptInner(&auth->sessionKeyList, (AuthLinkType)authHandle.type, &inDataInfo, &encData,
199 &head.len) != SOFTBUS_OK) {
200 AUTH_LOGE(AUTH_KEY, "encrypt trans data fail");
201 DelDupAuthManager(auth);
202 return SOFTBUS_ENCRYPT_ERR;
203 }
204 if (PostAuthData(auth->connId[authHandle.type], !auth->isServer, &head, encData) != SOFTBUS_OK) {
205 AUTH_LOGE(AUTH_CONN, "post trans data fail");
206 SoftBusFree(encData);
207 DelDupAuthManager(auth);
208 return SOFTBUS_AUTH_SEND_FAIL;
209 }
210 SoftBusFree(encData);
211 DelDupAuthManager(auth);
212 return SOFTBUS_OK;
213 }
214
AuthDeviceEncrypt(AuthHandle * authHandle,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)215 int32_t AuthDeviceEncrypt(AuthHandle *authHandle, const uint8_t *inData, uint32_t inLen, uint8_t *outData,
216 uint32_t *outLen)
217 {
218 if (authHandle == NULL || inData == NULL || inLen == 0 || outData == NULL || outLen == NULL ||
219 *outLen < (inLen + ENCRYPT_OVER_HEAD_LEN)) {
220 AUTH_LOGE(AUTH_KEY, "invalid param");
221 return SOFTBUS_INVALID_PARAM;
222 }
223 AuthManager *auth = GetAuthManagerByAuthId(authHandle->authId);
224 if (auth == NULL) {
225 return SOFTBUS_AUTH_NOT_FOUND;
226 }
227 InDataInfo inDataInfo = { .inData = inData, .inLen = inLen };
228 if (EncryptData(&auth->sessionKeyList, (AuthLinkType)authHandle->type, &inDataInfo, outData,
229 outLen) != SOFTBUS_OK) {
230 AUTH_LOGE(AUTH_KEY, "auth encrypt fail");
231 DelDupAuthManager(auth);
232 return SOFTBUS_ENCRYPT_ERR;
233 }
234 DelDupAuthManager(auth);
235 return SOFTBUS_OK;
236 }
237
AuthDeviceDecrypt(AuthHandle * authHandle,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)238 int32_t AuthDeviceDecrypt(AuthHandle *authHandle, const uint8_t *inData, uint32_t inLen, uint8_t *outData,
239 uint32_t *outLen)
240 {
241 if (authHandle == NULL || inData == NULL || inLen == 0 || outData == NULL || outLen == NULL ||
242 *outLen < AuthGetDecryptSize(inLen)) {
243 AUTH_LOGE(AUTH_KEY, "invalid param");
244 return SOFTBUS_INVALID_PARAM;
245 }
246 AuthManager *auth = GetAuthManagerByAuthId(authHandle->authId);
247 if (auth == NULL) {
248 return SOFTBUS_AUTH_NOT_FOUND;
249 }
250 InDataInfo inDataInfo = { .inData = inData, .inLen = inLen };
251 if (DecryptData(&auth->sessionKeyList, (AuthLinkType)authHandle->type, &inDataInfo, outData,
252 outLen) != SOFTBUS_OK) {
253 AUTH_LOGE(AUTH_KEY, "auth decrypt fail, authId=%{public}" PRId64, authHandle->authId);
254 DelDupAuthManager(auth);
255 return SOFTBUS_ENCRYPT_ERR;
256 }
257 DelDupAuthManager(auth);
258 return SOFTBUS_OK;
259 }
260
AuthDeviceGetConnInfo(AuthHandle authHandle,AuthConnInfo * connInfo)261 int32_t AuthDeviceGetConnInfo(AuthHandle authHandle, AuthConnInfo *connInfo)
262 {
263 if (connInfo == NULL) {
264 AUTH_LOGE(AUTH_CONN, "connInfo is null");
265 return SOFTBUS_INVALID_PARAM;
266 }
267 if (authHandle.type < AUTH_LINK_TYPE_WIFI || authHandle.type >= AUTH_LINK_TYPE_MAX) {
268 AUTH_LOGE(AUTH_CONN, "authHandle type error");
269 return SOFTBUS_INVALID_PARAM;
270 }
271 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
272 if (auth == NULL) {
273 return SOFTBUS_AUTH_NOT_FOUND;
274 }
275 *connInfo = auth->connInfo[authHandle.type];
276 DelDupAuthManager(auth);
277 return SOFTBUS_OK;
278 }
279
AuthDeviceGetServerSide(int64_t authId,bool * isServer)280 int32_t AuthDeviceGetServerSide(int64_t authId, bool *isServer)
281 {
282 if (isServer == NULL) {
283 AUTH_LOGE(AUTH_CONN, "isServer is null");
284 return SOFTBUS_INVALID_PARAM;
285 }
286 AuthManager *auth = GetAuthManagerByAuthId(authId);
287 if (auth == NULL) {
288 return SOFTBUS_AUTH_NOT_FOUND;
289 }
290 *isServer = auth->isServer;
291 DelDupAuthManager(auth);
292 return SOFTBUS_OK;
293 }
294
AuthDeviceGetDeviceUuid(int64_t authId,char * uuid,uint16_t size)295 int32_t AuthDeviceGetDeviceUuid(int64_t authId, char *uuid, uint16_t size)
296 {
297 if (uuid == NULL) {
298 AUTH_LOGE(AUTH_CONN, "uuid is empty");
299 return SOFTBUS_INVALID_PARAM;
300 }
301 AuthManager *auth = GetAuthManagerByAuthId(authId);
302 if (auth == NULL) {
303 return SOFTBUS_AUTH_NOT_FOUND;
304 }
305 if (strcpy_s(uuid, size, auth->uuid) != EOK) {
306 AUTH_LOGI(AUTH_CONN, "copy uuid fail, size=%{public}u", size);
307 DelDupAuthManager(auth);
308 return SOFTBUS_STRCPY_ERR;
309 }
310 DelDupAuthManager(auth);
311 return SOFTBUS_OK;
312 }
313
AuthDeviceGetVersion(int64_t authId,SoftBusVersion * version)314 int32_t AuthDeviceGetVersion(int64_t authId, SoftBusVersion *version)
315 {
316 if (version == NULL) {
317 AUTH_LOGE(AUTH_CONN, "version is null");
318 return SOFTBUS_INVALID_PARAM;
319 }
320 AuthManager *auth = GetAuthManagerByAuthId(authId);
321 if (auth == NULL) {
322 return SOFTBUS_AUTH_NOT_FOUND;
323 }
324 *version = auth->version;
325 DelDupAuthManager(auth);
326 return SOFTBUS_OK;
327 }
328
AuthDeviceNotTrust(const char * peerUdid)329 void AuthDeviceNotTrust(const char *peerUdid)
330 {
331 if (peerUdid == NULL || strlen(peerUdid) == 0) {
332 AUTH_LOGE(AUTH_HICHAIN, "invalid param");
333 return;
334 }
335 char networkId[NETWORK_ID_BUF_LEN] = {0};
336 if (LnnGetNetworkIdByUdid(peerUdid, networkId, sizeof(networkId)) != SOFTBUS_OK) {
337 AUTH_LOGE(AUTH_HICHAIN, "get networkId by udid fail");
338 return;
339 }
340 RemoveNotPassedAuthManagerByUdid(peerUdid);
341 AuthSessionHandleDeviceNotTrusted(peerUdid);
342 LnnDeleteSpecificTrustedDevInfo(peerUdid, GetActiveOsAccountIds());
343 LnnHbOnTrustedRelationReduced();
344 AuthRemoveDeviceKeyByUdid(peerUdid);
345 if (LnnRequestLeaveSpecific(networkId, CONNECTION_ADDR_MAX) != SOFTBUS_OK) {
346 AUTH_LOGE(AUTH_HICHAIN, "request leave specific fail");
347 } else {
348 AUTH_LOGI(AUTH_HICHAIN, "request leave specific successful");
349 }
350 }
351
AuthNotifyDeviceVerifyPassed(AuthHandle authHandle,const NodeInfo * nodeInfo)352 void AuthNotifyDeviceVerifyPassed(AuthHandle authHandle, const NodeInfo *nodeInfo)
353 {
354 CHECK_NULL_PTR_RETURN_VOID(nodeInfo);
355 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
356 if (auth == NULL) {
357 AUTH_LOGE(AUTH_FSM, "get auth manager failed");
358 return;
359 }
360 if (auth->connInfo[authHandle.type].type == AUTH_LINK_TYPE_P2P) {
361 /* P2P auth no need notify to LNN. */
362 DelDupAuthManager(auth);
363 return;
364 }
365 DelDupAuthManager(auth);
366
367 /* notify LNN device verify pass. */
368 if (g_verifyListener.onDeviceVerifyPass == NULL) {
369 AUTH_LOGW(AUTH_FSM, "onDeviceVerifyPass not set");
370 return;
371 }
372 g_verifyListener.onDeviceVerifyPass(authHandle, nodeInfo);
373 }
374
AuthNotifyDeviceDisconnect(AuthHandle authHandle)375 void AuthNotifyDeviceDisconnect(AuthHandle authHandle)
376 {
377 if (g_verifyListener.onDeviceDisconnect == NULL) {
378 AUTH_LOGW(AUTH_FSM, "onDeviceDisconnect not set");
379 return;
380 }
381 g_verifyListener.onDeviceDisconnect(authHandle);
382 }
383
OnDeviceNotTrusted(const char * peerUdid,int32_t localUserId)384 static void OnDeviceNotTrusted(const char *peerUdid, int32_t localUserId)
385 {
386 RemoveNotPassedAuthManagerByUdid(peerUdid);
387 AuthSessionHandleDeviceNotTrusted(peerUdid);
388 if (!DpHasAccessControlProfile(peerUdid, false, localUserId)) {
389 LnnDeleteLinkFinderInfo(peerUdid);
390 }
391 if (!DpHasAccessControlProfile(peerUdid, true, localUserId)) {
392 LnnDeleteSpecificTrustedDevInfo(peerUdid, localUserId);
393 }
394 if (g_verifyListener.onDeviceNotTrusted == NULL) {
395 AUTH_LOGW(AUTH_HICHAIN, "onDeviceNotTrusted not set");
396 return;
397 }
398 g_verifyListener.onDeviceNotTrusted(peerUdid);
399 LnnHbOnTrustedRelationReduced();
400 AuthRemoveDeviceKeyByUdid(peerUdid);
401 }
402
RegAuthVerifyListener(const AuthVerifyListener * listener)403 int32_t RegAuthVerifyListener(const AuthVerifyListener *listener)
404 {
405 if (listener == NULL) {
406 AUTH_LOGE(AUTH_CONN, "invalid listener");
407 return SOFTBUS_INVALID_PARAM;
408 }
409 g_verifyListener = *listener;
410 return SOFTBUS_OK;
411 }
412
UnregAuthVerifyListener(void)413 void UnregAuthVerifyListener(void)
414 {
415 (void)memset_s(&g_verifyListener, sizeof(AuthVerifyListener), 0, sizeof(AuthVerifyListener));
416 }
417
OnGroupCreated(const char * groupId,int32_t groupType)418 static void OnGroupCreated(const char *groupId, int32_t groupType)
419 {
420 if (g_groupChangeListener.onGroupCreated != NULL) {
421 g_groupChangeListener.onGroupCreated(groupId, groupType);
422 }
423 }
424
OnGroupDeleted(const char * groupId,int32_t groupType)425 static void OnGroupDeleted(const char *groupId, int32_t groupType)
426 {
427 if (g_groupChangeListener.onGroupDeleted != NULL) {
428 g_groupChangeListener.onGroupDeleted(groupId, groupType);
429 }
430 }
431
OnDeviceBound(const char * udid,const char * groupInfo)432 static void OnDeviceBound(const char *udid, const char *groupInfo)
433 {
434 LnnInsertSpecificTrustedDevInfo(udid);
435 if (g_groupChangeListener.onDeviceBound != NULL) {
436 g_groupChangeListener.onDeviceBound(udid, groupInfo);
437 }
438 }
439
RetryRegTrustDataChangeListener(void)440 static int32_t RetryRegTrustDataChangeListener(void)
441 {
442 TrustDataChangeListener trustListener = {
443 .onGroupCreated = OnGroupCreated,
444 .onGroupDeleted = OnGroupDeleted,
445 .onDeviceNotTrusted = OnDeviceNotTrusted,
446 .onDeviceBound = OnDeviceBound,
447 };
448 for (int32_t i = 1; i <= RETRY_REGDATA_TIMES; i++) {
449 int32_t ret = RegTrustDataChangeListener(&trustListener);
450 if (ret == SOFTBUS_OK) {
451 AUTH_LOGI(AUTH_HICHAIN, "regDataChangeListener success, times=%{public}d", i);
452 return SOFTBUS_OK;
453 }
454 AUTH_LOGW(AUTH_HICHAIN, "retry regDataChangeListener, current retry times=%{public}d, err=%{public}d", i, ret);
455 (void)SoftBusSleepMs(RETRY_REGDATA_MILLSECONDS);
456 }
457 return SOFTBUS_AUTH_REG_DATA_FAIL;
458 }
459
RegTrustListenerOnHichainSaStart(void)460 int32_t RegTrustListenerOnHichainSaStart(void)
461 {
462 TrustDataChangeListener trustListener = {
463 .onGroupCreated = OnGroupCreated,
464 .onGroupDeleted = OnGroupDeleted,
465 .onDeviceNotTrusted = OnDeviceNotTrusted,
466 .onDeviceBound = OnDeviceBound,
467 };
468 if (RegTrustDataChangeListener(&trustListener) != SOFTBUS_OK) {
469 AUTH_LOGE(AUTH_INIT, "RegTrustDataChangeListener fail");
470 g_regDataChangeListener = false;
471 return SOFTBUS_AUTH_INIT_FAIL;
472 }
473 g_regDataChangeListener = true;
474 AUTH_LOGE(AUTH_INIT, "OnHichainSaStart add listener succ");
475 return SOFTBUS_OK;
476 }
477
RegGroupChangeListener(const GroupChangeListener * listener)478 int32_t RegGroupChangeListener(const GroupChangeListener *listener)
479 {
480 if (listener == NULL) {
481 AUTH_LOGE(AUTH_CONN, "listener is null");
482 return SOFTBUS_INVALID_PARAM;
483 }
484 g_groupChangeListener.onGroupCreated = listener->onGroupCreated;
485 g_groupChangeListener.onGroupDeleted = listener->onGroupDeleted;
486 g_groupChangeListener.onDeviceBound = listener->onDeviceBound;
487 return SOFTBUS_OK;
488 }
489
UnregGroupChangeListener(void)490 void UnregGroupChangeListener(void)
491 {
492 g_groupChangeListener.onGroupCreated = NULL;
493 g_groupChangeListener.onGroupDeleted = NULL;
494 g_groupChangeListener.onDeviceBound = NULL;
495 }
496
AuthRegisterToDpDelay(void)497 int32_t AuthRegisterToDpDelay(void)
498 {
499 DeviceProfileChangeListener deviceProfileChangeListener = {
500 .onDeviceProfileAdd = OnDeviceBound,
501 .onDeviceProfileDeleted = OnDeviceNotTrusted,
502 };
503 return RegisterToDp(&deviceProfileChangeListener);
504 }
505
AuthDirectOnlineCreateAuthManager(int64_t authSeq,const AuthSessionInfo * info)506 int32_t AuthDirectOnlineCreateAuthManager(int64_t authSeq, const AuthSessionInfo *info)
507 {
508 AUTH_CHECK_AND_RETURN_RET_LOGE(info, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is null");
509 AUTH_CHECK_AND_RETURN_RET_LOGE(CheckAuthConnInfoType(&info->connInfo), SOFTBUS_INVALID_PARAM,
510 AUTH_FSM, "connInfo type error");
511 AUTH_LOGI(AUTH_FSM, "direct online authSeq=%{public}" PRId64 ", side=%{public}s, requestId=%{public}u",
512 authSeq, GetAuthSideStr(info->isServer), info->requestId);
513 if (!RequireAuthLock()) {
514 return SOFTBUS_LOCK_ERR;
515 }
516 if (info->connInfo.type != AUTH_LINK_TYPE_BLE) {
517 AUTH_LOGE(AUTH_FSM, "sessionkey online only support ble");
518 ReleaseAuthLock();
519 return SOFTBUS_AUTH_UNEXPECTED_CONN_TYPE;
520 }
521
522 bool isNewCreated = false;
523 AuthManager *auth = GetDeviceAuthManager(authSeq, info, &isNewCreated, authSeq);
524 if (auth == NULL) {
525 AUTH_LOGE(AUTH_FSM, "auth manager does not exist.");
526 ReleaseAuthLock();
527 return SOFTBUS_AUTH_NOT_FOUND;
528 }
529 auth->hasAuthPassed[info->connInfo.type] = true;
530 AUTH_LOGI(AUTH_FSM,
531 "auth manager without sessionkey. isNewCreated=%{public}d, authId=%{public}" PRId64 ", authSeq=%{public}" PRId64
532 ", lastVerifyTime=%{public}" PRId64,
533 isNewCreated, auth->authId, authSeq, auth->lastVerifyTime);
534 ReleaseAuthLock();
535 return SOFTBUS_OK;
536 }
537
VerifyDevice(AuthRequest * request)538 static int32_t VerifyDevice(AuthRequest *request)
539 {
540 int64_t traceId = GenSeq(false);
541 request->traceId = traceId;
542 SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)traceId);
543 AUTH_LOGI(AUTH_CONN, "start verify device: requestId=%{public}u", request->requestId);
544 if (!g_regDataChangeListener) {
545 if (RetryRegTrustDataChangeListener() != SOFTBUS_OK) {
546 AUTH_LOGE(AUTH_HICHAIN, "hichain regDataChangeListener failed");
547 SoftbusHitraceStop();
548 return SOFTBUS_AUTH_INIT_FAIL;
549 }
550 g_regDataChangeListener = true;
551 }
552 uint32_t waitNum = AddAuthRequest(request);
553 if (waitNum == 0) {
554 AUTH_LOGE(AUTH_CONN, "add verify request to list fail, requestId=%{public}u", request->requestId);
555 SoftbusHitraceStop();
556 return SOFTBUS_AUTH_INNER_ERR;
557 }
558 if (waitNum > 1) {
559 AUTH_LOGI(
560 AUTH_CONN, "wait last verify request complete, waitNum=%{public}u, requestId=%{public}u",
561 waitNum, request->requestId);
562 SoftbusHitraceStop();
563 return SOFTBUS_OK;
564 }
565 if (ConnectAuthDevice(request->requestId, &request->connInfo, CONN_SIDE_ANY) != SOFTBUS_OK) {
566 AUTH_LOGE(AUTH_CONN, "connect auth device failed: requestId=%{public}u", request->requestId);
567 FindAndDelAuthRequestByConnInfo(request->requestId, &request->connInfo);
568 SoftbusHitraceStop();
569 return SOFTBUS_AUTH_CONN_FAIL;
570 }
571 SoftbusHitraceStop();
572 AUTH_LOGI(AUTH_CONN, "verify device succ. requestId=%{public}u", request->requestId);
573 return SOFTBUS_OK;
574 }
575
StartConnVerifyDevice(uint32_t requestId,const AuthConnInfo * connInfo,const AuthConnCallback * connCb,AuthVerifyModule module,bool isFastAuth)576 static int32_t StartConnVerifyDevice(uint32_t requestId, const AuthConnInfo *connInfo, const AuthConnCallback *connCb,
577 AuthVerifyModule module, bool isFastAuth)
578 {
579 if (connInfo == NULL || connCb == NULL) {
580 AUTH_LOGE(AUTH_CONN, "invalid param");
581 return SOFTBUS_INVALID_PARAM;
582 }
583 AuthRequest request;
584 (void)memset_s(&request, sizeof(AuthRequest), 0, sizeof(AuthRequest));
585 request.connCb = *connCb;
586 request.module = module;
587 request.requestId = requestId;
588 request.connInfo = *connInfo;
589 request.authId = AUTH_INVALID_ID;
590 request.type = REQUEST_TYPE_VERIFY;
591 request.isFastAuth = isFastAuth;
592 return VerifyDevice(&request);
593 }
594
StartVerifyDevice(uint32_t requestId,const AuthConnInfo * connInfo,const AuthVerifyCallback * verifyCb,AuthVerifyModule module,bool isFastAuth)595 static int32_t StartVerifyDevice(uint32_t requestId, const AuthConnInfo *connInfo, const AuthVerifyCallback *verifyCb,
596 AuthVerifyModule module, bool isFastAuth)
597 {
598 if (connInfo == NULL || verifyCb == NULL) {
599 AUTH_LOGE(AUTH_CONN, "invalid param");
600 return SOFTBUS_INVALID_PARAM;
601 }
602 AuthRequest request;
603 (void)memset_s(&request, sizeof(AuthRequest), 0, sizeof(AuthRequest));
604 request.verifyCb = *verifyCb;
605 request.module = module;
606 request.requestId = requestId;
607 request.connInfo = *connInfo;
608 request.authId = AUTH_INVALID_ID;
609 request.type = REQUEST_TYPE_VERIFY;
610 request.isFastAuth = isFastAuth;
611 return VerifyDevice(&request);
612 }
613
AuthStartReconnectDevice(AuthHandle authHandle,const AuthConnInfo * connInfo,uint32_t requestId,const AuthConnCallback * connCb)614 int32_t AuthStartReconnectDevice(
615 AuthHandle authHandle, const AuthConnInfo *connInfo, uint32_t requestId, const AuthConnCallback *connCb)
616 {
617 AUTH_CHECK_AND_RETURN_RET_LOGE(connInfo != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "connInfo is NULL");
618 AUTH_CHECK_AND_RETURN_RET_LOGE(connCb != NULL, SOFTBUS_INVALID_PARAM, AUTH_CONN, "connCb is NULL");
619 AUTH_LOGI(AUTH_CONN, "start reconnect device. requestId=%{public}u, authId=%{public}" PRId64,
620 requestId, authHandle.authId);
621 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
622 if (auth == NULL) {
623 return SOFTBUS_AUTH_NOT_FOUND;
624 }
625 ConnSideType sideType = GetConnSideType(auth->connId[connInfo->type]);
626 uint64_t connId = auth->connId[AUTH_LINK_TYPE_BR];
627 DelDupAuthManager(auth);
628
629 AuthRequest request;
630 (void)memset_s(&request, sizeof(AuthRequest), 0, sizeof(AuthRequest));
631 request.authId = authHandle.authId;
632 request.connCb = *connCb;
633 request.connInfo = *connInfo;
634 request.requestId = requestId;
635 request.type = REQUEST_TYPE_RECONNECT;
636 request.isFastAuth = true;
637 if (connInfo->type == AUTH_LINK_TYPE_BR) {
638 request.connInfo.info.brInfo.connectionId = GetConnId(connId);
639 }
640 if (AddAuthRequest(&request) == 0) {
641 AUTH_LOGE(AUTH_CONN, "add reconnect request fail, requestId=%{public}u", requestId);
642 return SOFTBUS_AUTH_ADD_REQUEST_FAIL;
643 }
644 if (ConnectAuthDevice(requestId, &request.connInfo, sideType) != SOFTBUS_OK) {
645 DelAuthRequest(requestId);
646 return SOFTBUS_AUTH_CONN_FAIL;
647 }
648 return SOFTBUS_OK;
649 }
650
AuthCheckSessionKey(AuthHandle * authHandle)651 static bool AuthCheckSessionKey(AuthHandle *authHandle)
652 {
653 AuthManager *auth = GetAuthManagerByAuthId(authHandle->authId);
654 if (auth == NULL) {
655 AUTH_LOGE(AUTH_CONN, "not found auth manager, authId=%{public}" PRId64, authHandle->authId);
656 return false;
657 }
658 bool res = CheckSessionKeyListExistType(&auth->sessionKeyList, (AuthLinkType)authHandle->type);
659 DelDupAuthManager(auth);
660 return res;
661 }
662
AuthDeviceOpenConn(const AuthConnInfo * info,uint32_t requestId,const AuthConnCallback * callback)663 int32_t AuthDeviceOpenConn(const AuthConnInfo *info, uint32_t requestId, const AuthConnCallback *callback)
664 {
665 if (info == NULL || !CheckAuthConnCallback(callback)) {
666 AUTH_LOGE(AUTH_CONN, "invalid param");
667 return SOFTBUS_INVALID_PARAM;
668 }
669 AUTH_CHECK_AND_RETURN_RET_LOGE(CheckAuthConnInfoType(info), SOFTBUS_INVALID_PARAM,
670 AUTH_FSM, "connInfo type error");
671 AUTH_LOGI(AUTH_CONN, "open auth conn: connType=%{public}d, requestId=%{public}u", info->type, requestId);
672 AuthHandle authHandle = { .authId = AUTH_INVALID_ID, .type = info->type };
673 bool judgeTimeOut = false;
674 switch (info->type) {
675 case AUTH_LINK_TYPE_WIFI:
676 case AUTH_LINK_TYPE_SESSION_KEY:
677 authHandle.authId = GetLatestIdByConnInfo(info);
678 if (authHandle.authId == AUTH_INVALID_ID) {
679 return SOFTBUS_AUTH_NOT_FOUND;
680 }
681 callback->onConnOpened(requestId, authHandle);
682 break;
683 case AUTH_LINK_TYPE_BR:
684 /* fall-through */
685 case AUTH_LINK_TYPE_BLE:
686 judgeTimeOut = true;
687 authHandle.authId = GetActiveAuthIdByConnInfo(info, judgeTimeOut);
688 if (authHandle.authId != AUTH_INVALID_ID && AuthCheckSessionKey(&authHandle)) {
689 return AuthStartReconnectDevice(authHandle, info, requestId, callback);
690 }
691 return StartConnVerifyDevice(requestId, info, callback, AUTH_MODULE_LNN, true);
692 case AUTH_LINK_TYPE_P2P:
693 case AUTH_LINK_TYPE_ENHANCED_P2P:
694 authHandle.authId = GetActiveAuthIdByConnInfo(info, judgeTimeOut);
695 if (authHandle.authId != AUTH_INVALID_ID) {
696 AUTH_LOGI(AUTH_CONN, "reuse type=%{public}d, authId=%{public}" PRId64, info->type, authHandle.authId);
697 callback->onConnOpened(requestId, authHandle);
698 break;
699 }
700 return StartConnVerifyDevice(requestId, info, callback, AUTH_MODULE_LNN, true);
701 default:
702 AUTH_LOGE(AUTH_CONN, "unknown connType. type=%{public}d", info->type);
703 return SOFTBUS_INVALID_PARAM;
704 }
705 return SOFTBUS_OK;
706 }
707
AuthDeviceCloseConn(AuthHandle authHandle)708 void AuthDeviceCloseConn(AuthHandle authHandle)
709 {
710 AUTH_LOGI(AUTH_CONN, "close auth conn: authId=%{public}" PRId64, authHandle.authId);
711 if (authHandle.type < AUTH_LINK_TYPE_WIFI || authHandle.type >= AUTH_LINK_TYPE_MAX) {
712 AUTH_LOGE(AUTH_CONN, "authHandle type error");
713 return;
714 }
715 AuthManager *auth = GetAuthManagerByAuthId(authHandle.authId);
716 if (auth == NULL) {
717 return;
718 }
719 switch (auth->connInfo[authHandle.type].type) {
720 case AUTH_LINK_TYPE_WIFI:
721 case AUTH_LINK_TYPE_P2P:
722 case AUTH_LINK_TYPE_ENHANCED_P2P:
723 case AUTH_LINK_TYPE_SESSION_KEY:
724 /* Do nothing. */
725 break;
726 case AUTH_LINK_TYPE_BR:
727 case AUTH_LINK_TYPE_BLE:
728 DisconnectAuthDevice(&auth->connId[authHandle.type]);
729 break;
730 default:
731 break;
732 }
733 DelDupAuthManager(auth);
734 return;
735 }
736
AuthStartVerify(const AuthConnInfo * connInfo,uint32_t requestId,const AuthVerifyCallback * callback,AuthVerifyModule module,bool isFastAuth)737 int32_t AuthStartVerify(const AuthConnInfo *connInfo, uint32_t requestId, const AuthVerifyCallback *callback,
738 AuthVerifyModule module, bool isFastAuth)
739 {
740 if (connInfo == NULL || !CheckVerifyCallback(callback)) {
741 AUTH_LOGE(AUTH_CONN, "invalid param");
742 return SOFTBUS_INVALID_PARAM;
743 }
744 AUTH_CHECK_AND_RETURN_RET_LOGE(CheckAuthConnInfoType(connInfo), SOFTBUS_INVALID_PARAM,
745 AUTH_FSM, "connInfo type error");
746 return StartVerifyDevice(requestId, connInfo, callback, module, isFastAuth);
747 }
748
AuthStartConnVerify(const AuthConnInfo * connInfo,uint32_t requestId,const AuthConnCallback * connCallback,AuthVerifyModule module,bool isFastAuth)749 int32_t AuthStartConnVerify(const AuthConnInfo *connInfo, uint32_t requestId, const AuthConnCallback *connCallback,
750 AuthVerifyModule module, bool isFastAuth)
751 {
752 if (connInfo == NULL || !CheckAuthConnCallback(connCallback)) {
753 AUTH_LOGE(AUTH_CONN, "invalid param");
754 return SOFTBUS_INVALID_PARAM;
755 }
756 AUTH_CHECK_AND_RETURN_RET_LOGE(CheckAuthConnInfoType(connInfo), SOFTBUS_INVALID_PARAM,
757 AUTH_FSM, "connInfo type error");
758 return StartConnVerifyDevice(requestId, connInfo, connCallback, module, isFastAuth);
759 }