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