• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *)&currentTime, 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 }