• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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_hichain.h"
17 
18 #include <securec.h>
19 
20 #include "anonymizer.h"
21 #include "auth_common.h"
22 #include "auth_hichain_adapter.h"
23 #include "auth_identity_service_adapter.h"
24 #include "auth_log.h"
25 #include "auth_session_fsm.h"
26 #include "bus_center_manager.h"
27 #include "device_auth.h"
28 #include "lnn_async_callback_utils.h"
29 #include "lnn_connection_fsm.h"
30 #include "lnn_distributed_net_ledger.h"
31 #include "lnn_event.h"
32 #include "lnn_net_builder.h"
33 #include "lnn_ohos_account_adapter.h"
34 #include "softbus_adapter_mem.h"
35 #include "softbus_def.h"
36 #include "softbus_json_utils.h"
37 
38 #define AUTH_APPID "softbus_auth"
39 #define GROUPID_BUF_LEN 65
40 #define ONTRANSMIT_MAX_DATA_BUFFER_LEN 5120 /* 5 × 1024 */
41 #define PC_AUTH_ERRCODE                36870
42 
43 #define HICHAIN_DAS_ERRCODE_MIN    0xF0000001
44 #define HICHAIN_DAS_ERRCODE_MAX    0xF00010FF
45 #define HICHAIN_COMMON_ERRCODE_MIN 0x0001
46 #define HICHAIN_COMMON_ERRCODE_MAX 0xFFFF
47 #define MASK_HIGH_4BIT             0xF000
48 #define MASK_LOW_8BIT              0x00FF
49 #define MASK_LOW_16BIT             0xFFFF
50 #define ERRCODE_OR_BIT             0x1000
51 #define ERRCODE_SHIFT_21BIT        21
52 #define ERRCODE_SHIFT_16BIT        16
53 #define ERRCODE_SHIFT_12BIT        12
54 #define ERRCODE_SHIFT_8BIT         8
55 #define SHORT_UDID_HASH_LEN        8
56 
57 typedef struct {
58     char groupId[GROUPID_BUF_LEN];
59     GroupType groupType;
60 } GroupInfo;
61 
62 typedef struct {
63     int32_t errCode;
64     uint32_t errorReturnLen;
65     uint8_t data[0];
66 } ProofInfo;
67 
68 typedef struct {
69     char *(*generateAuthParam)(HiChainAuthParam *hiChainParam);
70     int32_t (*authenticate)(int32_t userId, int64_t authReqId, const char *authParams, const DeviceAuthCallback *cb);
71     int32_t (*processAuthData)(int64_t authSeq, const uint8_t *data, uint32_t len, DeviceAuthCallback *cb);
72 } HiChainAuthInterfaceAdapter;
73 
74 static TrustDataChangeListener g_dataChangeListener;
75 
76 static HiChainAuthInterfaceAdapter g_hiChainAuthInterface[HICHAIN_AUTH_BUTT] = {
77     { GenDeviceLevelParam, AuthDevice, ProcessAuthData },
78     { IdServiceGenerateAuthParam, IdServiceAuthCredential, IdServiceProcessCredData }
79 };
80 
OnTransmit(int64_t authSeq,const uint8_t * data,uint32_t len)81 static bool OnTransmit(int64_t authSeq, const uint8_t *data, uint32_t len)
82 {
83     AUTH_CHECK_AND_RETURN_RET_LOGE(len <= ONTRANSMIT_MAX_DATA_BUFFER_LEN, false, AUTH_HICHAIN,
84         "data len is invalid, len=%{public}u", len);
85     AUTH_LOGI(AUTH_HICHAIN, "hichain OnTransmit: authSeq=%{public}" PRId64 ", len=%{public}u", authSeq, len);
86     if (AuthSessionPostAuthData(authSeq, data, len) != SOFTBUS_OK) {
87         AUTH_LOGE(AUTH_HICHAIN, "hichain OnTransmit fail: authSeq=%{public}" PRId64, authSeq);
88         return false;
89     }
90     return true;
91 }
92 
DfxRecordLnnExchangekeyEnd(int64_t authSeq,int32_t reason)93 static void DfxRecordLnnExchangekeyEnd(int64_t authSeq, int32_t reason)
94 {
95     LnnEventExtra extra = { 0 };
96     LnnEventExtraInit(&extra);
97     extra.authId = (int32_t)authSeq;
98     extra.errcode = reason;
99     extra.result = (reason == SOFTBUS_OK) ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED;
100     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_EXCHANGE_CIPHER, extra);
101 }
102 
DfxRecordCertEndTime(int64_t authSeq)103 static void DfxRecordCertEndTime(int64_t authSeq)
104 {
105     uint64_t timeStamp = 0;
106     LnnEventExtra extra = { 0 };
107     (void)LnnEventExtraInit(&extra);
108     LnnTriggerInfo triggerInfo = { 0 };
109     GetLnnTriggerInfo(&triggerInfo);
110     timeStamp = SoftBusGetSysTimeMs();
111     extra.timeLatency = timeStamp - triggerInfo.triggerTime;
112     extra.authSeq = authSeq;
113     if (!RequireAuthLock()) {
114         return;
115     }
116     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
117     if (authFsm == NULL) {
118         AUTH_LOGE(AUTH_HICHAIN, "auth fsm not found");
119         ReleaseAuthLock();
120         return;
121     }
122     extra.peerUdidHash = authFsm->info.udidHash;
123     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_EXCHANGE_CIPHER, extra);
124     ReleaseAuthLock();
125 }
126 
OnSessionKeyReturned(int64_t authSeq,const uint8_t * sessionKey,uint32_t sessionKeyLen)127 static void OnSessionKeyReturned(int64_t authSeq, const uint8_t *sessionKey, uint32_t sessionKeyLen)
128 {
129     AUTH_LOGI(AUTH_HICHAIN, "hichain OnSessionKeyReturned: authSeq=%{public}" PRId64 ", len=%{public}u", authSeq,
130         sessionKeyLen);
131     if (sessionKey == NULL || sessionKeyLen > SESSION_KEY_LENGTH) {
132         DfxRecordLnnExchangekeyEnd(authSeq, SOFTBUS_AUTH_GET_SESSION_KEY_FAIL);
133         AUTH_LOGW(AUTH_HICHAIN, "invalid sessionKey");
134         return;
135     }
136     DfxRecordLnnExchangekeyEnd(authSeq, SOFTBUS_OK);
137     (void)AuthSessionSaveSessionKey(authSeq, sessionKey, sessionKeyLen);
138     DfxRecordCertEndTime(authSeq);
139 }
140 
DfxRecordLnnEndHichainEnd(int64_t authSeq,int32_t reason)141 static void DfxRecordLnnEndHichainEnd(int64_t authSeq, int32_t reason)
142 {
143     LnnEventExtra extra = { 0 };
144     LnnEventExtraInit(&extra);
145     extra.authId = (int32_t)authSeq;
146     extra.errcode = reason;
147     extra.result = (reason == SOFTBUS_OK) ? EVENT_STAGE_RESULT_OK : EVENT_STAGE_RESULT_FAILED;
148     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_HICHAIN_END, extra);
149 }
150 
OnFinish(int64_t authSeq,int operationCode,const char * returnData)151 static void OnFinish(int64_t authSeq, int operationCode, const char *returnData)
152 {
153     (void)returnData;
154     AclWriteState aclState = (operationCode == AUTH_FORM_IDENTICAL_ACCOUNT ? ACL_CAN_WRITE : ACL_NOT_WRITE);
155     DfxRecordLnnEndHichainEnd(authSeq, SOFTBUS_OK);
156     AUTH_LOGI(AUTH_HICHAIN, "hichain OnFinish: operationCode=%{public}d, authSeq=%{public}" PRId64,
157         operationCode, authSeq);
158     (void)AuthSessionHandleAuthFinish(authSeq, aclState);
159 }
160 
GetSoftbusHichainAuthErrorCode(uint32_t hichainErrCode,uint32_t * softbusErrCode)161 void GetSoftbusHichainAuthErrorCode(uint32_t hichainErrCode, uint32_t *softbusErrCode)
162 {
163     if (softbusErrCode == NULL) {
164         AUTH_LOGE(AUTH_HICHAIN, "softbusErrCode is null");
165         return;
166     }
167     if (hichainErrCode >= HICHAIN_DAS_ERRCODE_MIN && hichainErrCode <= HICHAIN_DAS_ERRCODE_MAX) {
168         *softbusErrCode = hichainErrCode & MASK_LOW_16BIT;
169         *softbusErrCode = -(((SOFTBUS_SUB_SYSTEM) << ERRCODE_SHIFT_21BIT) |
170             ((AUTH_SUB_MODULE_CODE) << ERRCODE_SHIFT_16BIT) | (*softbusErrCode | ERRCODE_OR_BIT));
171     } else if (hichainErrCode >= HICHAIN_COMMON_ERRCODE_MIN && hichainErrCode <= HICHAIN_COMMON_ERRCODE_MAX) {
172         uint32_t high4bit = 0;
173         uint32_t tempCode = 0;
174         high4bit = hichainErrCode & MASK_HIGH_4BIT;
175         high4bit = high4bit >> ERRCODE_SHIFT_12BIT;
176         tempCode = hichainErrCode & MASK_LOW_8BIT;
177         *softbusErrCode = -(((SOFTBUS_SUB_SYSTEM) << ERRCODE_SHIFT_21BIT) |
178             ((AUTH_SUB_MODULE_CODE) << ERRCODE_SHIFT_16BIT) | (tempCode | (high4bit << ERRCODE_SHIFT_8BIT)));
179     } else {
180         *softbusErrCode = hichainErrCode;
181         AUTH_LOGI(AUTH_HICHAIN, "unknow hichain errcode=%{public}d", hichainErrCode);
182     }
183 }
184 
GetDeviceSideFlag(int64_t authSeq,bool * flag)185 static int32_t GetDeviceSideFlag(int64_t authSeq, bool *flag)
186 {
187     if (!RequireAuthLock()) {
188         return SOFTBUS_LOCK_ERR;
189     }
190     AuthFsm *authFsm = GetAuthFsmByAuthSeq(authSeq);
191     if (authFsm == NULL) {
192         AUTH_LOGE(AUTH_HICHAIN, "auth fsm not found");
193         ReleaseAuthLock();
194         return SOFTBUS_AUTH_NOT_FOUND;
195     }
196     *flag = authFsm->info.isServer;
197     AUTH_LOGI(AUTH_HICHAIN, "find authFsm success, side=%{public}s", GetAuthSideStr(*flag));
198     ReleaseAuthLock();
199     return SOFTBUS_OK;
200 }
201 
CheckErrReturnValidity(const char * errorReturn)202 static int32_t CheckErrReturnValidity(const char *errorReturn)
203 {
204     cJSON *json = cJSON_Parse(errorReturn);
205     if (json == NULL) {
206         AUTH_LOGE(AUTH_HICHAIN, "parse json fail");
207         return SOFTBUS_PARSE_JSON_ERR;
208     }
209     cJSON_Delete(json);
210     return SOFTBUS_OK;
211 }
212 
ProcessAuthFailCallBack(void * para)213 static void ProcessAuthFailCallBack(void *para)
214 {
215     if (para == NULL) {
216         AUTH_LOGE(AUTH_HICHAIN, "invalid para");
217         return;
218     }
219     ProofInfo *proofInfo = (ProofInfo *)para;
220     if (AuthFailNotifyProofInfo(proofInfo->errCode, (char *)proofInfo->data, proofInfo->errorReturnLen) != SOFTBUS_OK) {
221         AUTH_LOGE(AUTH_HICHAIN, "AuthFailNotifyProofInfo fail");
222         SoftBusFree(proofInfo);
223         return;
224     }
225     SoftBusFree(proofInfo);
226 }
227 
NotifyAuthFailEvent(int32_t errCode,const char * errorReturn)228 static void NotifyAuthFailEvent(int32_t errCode, const char *errorReturn)
229 {
230     uint32_t errorReturnLen = strlen(errorReturn) + 1;
231     char *anonyErrorReturn = NULL;
232     Anonymize(errorReturn, &anonyErrorReturn);
233     AUTH_LOGW(AUTH_HICHAIN, "errorReturn=%{public}s, errorReturnLen=%{public}u, errCode=%{public}d",
234         AnonymizeWrapper(anonyErrorReturn), errorReturnLen, errCode);
235     AnonymizeFree(anonyErrorReturn);
236 
237     ProofInfo *proofInfo = (ProofInfo *)SoftBusCalloc(sizeof(ProofInfo) + errorReturnLen);
238     if (proofInfo == NULL) {
239         AUTH_LOGE(AUTH_HICHAIN, "proofInfo calloc fail");
240         return;
241     }
242     if (memcpy_s(proofInfo->data, errorReturnLen, (uint8_t *)errorReturn, errorReturnLen) != EOK) {
243         AUTH_LOGE(AUTH_HICHAIN, "memcpy_s errorReturn fail");
244         SoftBusFree(proofInfo);
245         return;
246     }
247     proofInfo->errorReturnLen = errorReturnLen;
248     proofInfo->errCode = errCode;
249     if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), ProcessAuthFailCallBack, (void *)proofInfo, 0) !=
250         SOFTBUS_OK) {
251         AUTH_LOGE(AUTH_HICHAIN, "set async ProcessAuthFailCallBack callback fail");
252         SoftBusFree(proofInfo);
253         return;
254     }
255 }
256 
NotifyPcAuthFail(int64_t authSeq,int errCode,const char * errorReturn)257 static void NotifyPcAuthFail(int64_t authSeq, int errCode, const char *errorReturn)
258 {
259     if (errorReturn != NULL && CheckErrReturnValidity(errorReturn) == SOFTBUS_OK) {
260         if (errCode == PC_AUTH_ERRCODE) {
261             NotifyAuthFailEvent(errCode, errorReturn);
262         }
263         if (errCode == PC_PROOF_NON_CONSISTENT_ERRCODE) {
264             bool flag = false;
265             if (GetDeviceSideFlag(authSeq, &flag) == SOFTBUS_OK && flag) {
266                 NotifyAuthFailEvent(errCode, errorReturn);
267             }
268         }
269     }
270     return;
271 }
272 
OnError(int64_t authSeq,int operationCode,int errCode,const char * errorReturn)273 static void OnError(int64_t authSeq, int operationCode, int errCode, const char *errorReturn)
274 {
275     (void)operationCode;
276     DfxRecordLnnEndHichainEnd(authSeq, errCode);
277     uint32_t authErrCode = 0;
278     (void)GetSoftbusHichainAuthErrorCode((uint32_t)errCode, &authErrCode);
279     AUTH_LOGE(AUTH_HICHAIN, "hichain OnError: authSeq=%{public}" PRId64 ", errCode=%{public}d authErrCode=%{public}d",
280         authSeq, errCode, authErrCode);
281     NotifyPcAuthFail(authSeq, errCode, errorReturn);
282     (void)AuthSessionHandleAuthError(authSeq, authErrCode);
283 }
284 
OnRequest(int64_t authSeq,int operationCode,const char * reqParams)285 static char *OnRequest(int64_t authSeq, int operationCode, const char *reqParams)
286 {
287     (void)reqParams;
288     AUTH_LOGI(AUTH_HICHAIN, "hichain OnRequest: authSeq=%{public}" PRId64 ", operationCode=%{public}d", authSeq,
289         operationCode);
290     char udid[UDID_BUF_LEN] = {0};
291     if (AuthSessionGetUdid(authSeq, udid, sizeof(udid)) != SOFTBUS_OK) {
292         AUTH_LOGE(AUTH_HICHAIN, "get udid fail");
293         return NULL;
294     }
295     cJSON *msg = cJSON_CreateObject();
296     if (msg == NULL) {
297         return NULL;
298     }
299 
300     int32_t version = 0;
301     if (AuthSessionGetAuthVersion(authSeq, &version) != SOFTBUS_OK) {
302         AUTH_LOGE(AUTH_HICHAIN, "get softbus version fail");
303         cJSON_Delete(msg);
304         return NULL;
305     }
306 
307     bool bFlag = version < AUTH_VERSION_V2;
308     char localUdid[UDID_BUF_LEN] = {0};
309     int32_t peerUserId = AuthSessionGetUserId(authSeq);
310     LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, UDID_BUF_LEN);
311     if (!AddNumberToJsonObject(msg, FIELD_CONFIRMATION, REQUEST_ACCEPTED) ||
312         !AddStringToJsonObject(msg, FIELD_SERVICE_PKG_NAME, AUTH_APPID) ||
313         (bFlag && !AddStringToJsonObject(msg, FIELD_PEER_CONN_DEVICE_ID, udid)) ||
314         (bFlag && !AddStringToJsonObject(msg, FIELD_DEVICE_ID, localUdid)) ||
315         !AddBoolToJsonObject(msg, FIELD_IS_UDID_HASH, false) ||
316         (peerUserId != 0 && !AddNumberToJsonObject(msg, "peerOsAccountId", peerUserId))) {
317         AUTH_LOGE(AUTH_HICHAIN, "pack request msg fail");
318         cJSON_Delete(msg);
319         return NULL;
320     }
321 
322     char* credId = AuthSessionGetCredId(authSeq);
323     if (!bFlag && !AddStringToJsonObject(msg, FIELD_CRED_ID, credId)) {
324         AUTH_LOGE(AUTH_HICHAIN, "pack cred id fail");
325         cJSON_Delete(msg);
326         return NULL;
327     }
328 
329     char *msgStr = cJSON_PrintUnformatted(msg);
330     if (msgStr == NULL) {
331         AUTH_LOGE(AUTH_HICHAIN, "cJSON_PrintUnformatted fail");
332         cJSON_Delete(msg);
333         return NULL;
334     }
335     cJSON_Delete(msg);
336     return msgStr;
337 }
338 
339 static DeviceAuthCallback g_hichainCallback = {
340     .onTransmit = OnTransmit,
341     .onSessionKeyReturned = OnSessionKeyReturned,
342     .onFinish = OnFinish,
343     .onError = OnError,
344     .onRequest = OnRequest
345 };
346 
GetUdidHash(const char * udid,char * udidHash)347 static int32_t GetUdidHash(const char *udid, char *udidHash)
348 {
349     if (udid == NULL || udidHash == NULL) {
350         AUTH_LOGE(AUTH_HICHAIN, "param error");
351         return SOFTBUS_INVALID_PARAM;
352     }
353     int32_t rc = SOFTBUS_OK;
354     uint8_t hash[UDID_HASH_LEN] = { 0 };
355     rc = SoftBusGenerateStrHash((uint8_t *)udid, strlen(udid), hash);
356     if (rc != SOFTBUS_OK) {
357         AUTH_LOGE(AUTH_HICHAIN, "generate udidhash fail");
358         return rc;
359     }
360     rc = ConvertBytesToHexString(udidHash, HB_SHORT_UDID_HASH_HEX_LEN + 1, hash, SHORT_UDID_HASH_LEN);
361     if (rc != SOFTBUS_OK) {
362         AUTH_LOGE(AUTH_HICHAIN, "convert bytes to string fail");
363         return rc;
364     }
365     return SOFTBUS_OK;
366 }
367 
DeletePcRestrictNode(const char * udid)368 static void DeletePcRestrictNode(const char *udid)
369 {
370     char peerUdidHash[HB_SHORT_UDID_HASH_HEX_LEN + 1] = { 0 };
371     uint32_t count = 0;
372 
373     if (GetUdidHash(udid, peerUdidHash) == SOFTBUS_OK && GetNodeFromPcRestrictMap(peerUdidHash, &count) == SOFTBUS_OK) {
374         DeleteNodeFromPcRestrictMap(peerUdidHash);
375         char *anonyUdid = NULL;
376         Anonymize(udid, &anonyUdid);
377         AUTH_LOGI(AUTH_HICHAIN, "delete restrict node success. udid=%{public}s", AnonymizeWrapper(anonyUdid));
378         AnonymizeFree(anonyUdid);
379     }
380 }
381 
ParseGroupInfo(const char * groupInfoStr,GroupInfo * groupInfo)382 static int32_t ParseGroupInfo(const char *groupInfoStr, GroupInfo *groupInfo)
383 {
384     cJSON *msg = cJSON_Parse(groupInfoStr);
385     if (msg == NULL) {
386         AUTH_LOGE(AUTH_HICHAIN, "parse json fail");
387         return SOFTBUS_PARSE_JSON_ERR;
388     }
389     if (!GetJsonObjectStringItem(msg, FIELD_GROUP_ID, groupInfo->groupId, GROUPID_BUF_LEN)) {
390         AUTH_LOGE(AUTH_HICHAIN, "get FIELD_GROUP_ID fail");
391         cJSON_Delete(msg);
392         return SOFTBUS_AUTH_GET_GROUP_ID_FAIL;
393     }
394     int32_t groupType = 0;
395     if (!GetJsonObjectNumberItem(msg, FIELD_GROUP_TYPE, &groupType)) {
396         AUTH_LOGE(AUTH_HICHAIN, "get FIELD_GROUP_TYPE fail");
397         cJSON_Delete(msg);
398         return SOFTBUS_AUTH_GET_GROUP_TYPE_FAIL;
399     }
400     groupInfo->groupType = (GroupType)groupType;
401     cJSON_Delete(msg);
402     return SOFTBUS_OK;
403 }
404 
OnGroupCreated(const char * groupInfo)405 static void OnGroupCreated(const char *groupInfo)
406 {
407     if (groupInfo == NULL) {
408         AUTH_LOGW(AUTH_HICHAIN, "invalid group info");
409         return;
410     }
411     GroupInfo info;
412     (void)memset_s(&info, sizeof(GroupInfo), 0, sizeof(GroupInfo));
413     if (ParseGroupInfo(groupInfo, &info) != SOFTBUS_OK) {
414         return;
415     }
416     AUTH_LOGI(AUTH_HICHAIN, "hichain OnGroupCreated, type=%{public}d", info.groupType);
417     if (g_dataChangeListener.onGroupCreated != NULL) {
418         g_dataChangeListener.onGroupCreated(info.groupId, (int32_t)info.groupType);
419     }
420 }
421 
OnDeviceBound(const char * udid,const char * groupInfo)422 static void OnDeviceBound(const char *udid, const char *groupInfo)
423 {
424     if (udid == NULL || groupInfo == NULL) {
425         AUTH_LOGW(AUTH_HICHAIN, "invalid udid");
426         return;
427     }
428     GroupInfo info;
429     (void)memset_s(&info, sizeof(GroupInfo), 0, sizeof(GroupInfo));
430     if (ParseGroupInfo(groupInfo, &info) != SOFTBUS_OK) {
431         return;
432     }
433     char *anonyUdid = NULL;
434     Anonymize(udid, &anonyUdid);
435     AUTH_LOGI(AUTH_HICHAIN, "hichain onDeviceBound, udid=%{public}s, type=%{public}d",
436         AnonymizeWrapper(anonyUdid), info.groupType);
437     AnonymizeFree(anonyUdid);
438     if (info.groupType == AUTH_IDENTICAL_ACCOUNT_GROUP) {
439         AUTH_LOGI(AUTH_HICHAIN, "ignore same account udid");
440         DeletePcRestrictNode(udid);
441         return;
442     }
443     char localUdid[UDID_BUF_LEN] = { 0 };
444     LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, UDID_BUF_LEN);
445     if (strcmp(localUdid, udid) == 0) {
446         AUTH_LOGI(AUTH_HICHAIN, "ignore local udid");
447         return;
448     }
449     if (g_dataChangeListener.onDeviceBound != NULL) {
450         g_dataChangeListener.onDeviceBound(udid, groupInfo);
451     }
452 }
453 
OnGroupDeleted(const char * groupInfo)454 static void OnGroupDeleted(const char *groupInfo)
455 {
456     if (groupInfo == NULL) {
457         AUTH_LOGE(AUTH_HICHAIN, "invalid group info");
458         return;
459     }
460     GroupInfo info;
461     (void)memset_s(&info, sizeof(GroupInfo), 0, sizeof(GroupInfo));
462     if (ParseGroupInfo(groupInfo, &info) != SOFTBUS_OK) {
463         return;
464     }
465     AUTH_LOGI(AUTH_HICHAIN, "hichain OnGroupDeleted, type=%{public}d", info.groupType);
466     if (g_dataChangeListener.onGroupDeleted != NULL) {
467         g_dataChangeListener.onGroupDeleted(info.groupId, info.groupType);
468     }
469 }
470 
OnDeviceNotTrusted(const char * udid)471 static void OnDeviceNotTrusted(const char *udid)
472 {
473     if (udid == NULL) {
474         AUTH_LOGW(AUTH_HICHAIN, "hichain get invalid udid");
475         return;
476     }
477     char *anonyUdid = NULL;
478     Anonymize(udid, &anonyUdid);
479     AUTH_LOGI(AUTH_HICHAIN, "hichain OnDeviceNotTrusted, udid=%{public}s", AnonymizeWrapper(anonyUdid));
480     AnonymizeFree(anonyUdid);
481     NodeInfo nodeInfo;
482     (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
483     int32_t ret = LnnGetRemoteNodeInfoById(udid, CATEGORY_UDID, &nodeInfo);
484     if (ret != SOFTBUS_OK) {
485         AUTH_LOGE(AUTH_HICHAIN, "LnnGetRemoteNodeInfoById failed! ret=%{public}d", ret);
486         return;
487     }
488     if (nodeInfo.deviceInfo.osType == OH_OS_TYPE) {
489         AUTH_LOGI(AUTH_HICHAIN, "device is oh, ignore hichain event");
490         return;
491     }
492     if (g_dataChangeListener.onDeviceNotTrusted != NULL) {
493         g_dataChangeListener.onDeviceNotTrusted(udid, GetActiveOsAccountIds());
494     }
495 }
496 
RegTrustDataChangeListener(const TrustDataChangeListener * listener)497 int32_t RegTrustDataChangeListener(const TrustDataChangeListener *listener)
498 {
499     if (listener == NULL) {
500         return SOFTBUS_INVALID_PARAM;
501     }
502     g_dataChangeListener = *listener;
503 
504     DataChangeListener hichainListener;
505     (void)memset_s(&hichainListener, sizeof(DataChangeListener), 0, sizeof(DataChangeListener));
506     hichainListener.onGroupCreated = OnGroupCreated;
507     hichainListener.onGroupDeleted = OnGroupDeleted;
508     hichainListener.onDeviceNotTrusted = OnDeviceNotTrusted;
509     hichainListener.onDeviceBound = OnDeviceBound;
510     if (RegChangeListener(AUTH_APPID, &hichainListener) != SOFTBUS_OK) {
511         AUTH_LOGE(AUTH_HICHAIN, "hichain regDataChangeListener fail");
512         return SOFTBUS_AUTH_REG_DATA_FAIL;
513     }
514     return SOFTBUS_OK;
515 }
516 
UnregTrustDataChangeListener(void)517 void UnregTrustDataChangeListener(void)
518 {
519     int32_t ret = UnregChangeListener(AUTH_APPID);
520     if (ret != SOFTBUS_OK) {
521         AUTH_LOGE(AUTH_HICHAIN, "hichain unRegDataChangeListener err=%{public}d", ret);
522     }
523     (void)memset_s(&g_dataChangeListener, sizeof(TrustDataChangeListener), 0, sizeof(TrustDataChangeListener));
524 }
525 
HichainStartAuth(int64_t authSeq,HiChainAuthParam * hiChainParam,HiChainAuthMode authMode)526 int32_t HichainStartAuth(int64_t authSeq, HiChainAuthParam *hiChainParam, HiChainAuthMode authMode)
527 {
528     if ((hiChainParam == NULL) || (authMode >= HICHAIN_AUTH_BUTT)) {
529         AUTH_LOGE(AUTH_HICHAIN, "hichain auth parameter invalid, mode=%{public}d", authMode);
530         return SOFTBUS_INVALID_PARAM;
531     }
532     char *authParams = g_hiChainAuthInterface[authMode].generateAuthParam(hiChainParam);
533     if (authParams == NULL) {
534         AUTH_LOGE(AUTH_HICHAIN, "generate auth param fail");
535         return SOFTBUS_CREATE_JSON_ERR;
536     }
537     int32_t ret = SOFTBUS_OK;
538     if (hiChainParam->cb == NULL) {
539         ret = g_hiChainAuthInterface[authMode].authenticate(
540             GetActiveOsAccountIds(), authSeq, authParams, &g_hichainCallback);
541     } else {
542         ret = g_hiChainAuthInterface[authMode].authenticate(
543             GetActiveOsAccountIds(), authSeq, authParams, hiChainParam->cb);
544     }
545     if (ret == SOFTBUS_OK) {
546         AUTH_LOGI(AUTH_HICHAIN, "hichain call authDevice succ");
547         cJSON_free(authParams);
548         return SOFTBUS_OK;
549     }
550     AUTH_LOGE(AUTH_HICHAIN, "hichain call authDevice failed");
551     cJSON_free(authParams);
552     return ret;
553 }
554 
HichainProcessData(int64_t authSeq,const uint8_t * data,uint32_t len,HiChainAuthMode authMode)555 int32_t HichainProcessData(int64_t authSeq, const uint8_t *data, uint32_t len, HiChainAuthMode authMode)
556 {
557     if (data == NULL) {
558         AUTH_LOGE(AUTH_HICHAIN, "data is null");
559         return SOFTBUS_INVALID_PARAM;
560     }
561 
562     if (authMode >= HICHAIN_AUTH_BUTT) {
563         AUTH_LOGE(AUTH_HICHAIN, "hichain auth mode invalid, mode=%{public}d", authMode);
564         return SOFTBUS_INVALID_PARAM;
565     }
566 
567     int32_t ret = g_hiChainAuthInterface[authMode].processAuthData(authSeq, data, len, &g_hichainCallback);
568     if (ret != SOFTBUS_OK) {
569         AUTH_LOGE(AUTH_HICHAIN, "hichain processData err=%{public}d", ret);
570         return ret;
571     }
572     return SOFTBUS_OK;
573 }
574 
HichainProcessUkNegoData(int64_t authSeq,const uint8_t * data,uint32_t len,HiChainAuthMode authMode,DeviceAuthCallback * cb)575 int32_t HichainProcessUkNegoData(
576     int64_t authSeq, const uint8_t *data, uint32_t len, HiChainAuthMode authMode, DeviceAuthCallback *cb)
577 {
578     AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_HICHAIN, "data is null");
579     int32_t ret = g_hiChainAuthInterface[authMode].processAuthData(authSeq, data, len, cb);
580     if (ret != SOFTBUS_OK) {
581         AUTH_LOGE(AUTH_HICHAIN, "hichain processData err=%{public}d", ret);
582         return ret;
583     }
584     return SOFTBUS_OK;
585 }
586 
HichainDestroy(void)587 void HichainDestroy(void)
588 {
589     UnregTrustDataChangeListener();
590     DestroyDeviceAuth();
591     AUTH_LOGI(AUTH_HICHAIN, "hichain destroy succ");
592 }
593 
HichainCancelRequest(int64_t authReqId)594 void HichainCancelRequest(int64_t authReqId)
595 {
596     CancelRequest(authReqId, AUTH_APPID);
597 }
598