117fd14ceSopenharmony_ci/*
217fd14ceSopenharmony_ci * Copyright (C) 2021-2023 Huawei Device Co., Ltd.
317fd14ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
417fd14ceSopenharmony_ci * you may not use this file except in compliance with the License.
517fd14ceSopenharmony_ci * You may obtain a copy of the License at
617fd14ceSopenharmony_ci *
717fd14ceSopenharmony_ci *    http://www.apache.org/licenses/LICENSE-2.0
817fd14ceSopenharmony_ci *
917fd14ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1017fd14ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1117fd14ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1217fd14ceSopenharmony_ci * See the License for the specific language governing permissions and
1317fd14ceSopenharmony_ci * limitations under the License.
1417fd14ceSopenharmony_ci */
1517fd14ceSopenharmony_ci
1617fd14ceSopenharmony_ci#include "device_auth.h"
1717fd14ceSopenharmony_ci
1817fd14ceSopenharmony_ci#include "account_auth_plugin_proxy.h"
1917fd14ceSopenharmony_ci#include "alg_loader.h"
2017fd14ceSopenharmony_ci#include "callback_manager.h"
2117fd14ceSopenharmony_ci#include "channel_manager.h"
2217fd14ceSopenharmony_ci#include "common_defs.h"
2317fd14ceSopenharmony_ci#include "cred_manager.h"
2417fd14ceSopenharmony_ci#include "data_manager.h"
2517fd14ceSopenharmony_ci#include "dev_auth_module_manager.h"
2617fd14ceSopenharmony_ci#include "dev_session_mgr.h"
2717fd14ceSopenharmony_ci#include "group_manager.h"
2817fd14ceSopenharmony_ci#include "group_operation_common.h"
2917fd14ceSopenharmony_ci#include "hc_dev_info.h"
3017fd14ceSopenharmony_ci#include "hc_init_protection.h"
3117fd14ceSopenharmony_ci#include "hc_log.h"
3217fd14ceSopenharmony_ci#include "hc_time.h"
3317fd14ceSopenharmony_ci#include "hisysevent_adapter.h"
3417fd14ceSopenharmony_ci#include "hitrace_adapter.h"
3517fd14ceSopenharmony_ci#include "json_utils.h"
3617fd14ceSopenharmony_ci#include "key_manager.h"
3717fd14ceSopenharmony_ci#include "os_account_adapter.h"
3817fd14ceSopenharmony_ci#include "plugin_adapter.h"
3917fd14ceSopenharmony_ci#include "pseudonym_manager.h"
4017fd14ceSopenharmony_ci#include "task_manager.h"
4117fd14ceSopenharmony_ci#include "performance_dumper.h"
4217fd14ceSopenharmony_ci#include "identity_manager.h"
4317fd14ceSopenharmony_ci#include "group_auth_manager.h"
4417fd14ceSopenharmony_ci
4517fd14ceSopenharmony_cistatic GroupAuthManager *g_groupAuthManager =  NULL;
4617fd14ceSopenharmony_cistatic DeviceGroupManager *g_groupManagerInstance = NULL;
4717fd14ceSopenharmony_ci
4817fd14ceSopenharmony_citypedef struct {
4917fd14ceSopenharmony_ci    HcTaskBase base;
5017fd14ceSopenharmony_ci    int64_t sessionId;
5117fd14ceSopenharmony_ci} StartSessionTask;
5217fd14ceSopenharmony_ci
5317fd14ceSopenharmony_citypedef struct {
5417fd14ceSopenharmony_ci    HcTaskBase base;
5517fd14ceSopenharmony_ci    int64_t sessionId;
5617fd14ceSopenharmony_ci    CJson *receivedMsg;
5717fd14ceSopenharmony_ci} ProcSessionTask;
5817fd14ceSopenharmony_ci
5917fd14ceSopenharmony_citypedef struct {
6017fd14ceSopenharmony_ci    HcTaskBase base;
6117fd14ceSopenharmony_ci    int64_t requestId;
6217fd14ceSopenharmony_ci} SoftBusTask;
6317fd14ceSopenharmony_ci
6417fd14ceSopenharmony_cistatic int32_t IsDeviceIdHashMatch(const char *udid, const char *subUdidHash)
6517fd14ceSopenharmony_ci{
6617fd14ceSopenharmony_ci    Uint8Buff udidBuf = { (uint8_t *)udid, (uint32_t)HcStrlen(udid) };
6717fd14ceSopenharmony_ci    uint8_t udidHashByte[SHA256_LEN] = { 0 };
6817fd14ceSopenharmony_ci    Uint8Buff udidHashBuf = { udidHashByte, sizeof(udidHashByte) };
6917fd14ceSopenharmony_ci    int32_t ret = GetLoaderInstance()->sha256(&udidBuf, &udidHashBuf);
7017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
7117fd14ceSopenharmony_ci        LOGE("sha256 failed, ret:%d", ret);
7217fd14ceSopenharmony_ci        return ret;
7317fd14ceSopenharmony_ci    }
7417fd14ceSopenharmony_ci    uint32_t udidHashLen = SHA256_LEN * BYTE_TO_HEX_OPER_LENGTH + 1;
7517fd14ceSopenharmony_ci    char *udidHash = (char *)HcMalloc(udidHashLen, 0);
7617fd14ceSopenharmony_ci    if (udidHash == NULL) {
7717fd14ceSopenharmony_ci        LOGE("malloc udidHash string failed");
7817fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
7917fd14ceSopenharmony_ci    }
8017fd14ceSopenharmony_ci    ret = ByteToHexString(udidHashByte, SHA256_LEN, udidHash, udidHashLen);
8117fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
8217fd14ceSopenharmony_ci        LOGE("Byte to hexString failed, ret:%d", ret);
8317fd14ceSopenharmony_ci        HcFree(udidHash);
8417fd14ceSopenharmony_ci        return ret;
8517fd14ceSopenharmony_ci    }
8617fd14ceSopenharmony_ci    char *subUdidHashUpper = NULL;
8717fd14ceSopenharmony_ci    ret = ToUpperCase(subUdidHash, &subUdidHashUpper);
8817fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
8917fd14ceSopenharmony_ci        LOGE("Failed to convert the input sub udid hash to upper case!");
9017fd14ceSopenharmony_ci        HcFree(udidHash);
9117fd14ceSopenharmony_ci        return ret;
9217fd14ceSopenharmony_ci    }
9317fd14ceSopenharmony_ci    if (strstr((const char *)udidHash, subUdidHashUpper) != NULL) {
9417fd14ceSopenharmony_ci        LOGI("udid hash is match!");
9517fd14ceSopenharmony_ci        HcFree(udidHash);
9617fd14ceSopenharmony_ci        HcFree(subUdidHashUpper);
9717fd14ceSopenharmony_ci        return HC_SUCCESS;
9817fd14ceSopenharmony_ci    }
9917fd14ceSopenharmony_ci    HcFree(udidHash);
10017fd14ceSopenharmony_ci    HcFree(subUdidHashUpper);
10117fd14ceSopenharmony_ci    return HC_ERROR;
10217fd14ceSopenharmony_ci}
10317fd14ceSopenharmony_ci
10417fd14ceSopenharmony_cistatic const char *GetUdidByGroup(int32_t osAccountId, const char *groupId, const char *deviceIdHash)
10517fd14ceSopenharmony_ci{
10617fd14ceSopenharmony_ci    uint32_t index;
10717fd14ceSopenharmony_ci    TrustedDeviceEntry **deviceEntry = NULL;
10817fd14ceSopenharmony_ci    DeviceEntryVec deviceEntryVec = CREATE_HC_VECTOR(DeviceEntryVec);
10917fd14ceSopenharmony_ci    QueryDeviceParams params = InitQueryDeviceParams();
11017fd14ceSopenharmony_ci    params.groupId = groupId;
11117fd14ceSopenharmony_ci    if (QueryDevices(osAccountId, &params, &deviceEntryVec) != HC_SUCCESS) {
11217fd14ceSopenharmony_ci        LOGE("query trusted devices failed!");
11317fd14ceSopenharmony_ci        ClearDeviceEntryVec(&deviceEntryVec);
11417fd14ceSopenharmony_ci        return NULL;
11517fd14ceSopenharmony_ci    }
11617fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(deviceEntryVec, index, deviceEntry) {
11717fd14ceSopenharmony_ci        const char *udid = StringGet(&(*deviceEntry)->udid);
11817fd14ceSopenharmony_ci        if (IsDeviceIdHashMatch(udid, deviceIdHash) == HC_SUCCESS) {
11917fd14ceSopenharmony_ci            ClearDeviceEntryVec(&deviceEntryVec);
12017fd14ceSopenharmony_ci            return udid;
12117fd14ceSopenharmony_ci        }
12217fd14ceSopenharmony_ci        continue;
12317fd14ceSopenharmony_ci    }
12417fd14ceSopenharmony_ci    ClearDeviceEntryVec(&deviceEntryVec);
12517fd14ceSopenharmony_ci    return NULL;
12617fd14ceSopenharmony_ci}
12717fd14ceSopenharmony_ci
12817fd14ceSopenharmony_cistatic const char *GetDeviceIdByUdidHash(int32_t osAccountId, const char *deviceIdHash)
12917fd14ceSopenharmony_ci{
13017fd14ceSopenharmony_ci    if (deviceIdHash == NULL) {
13117fd14ceSopenharmony_ci        LOGE("deviceIdHash is null");
13217fd14ceSopenharmony_ci        return NULL;
13317fd14ceSopenharmony_ci    }
13417fd14ceSopenharmony_ci    QueryGroupParams queryParams = InitQueryGroupParams();
13517fd14ceSopenharmony_ci    GroupEntryVec groupEntryVec = CreateGroupEntryVec();
13617fd14ceSopenharmony_ci    int32_t ret = QueryGroups(osAccountId, &queryParams, &groupEntryVec);
13717fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
13817fd14ceSopenharmony_ci        LOGE("Failed to query groups!");
13917fd14ceSopenharmony_ci        ClearGroupEntryVec(&groupEntryVec);
14017fd14ceSopenharmony_ci        return NULL;
14117fd14ceSopenharmony_ci    }
14217fd14ceSopenharmony_ci    uint32_t index;
14317fd14ceSopenharmony_ci    TrustedGroupEntry **ptr = NULL;
14417fd14ceSopenharmony_ci    FOR_EACH_HC_VECTOR(groupEntryVec, index, ptr) {
14517fd14ceSopenharmony_ci        const TrustedGroupEntry *groupEntry = (const TrustedGroupEntry *)(*ptr);
14617fd14ceSopenharmony_ci        const char *groupId = StringGet(&(groupEntry->id));
14717fd14ceSopenharmony_ci        if (groupId == NULL) {
14817fd14ceSopenharmony_ci            continue;
14917fd14ceSopenharmony_ci        }
15017fd14ceSopenharmony_ci        const char *udid = GetUdidByGroup(osAccountId, groupId, deviceIdHash);
15117fd14ceSopenharmony_ci        if (udid != NULL) {
15217fd14ceSopenharmony_ci            ClearGroupEntryVec(&groupEntryVec);
15317fd14ceSopenharmony_ci            return udid;
15417fd14ceSopenharmony_ci        }
15517fd14ceSopenharmony_ci    }
15617fd14ceSopenharmony_ci    ClearGroupEntryVec(&groupEntryVec);
15717fd14ceSopenharmony_ci    return NULL;
15817fd14ceSopenharmony_ci}
15917fd14ceSopenharmony_ci
16017fd14ceSopenharmony_cistatic const char *GetPeerUdidFromJson(int32_t osAccountId, const CJson *in)
16117fd14ceSopenharmony_ci{
16217fd14ceSopenharmony_ci    const char *peerConnDeviceId = GetStringFromJson(in, FIELD_PEER_CONN_DEVICE_ID);
16317fd14ceSopenharmony_ci    if (peerConnDeviceId == NULL) {
16417fd14ceSopenharmony_ci        LOGI("get peerConnDeviceId from json fail.");
16517fd14ceSopenharmony_ci        return NULL;
16617fd14ceSopenharmony_ci    }
16717fd14ceSopenharmony_ci    bool isUdidHash = false;
16817fd14ceSopenharmony_ci    (void)GetBoolFromJson(in, FIELD_IS_UDID_HASH, &isUdidHash);
16917fd14ceSopenharmony_ci    if (isUdidHash) {
17017fd14ceSopenharmony_ci        const char *deviceId = GetDeviceIdByUdidHash(osAccountId, peerConnDeviceId);
17117fd14ceSopenharmony_ci        return (deviceId == NULL ? peerConnDeviceId : deviceId);
17217fd14ceSopenharmony_ci    }
17317fd14ceSopenharmony_ci    return peerConnDeviceId;
17417fd14ceSopenharmony_ci}
17517fd14ceSopenharmony_ci
17617fd14ceSopenharmony_cistatic int32_t AddGroupInfoToContextByInput(const CJson *receivedMsg, CJson *context)
17717fd14ceSopenharmony_ci{
17817fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(receivedMsg, FIELD_GROUP_ID);
17917fd14ceSopenharmony_ci    if (groupId == NULL) {
18017fd14ceSopenharmony_ci        LOGE("get groupId from json fail.");
18117fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
18217fd14ceSopenharmony_ci    }
18317fd14ceSopenharmony_ci    const char *groupName = GetStringFromJson(receivedMsg, FIELD_GROUP_NAME);
18417fd14ceSopenharmony_ci    if (groupName == NULL) {
18517fd14ceSopenharmony_ci        LOGE("Failed to get groupName from jsonParams!");
18617fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
18717fd14ceSopenharmony_ci    }
18817fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_GROUP_ID, groupId) != HC_SUCCESS) {
18917fd14ceSopenharmony_ci        LOGE("Failed to add groupId to json!");
19017fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
19117fd14ceSopenharmony_ci    }
19217fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_GROUP_TYPE, PEER_TO_PEER_GROUP) != HC_SUCCESS) {
19317fd14ceSopenharmony_ci        LOGE("Failed to add groupType to json!");
19417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
19517fd14ceSopenharmony_ci    }
19617fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_GROUP_NAME, groupName) != HC_SUCCESS) {
19717fd14ceSopenharmony_ci        LOGE("Failed to add groupName to json!");
19817fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
19917fd14ceSopenharmony_ci    }
20017fd14ceSopenharmony_ci    return HC_SUCCESS;
20117fd14ceSopenharmony_ci}
20217fd14ceSopenharmony_ci
20317fd14ceSopenharmony_cistatic int32_t AddDevInfoToContextByInput(CJson *context)
20417fd14ceSopenharmony_ci{
20517fd14ceSopenharmony_ci    int32_t userType = DEVICE_TYPE_ACCESSORY;
20617fd14ceSopenharmony_ci    (void)GetIntFromJson(context, FIELD_USER_TYPE, &userType);
20717fd14ceSopenharmony_ci    const char *authId = GetStringFromJson(context, FIELD_DEVICE_ID);
20817fd14ceSopenharmony_ci    char udid[INPUT_UDID_LEN] = { 0 };
20917fd14ceSopenharmony_ci    if (authId == NULL) {
21017fd14ceSopenharmony_ci        LOGD("No authId is found. The default value is udid!");
21117fd14ceSopenharmony_ci        int32_t res = HcGetUdid((uint8_t *)udid, INPUT_UDID_LEN);
21217fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
21317fd14ceSopenharmony_ci            LOGE("Failed to get local udid! res: %d", res);
21417fd14ceSopenharmony_ci            return HC_ERR_DB;
21517fd14ceSopenharmony_ci        }
21617fd14ceSopenharmony_ci        authId = udid;
21717fd14ceSopenharmony_ci    }
21817fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_AUTH_ID, authId) != HC_SUCCESS) {
21917fd14ceSopenharmony_ci        LOGE("Failed to add authId to params!");
22017fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
22117fd14ceSopenharmony_ci    }
22217fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_USER_TYPE, userType) != HC_SUCCESS) {
22317fd14ceSopenharmony_ci        LOGE("Failed to add userType to params!");
22417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
22517fd14ceSopenharmony_ci    }
22617fd14ceSopenharmony_ci    return HC_SUCCESS;
22717fd14ceSopenharmony_ci}
22817fd14ceSopenharmony_ci
22917fd14ceSopenharmony_cistatic int32_t AddGroupInfoToContextByDb(const char *groupId, CJson *context)
23017fd14ceSopenharmony_ci{
23117fd14ceSopenharmony_ci    int32_t osAccountId;
23217fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
23317fd14ceSopenharmony_ci        LOGE("get osAccountId from json fail.");
23417fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
23517fd14ceSopenharmony_ci    }
23617fd14ceSopenharmony_ci    TrustedGroupEntry *entry = GetGroupEntryById(osAccountId, groupId);
23717fd14ceSopenharmony_ci    if (entry == NULL) {
23817fd14ceSopenharmony_ci        LOGE("Failed to get groupEntry from db!");
23917fd14ceSopenharmony_ci        return HC_ERR_DB;
24017fd14ceSopenharmony_ci    }
24117fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_GROUP_ID, StringGet(&entry->id)) != HC_SUCCESS) {
24217fd14ceSopenharmony_ci        LOGE("Failed to add groupId to json!");
24317fd14ceSopenharmony_ci        DestroyGroupEntry(entry);
24417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
24517fd14ceSopenharmony_ci    }
24617fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_GROUP_TYPE, entry->type) != HC_SUCCESS) {
24717fd14ceSopenharmony_ci        LOGE("Failed to add groupType to json!");
24817fd14ceSopenharmony_ci        DestroyGroupEntry(entry);
24917fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
25017fd14ceSopenharmony_ci    }
25117fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_GROUP_NAME, StringGet(&entry->name)) != HC_SUCCESS) {
25217fd14ceSopenharmony_ci        LOGE("Failed to add groupName to json!");
25317fd14ceSopenharmony_ci        DestroyGroupEntry(entry);
25417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
25517fd14ceSopenharmony_ci    }
25617fd14ceSopenharmony_ci    DestroyGroupEntry(entry);
25717fd14ceSopenharmony_ci    return HC_SUCCESS;
25817fd14ceSopenharmony_ci}
25917fd14ceSopenharmony_ci
26017fd14ceSopenharmony_cistatic int32_t AddDevInfoToContextByDb(const char *groupId, CJson *context)
26117fd14ceSopenharmony_ci{
26217fd14ceSopenharmony_ci    int32_t osAccountId;
26317fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
26417fd14ceSopenharmony_ci        LOGE("get osAccountId from json fail.");
26517fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
26617fd14ceSopenharmony_ci    }
26717fd14ceSopenharmony_ci    char udid[INPUT_UDID_LEN] = { 0 };
26817fd14ceSopenharmony_ci    int32_t res = HcGetUdid((uint8_t *)udid, INPUT_UDID_LEN);
26917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
27017fd14ceSopenharmony_ci        LOGE("Failed to get local udid! res: %d", res);
27117fd14ceSopenharmony_ci        return HC_ERR_DB;
27217fd14ceSopenharmony_ci    }
27317fd14ceSopenharmony_ci    TrustedDeviceEntry *devAuthParams = CreateDeviceEntry();
27417fd14ceSopenharmony_ci    if (devAuthParams == NULL) {
27517fd14ceSopenharmony_ci        LOGE("Failed to allocate devEntry memory!");
27617fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
27717fd14ceSopenharmony_ci    }
27817fd14ceSopenharmony_ci    if (GetTrustedDevInfoById(osAccountId, udid, true, groupId, devAuthParams) != HC_SUCCESS) {
27917fd14ceSopenharmony_ci        LOGE("Failed to obtain the local device information from the database!");
28017fd14ceSopenharmony_ci        DestroyDeviceEntry(devAuthParams);
28117fd14ceSopenharmony_ci        return HC_ERR_DB;
28217fd14ceSopenharmony_ci    }
28317fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_AUTH_ID, StringGet(&devAuthParams->authId)) != HC_SUCCESS) {
28417fd14ceSopenharmony_ci        LOGE("Failed to add authId to params!");
28517fd14ceSopenharmony_ci        DestroyDeviceEntry(devAuthParams);
28617fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
28717fd14ceSopenharmony_ci    }
28817fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_USER_TYPE, devAuthParams->devType) != HC_SUCCESS) {
28917fd14ceSopenharmony_ci        LOGE("Failed to add userType to params!");
29017fd14ceSopenharmony_ci        DestroyDeviceEntry(devAuthParams);
29117fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
29217fd14ceSopenharmony_ci    }
29317fd14ceSopenharmony_ci    DestroyDeviceEntry(devAuthParams);
29417fd14ceSopenharmony_ci    return HC_SUCCESS;
29517fd14ceSopenharmony_ci}
29617fd14ceSopenharmony_ci
29717fd14ceSopenharmony_cistatic int32_t GetOpCodeFromContext(const CJson *context)
29817fd14ceSopenharmony_ci{
29917fd14ceSopenharmony_ci    bool isAdmin = true;
30017fd14ceSopenharmony_ci    (void)GetBoolFromJson(context, FIELD_IS_ADMIN, &isAdmin);
30117fd14ceSopenharmony_ci    return isAdmin ? MEMBER_INVITE : MEMBER_JOIN;
30217fd14ceSopenharmony_ci}
30317fd14ceSopenharmony_ci
30417fd14ceSopenharmony_cistatic int32_t AddClientReqInfoToContext(int32_t osAccountId, int64_t requestId, const char *appId, CJson *context)
30517fd14ceSopenharmony_ci{
30617fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(context, FIELD_GROUP_ID);
30717fd14ceSopenharmony_ci    if (groupId == NULL) {
30817fd14ceSopenharmony_ci        LOGE("get groupId from json fail.");
30917fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
31017fd14ceSopenharmony_ci    }
31117fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_BIND, true) != HC_SUCCESS) {
31217fd14ceSopenharmony_ci        LOGE("add isBind to context fail.");
31317fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
31417fd14ceSopenharmony_ci    }
31517fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_CLIENT, true) != HC_SUCCESS) {
31617fd14ceSopenharmony_ci        LOGE("add isClient to context fail.");
31717fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
31817fd14ceSopenharmony_ci    }
31917fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OS_ACCOUNT_ID, osAccountId) != HC_SUCCESS) {
32017fd14ceSopenharmony_ci        LOGE("add osAccountId to context fail.");
32117fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
32217fd14ceSopenharmony_ci    }
32317fd14ceSopenharmony_ci    if (AddInt64StringToJson(context, FIELD_REQUEST_ID, requestId) != HC_SUCCESS) {
32417fd14ceSopenharmony_ci        LOGE("add requestId to context fail.");
32517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
32617fd14ceSopenharmony_ci    }
32717fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_APP_ID, appId) != HC_SUCCESS) {
32817fd14ceSopenharmony_ci        LOGE("add appId to context fail.");
32917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
33017fd14ceSopenharmony_ci    }
33117fd14ceSopenharmony_ci    int32_t opCode = GetOpCodeFromContext(context);
33217fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, opCode) != HC_SUCCESS) {
33317fd14ceSopenharmony_ci        LOGE("add operationCode to context fail.");
33417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
33517fd14ceSopenharmony_ci    }
33617fd14ceSopenharmony_ci    if (opCode == MEMBER_JOIN) {
33717fd14ceSopenharmony_ci        return AddDevInfoToContextByInput(context);
33817fd14ceSopenharmony_ci    }
33917fd14ceSopenharmony_ci    int32_t res = AddDevInfoToContextByDb(groupId, context);
34017fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
34117fd14ceSopenharmony_ci        return res;
34217fd14ceSopenharmony_ci    }
34317fd14ceSopenharmony_ci    return AddGroupInfoToContextByDb(groupId, context);
34417fd14ceSopenharmony_ci}
34517fd14ceSopenharmony_ci
34617fd14ceSopenharmony_cistatic int32_t AddChannelInfoToContext(int32_t channelType, int64_t channelId, CJson *context)
34717fd14ceSopenharmony_ci{
34817fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_CHANNEL_TYPE, channelType) != HC_SUCCESS) {
34917fd14ceSopenharmony_ci        LOGE("add channelType to context fail.");
35017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
35117fd14ceSopenharmony_ci    }
35217fd14ceSopenharmony_ci    if (AddByteToJson(context, FIELD_CHANNEL_ID, (uint8_t *)&channelId, sizeof(int64_t)) != HC_SUCCESS) {
35317fd14ceSopenharmony_ci        LOGE("add channelId to context fail.");
35417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
35517fd14ceSopenharmony_ci    }
35617fd14ceSopenharmony_ci    return HC_SUCCESS;
35717fd14ceSopenharmony_ci}
35817fd14ceSopenharmony_ci
35917fd14ceSopenharmony_cistatic int32_t BuildClientBindContext(int32_t osAccountId, int64_t requestId, const char *appId,
36017fd14ceSopenharmony_ci    const DeviceAuthCallback *callback, CJson *context)
36117fd14ceSopenharmony_ci{
36217fd14ceSopenharmony_ci    int32_t res = AddClientReqInfoToContext(osAccountId, requestId, appId, context);
36317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
36417fd14ceSopenharmony_ci        return res;
36517fd14ceSopenharmony_ci    }
36617fd14ceSopenharmony_ci    ChannelType channelType = GetChannelType(callback, context);
36717fd14ceSopenharmony_ci    int64_t channelId;
36817fd14ceSopenharmony_ci    res = OpenChannel(channelType, context, requestId, &channelId);
36917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
37017fd14ceSopenharmony_ci        LOGE("open channel fail.");
37117fd14ceSopenharmony_ci        return res;
37217fd14ceSopenharmony_ci    }
37317fd14ceSopenharmony_ci    return AddChannelInfoToContext(channelType, channelId, context);
37417fd14ceSopenharmony_ci}
37517fd14ceSopenharmony_ci
37617fd14ceSopenharmony_cistatic void DoStartSession(HcTaskBase *task)
37717fd14ceSopenharmony_ci{
37817fd14ceSopenharmony_ci    LOGI("start session task begin.");
37917fd14ceSopenharmony_ci    if (task == NULL) {
38017fd14ceSopenharmony_ci        LOGE("The input task is NULL, can't start session!");
38117fd14ceSopenharmony_ci        return;
38217fd14ceSopenharmony_ci    }
38317fd14ceSopenharmony_ci    StartSessionTask *realTask = (StartSessionTask *)task;
38417fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
38517fd14ceSopenharmony_ci    SET_TRACE_ID(realTask->sessionId);
38617fd14ceSopenharmony_ci    int32_t res = StartDevSession(realTask->sessionId);
38717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
38817fd14ceSopenharmony_ci        LOGE("start session fail.[Res]: %d", res);
38917fd14ceSopenharmony_ci        CloseDevSession(realTask->sessionId);
39017fd14ceSopenharmony_ci    }
39117fd14ceSopenharmony_ci}
39217fd14ceSopenharmony_ci
39317fd14ceSopenharmony_cistatic void DoProcSession(HcTaskBase *task)
39417fd14ceSopenharmony_ci{
39517fd14ceSopenharmony_ci    LOGI("proc session task begin.");
39617fd14ceSopenharmony_ci    if (task == NULL) {
39717fd14ceSopenharmony_ci        LOGE("The input task is NULL, can't start session!");
39817fd14ceSopenharmony_ci        return;
39917fd14ceSopenharmony_ci    }
40017fd14ceSopenharmony_ci    ProcSessionTask *realTask = (ProcSessionTask *)task;
40117fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
40217fd14ceSopenharmony_ci    SET_TRACE_ID(realTask->sessionId);
40317fd14ceSopenharmony_ci    bool isFinish = false;
40417fd14ceSopenharmony_ci    int32_t res = ProcessDevSession(realTask->sessionId, realTask->receivedMsg, &isFinish);
40517fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
40617fd14ceSopenharmony_ci        LOGE("ProcessDevSession fail. [Res]: %d", res);
40717fd14ceSopenharmony_ci        CloseDevSession(realTask->sessionId);
40817fd14ceSopenharmony_ci        return;
40917fd14ceSopenharmony_ci    }
41017fd14ceSopenharmony_ci    LOGI("ProcessDevSession success. [State]: %s", isFinish ? "FINISH" : "CONTINUE");
41117fd14ceSopenharmony_ci    if (isFinish) {
41217fd14ceSopenharmony_ci        CloseDevSession(realTask->sessionId);
41317fd14ceSopenharmony_ci    }
41417fd14ceSopenharmony_ci}
41517fd14ceSopenharmony_ci
41617fd14ceSopenharmony_cistatic void InitStartSessionTask(StartSessionTask *task, int64_t sessionId)
41717fd14ceSopenharmony_ci{
41817fd14ceSopenharmony_ci    task->base.doAction = DoStartSession;
41917fd14ceSopenharmony_ci    task->base.destroy = NULL;
42017fd14ceSopenharmony_ci    task->sessionId = sessionId;
42117fd14ceSopenharmony_ci}
42217fd14ceSopenharmony_ci
42317fd14ceSopenharmony_cistatic void DestroyProcSessionTask(HcTaskBase *task)
42417fd14ceSopenharmony_ci{
42517fd14ceSopenharmony_ci    ProcSessionTask *realTask = (ProcSessionTask *)task;
42617fd14ceSopenharmony_ci    FreeJson(realTask->receivedMsg);
42717fd14ceSopenharmony_ci}
42817fd14ceSopenharmony_ci
42917fd14ceSopenharmony_cistatic void InitProcSessionTask(ProcSessionTask *task, int64_t sessionId, CJson *receivedMsg)
43017fd14ceSopenharmony_ci{
43117fd14ceSopenharmony_ci    task->base.doAction = DoProcSession;
43217fd14ceSopenharmony_ci    task->base.destroy = DestroyProcSessionTask;
43317fd14ceSopenharmony_ci    task->sessionId = sessionId;
43417fd14ceSopenharmony_ci    task->receivedMsg = receivedMsg;
43517fd14ceSopenharmony_ci}
43617fd14ceSopenharmony_ci
43717fd14ceSopenharmony_cistatic int32_t PushStartSessionTask(int64_t sessionId)
43817fd14ceSopenharmony_ci{
43917fd14ceSopenharmony_ci    StartSessionTask *task = (StartSessionTask *)HcMalloc(sizeof(StartSessionTask), 0);
44017fd14ceSopenharmony_ci    if (task == NULL) {
44117fd14ceSopenharmony_ci        LOGE("Failed to allocate memory for task!");
44217fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
44317fd14ceSopenharmony_ci    }
44417fd14ceSopenharmony_ci    InitStartSessionTask(task, sessionId);
44517fd14ceSopenharmony_ci    if (PushTask((HcTaskBase*)task) != HC_SUCCESS) {
44617fd14ceSopenharmony_ci        LOGE("push start session task fail.");
44717fd14ceSopenharmony_ci        HcFree(task);
44817fd14ceSopenharmony_ci        return HC_ERR_INIT_TASK_FAIL;
44917fd14ceSopenharmony_ci    }
45017fd14ceSopenharmony_ci    LOGI("push start session task success.");
45117fd14ceSopenharmony_ci    return HC_SUCCESS;
45217fd14ceSopenharmony_ci}
45317fd14ceSopenharmony_ci
45417fd14ceSopenharmony_cistatic int32_t AddOriginDataForPlugin(CJson *receivedMsg, const uint8_t *data)
45517fd14ceSopenharmony_ci{
45617fd14ceSopenharmony_ci    if ((receivedMsg == NULL) || (data == NULL)) {
45717fd14ceSopenharmony_ci        LOGE("Invalid params");
45817fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
45917fd14ceSopenharmony_ci    }
46017fd14ceSopenharmony_ci    return AddStringToJson(receivedMsg, FIELD_PLUGIN_EXT_DATA, (const char *)data);
46117fd14ceSopenharmony_ci}
46217fd14ceSopenharmony_ci
46317fd14ceSopenharmony_cistatic int32_t PushProcSessionTask(int64_t sessionId, CJson *receivedMsg)
46417fd14ceSopenharmony_ci{
46517fd14ceSopenharmony_ci    ProcSessionTask *task = (ProcSessionTask *)HcMalloc(sizeof(ProcSessionTask), 0);
46617fd14ceSopenharmony_ci    if (task == NULL) {
46717fd14ceSopenharmony_ci        LOGE("Failed to allocate memory for task!");
46817fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
46917fd14ceSopenharmony_ci    }
47017fd14ceSopenharmony_ci    InitProcSessionTask(task, sessionId, receivedMsg);
47117fd14ceSopenharmony_ci    if (PushTask((HcTaskBase*)task) != HC_SUCCESS) {
47217fd14ceSopenharmony_ci        LOGE("push start session task fail.");
47317fd14ceSopenharmony_ci        HcFree(task);
47417fd14ceSopenharmony_ci        return HC_ERR_INIT_TASK_FAIL;
47517fd14ceSopenharmony_ci    }
47617fd14ceSopenharmony_ci    LOGI("push start session task success.");
47717fd14ceSopenharmony_ci    return HC_SUCCESS;
47817fd14ceSopenharmony_ci}
47917fd14ceSopenharmony_ci
48017fd14ceSopenharmony_ci#ifdef ENABLE_P2P_BIND_LITE_PROTOCOL_CHECK
48117fd14ceSopenharmony_ci// If bind with iso short pin, groupVisibility must be private
48217fd14ceSopenharmony_cistatic int32_t CheckGroupVisibility(const CJson *context)
48317fd14ceSopenharmony_ci{
48417fd14ceSopenharmony_ci    int32_t osAccountId = INVALID_OS_ACCOUNT;
48517fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
48617fd14ceSopenharmony_ci        LOGE("Failed to get osAccountId!");
48717fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
48817fd14ceSopenharmony_ci    }
48917fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(context, FIELD_GROUP_ID);
49017fd14ceSopenharmony_ci    if (groupId == NULL) {
49117fd14ceSopenharmony_ci        LOGE("Failed to get groupId!");
49217fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
49317fd14ceSopenharmony_ci    }
49417fd14ceSopenharmony_ci    const char *appId = GetStringFromJson(context, FIELD_APP_ID);
49517fd14ceSopenharmony_ci    if (appId == NULL) {
49617fd14ceSopenharmony_ci        LOGE("Failed to get appId!");
49717fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
49817fd14ceSopenharmony_ci    }
49917fd14ceSopenharmony_ci    TrustedGroupEntry *entry = GetGroupEntryById(osAccountId, groupId);
50017fd14ceSopenharmony_ci    if (entry == NULL) {
50117fd14ceSopenharmony_ci        LOGE("Failed to get group entry!");
50217fd14ceSopenharmony_ci        return HC_ERR_GROUP_NOT_EXIST;
50317fd14ceSopenharmony_ci    }
50417fd14ceSopenharmony_ci    int32_t res = CheckUpgradeIdentity(entry->upgradeFlag, appId, NULL);
50517fd14ceSopenharmony_ci    if (res == HC_SUCCESS) {
50617fd14ceSopenharmony_ci        LOGI("Group is from upgrade, no need to check visibility.");
50717fd14ceSopenharmony_ci        DestroyGroupEntry(entry);
50817fd14ceSopenharmony_ci        return HC_SUCCESS;
50917fd14ceSopenharmony_ci    }
51017fd14ceSopenharmony_ci    if (entry->visibility != GROUP_VISIBILITY_PRIVATE) {
51117fd14ceSopenharmony_ci        LOGE("Group is not private, can not bind old version wearable device!");
51217fd14ceSopenharmony_ci        DestroyGroupEntry(entry);
51317fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
51417fd14ceSopenharmony_ci    }
51517fd14ceSopenharmony_ci    DestroyGroupEntry(entry);
51617fd14ceSopenharmony_ci    return HC_SUCCESS;
51717fd14ceSopenharmony_ci}
51817fd14ceSopenharmony_ci#endif
51917fd14ceSopenharmony_ci
52017fd14ceSopenharmony_ci#ifdef ENABLE_P2P_BIND_LITE_PROTOCOL_CHECK
52117fd14ceSopenharmony_cistatic int32_t CheckBindParams(const CJson *context, bool isClient)
52217fd14ceSopenharmony_ci{
52317fd14ceSopenharmony_ci    int32_t opCode;
52417fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_OPERATION_CODE, &opCode) != HC_SUCCESS) {
52517fd14ceSopenharmony_ci        LOGE("Failed to get operation code!");
52617fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
52717fd14ceSopenharmony_ci    }
52817fd14ceSopenharmony_ci    if ((isClient && opCode == MEMBER_INVITE) || (!isClient && opCode == MEMBER_JOIN)) {
52917fd14ceSopenharmony_ci        int32_t protocolExpandVal = INVALID_PROTOCOL_EXPAND_VALUE;
53017fd14ceSopenharmony_ci        (void)GetIntFromJson(context, FIELD_PROTOCOL_EXPAND, &protocolExpandVal);
53117fd14ceSopenharmony_ci        if (protocolExpandVal == LITE_PROTOCOL_COMPATIBILITY_MODE) {
53217fd14ceSopenharmony_ci            return CheckGroupVisibility(context);
53317fd14ceSopenharmony_ci        }
53417fd14ceSopenharmony_ci    }
53517fd14ceSopenharmony_ci    return HC_SUCCESS;
53617fd14ceSopenharmony_ci}
53717fd14ceSopenharmony_ci#endif
53817fd14ceSopenharmony_ci
53917fd14ceSopenharmony_cistatic int32_t StartClientBindSession(int32_t osAccountId, int64_t requestId, const char *appId,
54017fd14ceSopenharmony_ci    const char *contextParams, const DeviceAuthCallback *callback)
54117fd14ceSopenharmony_ci{
54217fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(contextParams);
54317fd14ceSopenharmony_ci    if (context == NULL) {
54417fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
54517fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
54617fd14ceSopenharmony_ci    }
54717fd14ceSopenharmony_ci    int32_t res = BuildClientBindContext(osAccountId, requestId, appId, callback, context);
54817fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
54917fd14ceSopenharmony_ci        FreeJson(context);
55017fd14ceSopenharmony_ci        return res;
55117fd14ceSopenharmony_ci    }
55217fd14ceSopenharmony_ci#ifdef ENABLE_P2P_BIND_LITE_PROTOCOL_CHECK
55317fd14ceSopenharmony_ci    res = CheckBindParams(context, true);
55417fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
55517fd14ceSopenharmony_ci        FreeJson(context);
55617fd14ceSopenharmony_ci        return res;
55717fd14ceSopenharmony_ci    }
55817fd14ceSopenharmony_ci#endif
55917fd14ceSopenharmony_ci    ChannelType channelType = GetChannelType(callback, context);
56017fd14ceSopenharmony_ci    SessionInitParams params = { context, *callback };
56117fd14ceSopenharmony_ci    res = OpenDevSession(requestId, appId, &params);
56217fd14ceSopenharmony_ci    FreeJson(context);
56317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
56417fd14ceSopenharmony_ci        LOGE("OpenDevSession fail. [Res]: %d", res);
56517fd14ceSopenharmony_ci        return res;
56617fd14ceSopenharmony_ci    }
56717fd14ceSopenharmony_ci    if (channelType == SERVICE_CHANNEL) {
56817fd14ceSopenharmony_ci        res = PushStartSessionTask(requestId);
56917fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
57017fd14ceSopenharmony_ci            return res;
57117fd14ceSopenharmony_ci        }
57217fd14ceSopenharmony_ci    }
57317fd14ceSopenharmony_ci    return HC_SUCCESS;
57417fd14ceSopenharmony_ci}
57517fd14ceSopenharmony_ci
57617fd14ceSopenharmony_ci#ifdef DEV_AUTH_HIVIEW_ENABLE
57717fd14ceSopenharmony_cistatic const char *GetAddMemberCallEventFuncName(const char *addParams)
57817fd14ceSopenharmony_ci{
57917fd14ceSopenharmony_ci    if (addParams == NULL) {
58017fd14ceSopenharmony_ci        LOGE("add params is null!");
58117fd14ceSopenharmony_ci        return ADD_MEMBER_EVENT;
58217fd14ceSopenharmony_ci    }
58317fd14ceSopenharmony_ci    CJson *in = CreateJsonFromString(addParams);
58417fd14ceSopenharmony_ci    if (in == NULL) {
58517fd14ceSopenharmony_ci        LOGE("Failed to create json param!");
58617fd14ceSopenharmony_ci        return ADD_MEMBER_EVENT;
58717fd14ceSopenharmony_ci    }
58817fd14ceSopenharmony_ci    int32_t protocolExpandVal = INVALID_PROTOCOL_EXPAND_VALUE;
58917fd14ceSopenharmony_ci    (void)GetIntFromJson(in, FIELD_PROTOCOL_EXPAND, &protocolExpandVal);
59017fd14ceSopenharmony_ci    FreeJson(in);
59117fd14ceSopenharmony_ci    if (protocolExpandVal == LITE_PROTOCOL_STANDARD_MODE) {
59217fd14ceSopenharmony_ci        return ADD_MEMBER_WITH_LITE_STANDARD;
59317fd14ceSopenharmony_ci    } else if (protocolExpandVal == LITE_PROTOCOL_COMPATIBILITY_MODE) {
59417fd14ceSopenharmony_ci        return ADD_MEMBER_WITH_LITE_COMPATIBILITY;
59517fd14ceSopenharmony_ci    } else {
59617fd14ceSopenharmony_ci        return ADD_MEMBER_EVENT;
59717fd14ceSopenharmony_ci    }
59817fd14ceSopenharmony_ci}
59917fd14ceSopenharmony_ci#endif
60017fd14ceSopenharmony_ci
60117fd14ceSopenharmony_cistatic int32_t AddMemberToGroupInner(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams)
60217fd14ceSopenharmony_ci{
60317fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
60417fd14ceSopenharmony_ci    SET_TRACE_ID(requestId);
60517fd14ceSopenharmony_ci    ADD_PERFORM_DATA(requestId, true, true, HcGetCurTimeInMillis());
60617fd14ceSopenharmony_ci    osAccountId = DevAuthGetRealOsAccountLocalId(osAccountId);
60717fd14ceSopenharmony_ci    if ((appId == NULL) || (addParams == NULL) || (osAccountId == INVALID_OS_ACCOUNT)) {
60817fd14ceSopenharmony_ci        LOGE("Invalid input parameters!");
60917fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
61017fd14ceSopenharmony_ci    }
61117fd14ceSopenharmony_ci    if (!CheckIsForegroundOsAccountId(osAccountId)) {
61217fd14ceSopenharmony_ci        LOGE("This access is not from the foreground user, rejected it.");
61317fd14ceSopenharmony_ci        return HC_ERR_CROSS_USER_ACCESS;
61417fd14ceSopenharmony_ci    }
61517fd14ceSopenharmony_ci    if (!IsOsAccountUnlocked(osAccountId)) {
61617fd14ceSopenharmony_ci        LOGE("Os account is not unlocked!");
61717fd14ceSopenharmony_ci        return HC_ERR_OS_ACCOUNT_NOT_UNLOCKED;
61817fd14ceSopenharmony_ci    }
61917fd14ceSopenharmony_ci    LOGI("Start to add member to group. [ReqId]: %" PRId64 ", [OsAccountId]: %d, [AppId]: %s",
62017fd14ceSopenharmony_ci        requestId, osAccountId, appId);
62117fd14ceSopenharmony_ci    const DeviceAuthCallback *callback = GetGMCallbackByAppId(appId);
62217fd14ceSopenharmony_ci    if (callback == NULL) {
62317fd14ceSopenharmony_ci        LOGE("Failed to find callback by appId! [AppId]: %s", appId);
62417fd14ceSopenharmony_ci        return HC_ERR_CALLBACK_NOT_FOUND;
62517fd14ceSopenharmony_ci    }
62617fd14ceSopenharmony_ci    return StartClientBindSession(osAccountId, requestId, appId, addParams, callback);
62717fd14ceSopenharmony_ci}
62817fd14ceSopenharmony_ci
62917fd14ceSopenharmony_cistatic int32_t AddMemberToGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams)
63017fd14ceSopenharmony_ci{
63117fd14ceSopenharmony_ci    int32_t res = AddMemberToGroupInner(osAccountId, requestId, appId, addParams);
63217fd14ceSopenharmony_ci#ifdef DEV_AUTH_HIVIEW_ENABLE
63317fd14ceSopenharmony_ci    const char *callEventFuncName = GetAddMemberCallEventFuncName(addParams);
63417fd14ceSopenharmony_ci    DEV_AUTH_REPORT_CALL_EVENT_WITH_RESULT(appId, callEventFuncName, osAccountId, res, PROCESS_ADD_MEMBER_TO_GROUP);
63517fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(osAccountId, addParams, appId, callEventFuncName);
63617fd14ceSopenharmony_ci#endif
63717fd14ceSopenharmony_ci    return res;
63817fd14ceSopenharmony_ci}
63917fd14ceSopenharmony_ci
64017fd14ceSopenharmony_cistatic int32_t AddServerReqInfoToContext(int64_t requestId, const char *appId, int32_t opCode,
64117fd14ceSopenharmony_ci    const CJson *receivedMsg, CJson *context)
64217fd14ceSopenharmony_ci{
64317fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(receivedMsg, FIELD_GROUP_ID);
64417fd14ceSopenharmony_ci    if (groupId == NULL) {
64517fd14ceSopenharmony_ci        LOGE("get groupId from json fail.");
64617fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
64717fd14ceSopenharmony_ci    }
64817fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_BIND, true) != HC_SUCCESS) {
64917fd14ceSopenharmony_ci        LOGE("add isBind to context fail.");
65017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
65117fd14ceSopenharmony_ci    }
65217fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_CLIENT, false) != HC_SUCCESS) {
65317fd14ceSopenharmony_ci        LOGE("add isClient to context fail.");
65417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
65517fd14ceSopenharmony_ci    }
65617fd14ceSopenharmony_ci    if (AddInt64StringToJson(context, FIELD_REQUEST_ID, requestId) != HC_SUCCESS) {
65717fd14ceSopenharmony_ci        LOGE("add requestId to context fail.");
65817fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
65917fd14ceSopenharmony_ci    }
66017fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_APP_ID, appId) != HC_SUCCESS) {
66117fd14ceSopenharmony_ci        LOGE("add appId to context fail.");
66217fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
66317fd14ceSopenharmony_ci    }
66417fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, opCode) != HC_SUCCESS) {
66517fd14ceSopenharmony_ci        LOGE("add opCode to context fail.");
66617fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
66717fd14ceSopenharmony_ci    }
66817fd14ceSopenharmony_ci    int32_t res;
66917fd14ceSopenharmony_ci    if (opCode == MEMBER_INVITE) {
67017fd14ceSopenharmony_ci        res = AddGroupInfoToContextByInput(receivedMsg, context);
67117fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
67217fd14ceSopenharmony_ci            return res;
67317fd14ceSopenharmony_ci        }
67417fd14ceSopenharmony_ci        return AddDevInfoToContextByInput(context);
67517fd14ceSopenharmony_ci    }
67617fd14ceSopenharmony_ci    res = AddGroupInfoToContextByDb(groupId, context);
67717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
67817fd14ceSopenharmony_ci        return res;
67917fd14ceSopenharmony_ci    }
68017fd14ceSopenharmony_ci    return AddDevInfoToContextByDb(groupId, context);
68117fd14ceSopenharmony_ci}
68217fd14ceSopenharmony_ci
68317fd14ceSopenharmony_cistatic int32_t CheckConfirmationExist(const CJson *context)
68417fd14ceSopenharmony_ci{
68517fd14ceSopenharmony_ci    uint32_t confirmation = REQUEST_REJECTED;
68617fd14ceSopenharmony_ci    if (GetUnsignedIntFromJson(context, FIELD_CONFIRMATION, &confirmation) != HC_SUCCESS) {
68717fd14ceSopenharmony_ci        LOGE("Failed to get confimation from json!");
68817fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
68917fd14ceSopenharmony_ci    }
69017fd14ceSopenharmony_ci    if (confirmation == REQUEST_ACCEPTED) {
69117fd14ceSopenharmony_ci        LOGI("The service accepts this request!");
69217fd14ceSopenharmony_ci    } else {
69317fd14ceSopenharmony_ci        LOGW("The service rejects this request!");
69417fd14ceSopenharmony_ci    }
69517fd14ceSopenharmony_ci    return HC_SUCCESS;
69617fd14ceSopenharmony_ci}
69717fd14ceSopenharmony_ci
69817fd14ceSopenharmony_cistatic int32_t AddOsAccountIdToContextIfValid(CJson *context)
69917fd14ceSopenharmony_ci{
70017fd14ceSopenharmony_ci    int32_t osAccountId = ANY_OS_ACCOUNT;
70117fd14ceSopenharmony_ci    (void)GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId);
70217fd14ceSopenharmony_ci    osAccountId = DevAuthGetRealOsAccountLocalId(osAccountId);
70317fd14ceSopenharmony_ci    LOGI("[OsAccountId]: %d", osAccountId);
70417fd14ceSopenharmony_ci    if (osAccountId == INVALID_OS_ACCOUNT) {
70517fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
70617fd14ceSopenharmony_ci    }
70717fd14ceSopenharmony_ci    if (!CheckIsForegroundOsAccountId(osAccountId)) {
70817fd14ceSopenharmony_ci        LOGE("This access is not from the foreground user, rejected it.");
70917fd14ceSopenharmony_ci        return HC_ERR_CROSS_USER_ACCESS;
71017fd14ceSopenharmony_ci    }
71117fd14ceSopenharmony_ci    if (!IsOsAccountUnlocked(osAccountId)) {
71217fd14ceSopenharmony_ci        LOGE("Os account is not unlocked!");
71317fd14ceSopenharmony_ci        return HC_ERR_OS_ACCOUNT_NOT_UNLOCKED;
71417fd14ceSopenharmony_ci    }
71517fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OS_ACCOUNT_ID, osAccountId) != HC_SUCCESS) {
71617fd14ceSopenharmony_ci        LOGE("add operationCode to context fail.");
71717fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
71817fd14ceSopenharmony_ci    }
71917fd14ceSopenharmony_ci    return HC_SUCCESS;
72017fd14ceSopenharmony_ci}
72117fd14ceSopenharmony_ci
72217fd14ceSopenharmony_cistatic int32_t BuildServerBindContext(int64_t requestId, const char *appId, int32_t opCode,
72317fd14ceSopenharmony_ci    const CJson *receivedMsg, CJson *context)
72417fd14ceSopenharmony_ci{
72517fd14ceSopenharmony_ci    int32_t res = CheckConfirmationExist(context);
72617fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
72717fd14ceSopenharmony_ci        return res;
72817fd14ceSopenharmony_ci    }
72917fd14ceSopenharmony_ci    res = AddOsAccountIdToContextIfValid(context);
73017fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
73117fd14ceSopenharmony_ci        return res;
73217fd14ceSopenharmony_ci    }
73317fd14ceSopenharmony_ci    res = AddServerReqInfoToContext(requestId, appId, opCode, receivedMsg, context);
73417fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
73517fd14ceSopenharmony_ci        return res;
73617fd14ceSopenharmony_ci    }
73717fd14ceSopenharmony_ci    int32_t channelType;
73817fd14ceSopenharmony_ci    int64_t channelId = DEFAULT_CHANNEL_ID;
73917fd14ceSopenharmony_ci    if (GetByteFromJson(receivedMsg, FIELD_CHANNEL_ID, (uint8_t *)&channelId, sizeof(int64_t)) == HC_SUCCESS) {
74017fd14ceSopenharmony_ci        channelType = SOFT_BUS;
74117fd14ceSopenharmony_ci    } else {
74217fd14ceSopenharmony_ci        channelType = SERVICE_CHANNEL;
74317fd14ceSopenharmony_ci    }
74417fd14ceSopenharmony_ci    return AddChannelInfoToContext(channelType, channelId, context);
74517fd14ceSopenharmony_ci}
74617fd14ceSopenharmony_ci
74717fd14ceSopenharmony_cistatic const char *GetAppIdFromReceivedMsg(const CJson *receivedMsg)
74817fd14ceSopenharmony_ci{
74917fd14ceSopenharmony_ci    const char *appId = GetStringFromJson(receivedMsg, FIELD_APP_ID);
75017fd14ceSopenharmony_ci    if (appId == NULL) {
75117fd14ceSopenharmony_ci        LOGW("use default device manager appId.");
75217fd14ceSopenharmony_ci        appId = DM_APP_ID;
75317fd14ceSopenharmony_ci    }
75417fd14ceSopenharmony_ci    return appId;
75517fd14ceSopenharmony_ci}
75617fd14ceSopenharmony_ci
75717fd14ceSopenharmony_cistatic int32_t OpenServerBindSession(int64_t requestId, const CJson *receivedMsg)
75817fd14ceSopenharmony_ci{
75917fd14ceSopenharmony_ci    const char *appId = GetAppIdFromReceivedMsg(receivedMsg);
76017fd14ceSopenharmony_ci    const DeviceAuthCallback *callback = GetGMCallbackByAppId(appId);
76117fd14ceSopenharmony_ci    if (callback == NULL) {
76217fd14ceSopenharmony_ci        LOGE("Failed to find callback by appId! [AppId]: %s", appId);
76317fd14ceSopenharmony_ci        return HC_ERR_CALLBACK_NOT_FOUND;
76417fd14ceSopenharmony_ci    }
76517fd14ceSopenharmony_ci    int32_t opCode;
76617fd14ceSopenharmony_ci    if (GetIntFromJson(receivedMsg, FIELD_GROUP_OP, &opCode) != HC_SUCCESS) {
76717fd14ceSopenharmony_ci        if (GetIntFromJson(receivedMsg, FIELD_OP_CODE, &opCode) != HC_SUCCESS) {
76817fd14ceSopenharmony_ci            opCode = MEMBER_JOIN;
76917fd14ceSopenharmony_ci            LOGW("use default opCode.");
77017fd14ceSopenharmony_ci        }
77117fd14ceSopenharmony_ci    }
77217fd14ceSopenharmony_ci    char *returnDataStr = ProcessRequestCallback(requestId, opCode, NULL, callback);
77317fd14ceSopenharmony_ci    if (returnDataStr == NULL) {
77417fd14ceSopenharmony_ci        LOGE("The OnRequest callback is fail!");
77517fd14ceSopenharmony_ci        return HC_ERR_REQ_REJECTED;
77617fd14ceSopenharmony_ci    }
77717fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(returnDataStr);
77817fd14ceSopenharmony_ci    FreeJsonString(returnDataStr);
77917fd14ceSopenharmony_ci    if (context == NULL) {
78017fd14ceSopenharmony_ci        LOGE("Failed to create context from string!");
78117fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
78217fd14ceSopenharmony_ci    }
78317fd14ceSopenharmony_ci    int32_t res = BuildServerBindContext(requestId, appId, opCode, receivedMsg, context);
78417fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
78517fd14ceSopenharmony_ci        FreeJson(context);
78617fd14ceSopenharmony_ci        return res;
78717fd14ceSopenharmony_ci    }
78817fd14ceSopenharmony_ci#ifdef ENABLE_P2P_BIND_LITE_PROTOCOL_CHECK
78917fd14ceSopenharmony_ci    res = CheckBindParams(context, false);
79017fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
79117fd14ceSopenharmony_ci        FreeJson(context);
79217fd14ceSopenharmony_ci        return res;
79317fd14ceSopenharmony_ci    }
79417fd14ceSopenharmony_ci#endif
79517fd14ceSopenharmony_ci    SessionInitParams params = { context, *callback };
79617fd14ceSopenharmony_ci    res = OpenDevSession(requestId, appId, &params);
79717fd14ceSopenharmony_ci    FreeJson(context);
79817fd14ceSopenharmony_ci    return res;
79917fd14ceSopenharmony_ci}
80017fd14ceSopenharmony_ci
80117fd14ceSopenharmony_cistatic int32_t ProcessBindData(int64_t requestId, const uint8_t *data, uint32_t dataLen)
80217fd14ceSopenharmony_ci{
80317fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
80417fd14ceSopenharmony_ci    SET_TRACE_ID(requestId);
80517fd14ceSopenharmony_ci    if (!IsSessionExist(requestId)) {
80617fd14ceSopenharmony_ci        ADD_PERFORM_DATA(requestId, true, false, HcGetCurTimeInMillis());
80717fd14ceSopenharmony_ci    } else {
80817fd14ceSopenharmony_ci        UPDATE_PERFORM_DATA_BY_SELF_INDEX(requestId, HcGetCurTimeInMillis());
80917fd14ceSopenharmony_ci    }
81017fd14ceSopenharmony_ci    if ((data == NULL) || (dataLen == 0) || (dataLen > MAX_DATA_BUFFER_SIZE)) {
81117fd14ceSopenharmony_ci        LOGE("The input data is invalid!");
81217fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
81317fd14ceSopenharmony_ci    }
81417fd14ceSopenharmony_ci    LOGI("[Start]: RequestProcessBindData! [ReqId]: %" PRId64, requestId);
81517fd14ceSopenharmony_ci    CJson *receivedMsg = CreateJsonFromString((const char *)data);
81617fd14ceSopenharmony_ci    if (receivedMsg == NULL) {
81717fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
81817fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
81917fd14ceSopenharmony_ci    }
82017fd14ceSopenharmony_ci    int32_t res;
82117fd14ceSopenharmony_ci    if (!IsSessionExist(requestId)) {
82217fd14ceSopenharmony_ci        res = OpenServerBindSession(requestId, receivedMsg);
82317fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
82417fd14ceSopenharmony_ci            FreeJson(receivedMsg);
82517fd14ceSopenharmony_ci            return res;
82617fd14ceSopenharmony_ci        }
82717fd14ceSopenharmony_ci    }
82817fd14ceSopenharmony_ci    res = PushProcSessionTask(requestId, receivedMsg);
82917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
83017fd14ceSopenharmony_ci        FreeJson(receivedMsg);
83117fd14ceSopenharmony_ci        return res;
83217fd14ceSopenharmony_ci    }
83317fd14ceSopenharmony_ci    return HC_SUCCESS;
83417fd14ceSopenharmony_ci}
83517fd14ceSopenharmony_ci
83617fd14ceSopenharmony_cistatic int32_t BuildClientAuthContext(int32_t osAccountId, int64_t requestId, const char *appId, CJson *context)
83717fd14ceSopenharmony_ci{
83817fd14ceSopenharmony_ci    const char *peerUdid = GetPeerUdidFromJson(osAccountId, context);
83917fd14ceSopenharmony_ci    if (peerUdid != NULL) {
84017fd14ceSopenharmony_ci        char *deviceId = NULL;
84117fd14ceSopenharmony_ci        if (DeepCopyString(peerUdid, &deviceId) != HC_SUCCESS) {
84217fd14ceSopenharmony_ci            LOGE("Failed to copy peerUdid!");
84317fd14ceSopenharmony_ci            return HC_ERR_ALLOC_MEMORY;
84417fd14ceSopenharmony_ci        }
84517fd14ceSopenharmony_ci        if (AddStringToJson(context, FIELD_PEER_UDID, deviceId) != HC_SUCCESS) {
84617fd14ceSopenharmony_ci            LOGE("add peerUdid to context fail.");
84717fd14ceSopenharmony_ci            HcFree(deviceId);
84817fd14ceSopenharmony_ci            return HC_ERR_JSON_ADD;
84917fd14ceSopenharmony_ci        }
85017fd14ceSopenharmony_ci        if (AddStringToJson(context, FIELD_PEER_CONN_DEVICE_ID, deviceId) != HC_SUCCESS) {
85117fd14ceSopenharmony_ci            LOGE("add peerConnDeviceId to context fail.");
85217fd14ceSopenharmony_ci            HcFree(deviceId);
85317fd14ceSopenharmony_ci            return HC_ERR_JSON_ADD;
85417fd14ceSopenharmony_ci        }
85517fd14ceSopenharmony_ci        PRINT_SENSITIVE_DATA("PeerUdid", deviceId);
85617fd14ceSopenharmony_ci        HcFree(deviceId);
85717fd14ceSopenharmony_ci    }
85817fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_BIND, false) != HC_SUCCESS) {
85917fd14ceSopenharmony_ci        LOGE("add isBind to context fail.");
86017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
86117fd14ceSopenharmony_ci    }
86217fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_CLIENT, true) != HC_SUCCESS) {
86317fd14ceSopenharmony_ci        LOGE("add isClient to context fail.");
86417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
86517fd14ceSopenharmony_ci    }
86617fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OS_ACCOUNT_ID, osAccountId) != HC_SUCCESS) {
86717fd14ceSopenharmony_ci        LOGE("add osAccountId to context fail.");
86817fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
86917fd14ceSopenharmony_ci    }
87017fd14ceSopenharmony_ci    if (AddInt64StringToJson(context, FIELD_REQUEST_ID, requestId) != HC_SUCCESS) {
87117fd14ceSopenharmony_ci        LOGE("add requestId to context fail.");
87217fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
87317fd14ceSopenharmony_ci    }
87417fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_APP_ID, appId) != HC_SUCCESS) {
87517fd14ceSopenharmony_ci        LOGE("add appId to context fail.");
87617fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
87717fd14ceSopenharmony_ci    }
87817fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, AUTH_FORM_ACCOUNT_UNRELATED) != HC_SUCCESS) {
87917fd14ceSopenharmony_ci        LOGE("add opCode to context fail.");
88017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
88117fd14ceSopenharmony_ci    }
88217fd14ceSopenharmony_ci    return AddChannelInfoToContext(SERVICE_CHANNEL, DEFAULT_CHANNEL_ID, context);
88317fd14ceSopenharmony_ci}
88417fd14ceSopenharmony_ci
88517fd14ceSopenharmony_cistatic int32_t BuildP2PBindContext(CJson *context)
88617fd14ceSopenharmony_ci{
88717fd14ceSopenharmony_ci    int32_t acquireType = -1;
88817fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_ACQURIED_TYPE, &acquireType) != HC_SUCCESS) {
88917fd14ceSopenharmony_ci        LOGE("Failed to get acquireType from reqJsonStr!");
89017fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
89117fd14ceSopenharmony_ci    }
89217fd14ceSopenharmony_ci    if ((acquireType == P2P_BIND) && AddBoolToJson(context, FIELD_IS_DIRECT_AUTH, true) != HC_SUCCESS) {
89317fd14ceSopenharmony_ci        LOGE("add isDirectAuth to context fail.");
89417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
89517fd14ceSopenharmony_ci    }
89617fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, acquireType) != HC_SUCCESS) {
89717fd14ceSopenharmony_ci        LOGE("add opCode to context fail.");
89817fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
89917fd14ceSopenharmony_ci    }
90017fd14ceSopenharmony_ci    const char *serviceType = GetStringFromJson(context, FIELD_SERVICE_TYPE);
90117fd14ceSopenharmony_ci    if (serviceType == NULL) {
90217fd14ceSopenharmony_ci        if ((acquireType == P2P_BIND) &&
90317fd14ceSopenharmony_ci            AddStringToJson(context, FIELD_SERVICE_TYPE, DEFAULT_SERVICE_TYPE) != HC_SUCCESS) {
90417fd14ceSopenharmony_ci            LOGE("add serviceType to context fail.");
90517fd14ceSopenharmony_ci            return HC_ERR_JSON_ADD;
90617fd14ceSopenharmony_ci        }
90717fd14ceSopenharmony_ci    }
90817fd14ceSopenharmony_ci    return HC_SUCCESS;
90917fd14ceSopenharmony_ci}
91017fd14ceSopenharmony_ci
91117fd14ceSopenharmony_cistatic int32_t AuthDevice(int32_t osAccountId, int64_t authReqId, const char *authParams,
91217fd14ceSopenharmony_ci    const DeviceAuthCallback *gaCallback)
91317fd14ceSopenharmony_ci{
91417fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
91517fd14ceSopenharmony_ci    SET_TRACE_ID(authReqId);
91617fd14ceSopenharmony_ci    ADD_PERFORM_DATA(authReqId, false, true, HcGetCurTimeInMillis());
91717fd14ceSopenharmony_ci    osAccountId = DevAuthGetRealOsAccountLocalId(osAccountId);
91817fd14ceSopenharmony_ci    LOGI("Begin AuthDevice. [ReqId]: %" PRId64 ", [OsAccountId]: %d", authReqId, osAccountId);
91917fd14ceSopenharmony_ci    if ((authParams == NULL) || (osAccountId == INVALID_OS_ACCOUNT) || (gaCallback == NULL)) {
92017fd14ceSopenharmony_ci        LOGE("The input auth params is invalid!");
92117fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
92217fd14ceSopenharmony_ci    }
92317fd14ceSopenharmony_ci    if (!CheckIsForegroundOsAccountId(osAccountId)) {
92417fd14ceSopenharmony_ci        LOGE("This access is not from the foreground user, rejected it.");
92517fd14ceSopenharmony_ci        return HC_ERR_CROSS_USER_ACCESS;
92617fd14ceSopenharmony_ci    }
92717fd14ceSopenharmony_ci    if (!IsOsAccountUnlocked(osAccountId)) {
92817fd14ceSopenharmony_ci        LOGE("Os account is not unlocked!");
92917fd14ceSopenharmony_ci        return HC_ERR_OS_ACCOUNT_NOT_UNLOCKED;
93017fd14ceSopenharmony_ci    }
93117fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(authParams);
93217fd14ceSopenharmony_ci    if (context == NULL) {
93317fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
93417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
93517fd14ceSopenharmony_ci    }
93617fd14ceSopenharmony_ci    const char *appId = GetStringFromJson(context, FIELD_SERVICE_PKG_NAME);
93717fd14ceSopenharmony_ci    if (appId == NULL) {
93817fd14ceSopenharmony_ci        LOGE("get servicePkgName from json fail.");
93917fd14ceSopenharmony_ci        FreeJson(context);
94017fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
94117fd14ceSopenharmony_ci    }
94217fd14ceSopenharmony_ci    int32_t res = BuildClientAuthContext(osAccountId, authReqId, appId, context);
94317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
94417fd14ceSopenharmony_ci        FreeJson(context);
94517fd14ceSopenharmony_ci        return res;
94617fd14ceSopenharmony_ci    }
94717fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(osAccountId, authParams, appId, AUTH_DEV_EVENT);
94817fd14ceSopenharmony_ci    DEV_AUTH_REPORT_CALL_EVENT_WITH_RESULT(appId, AUTH_DEV_EVENT, osAccountId, res, PROCESS_AUTH_DEVICE);
94917fd14ceSopenharmony_ci    SessionInitParams params = { context, *gaCallback };
95017fd14ceSopenharmony_ci    res = OpenDevSession(authReqId, appId, &params);
95117fd14ceSopenharmony_ci    FreeJson(context);
95217fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
95317fd14ceSopenharmony_ci        LOGE("OpenDevSession fail. [Res]: %d", res);
95417fd14ceSopenharmony_ci        return res;
95517fd14ceSopenharmony_ci    }
95617fd14ceSopenharmony_ci    return PushStartSessionTask(authReqId);
95717fd14ceSopenharmony_ci}
95817fd14ceSopenharmony_ci
95917fd14ceSopenharmony_cistatic int32_t AddDeviceIdToJson(CJson *context, const char *peerUdid)
96017fd14ceSopenharmony_ci{
96117fd14ceSopenharmony_ci    char *deviceId = NULL;
96217fd14ceSopenharmony_ci    if (DeepCopyString(peerUdid, &deviceId) != HC_SUCCESS) {
96317fd14ceSopenharmony_ci        LOGE("Failed to copy peerUdid!");
96417fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
96517fd14ceSopenharmony_ci    }
96617fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_PEER_UDID, deviceId) != HC_SUCCESS) {
96717fd14ceSopenharmony_ci        LOGE("add peerUdid to context fail.");
96817fd14ceSopenharmony_ci        HcFree(deviceId);
96917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
97017fd14ceSopenharmony_ci    }
97117fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_PEER_CONN_DEVICE_ID, deviceId) != HC_SUCCESS) {
97217fd14ceSopenharmony_ci        LOGE("add peerConnDeviceId to context fail.");
97317fd14ceSopenharmony_ci        HcFree(deviceId);
97417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
97517fd14ceSopenharmony_ci    }
97617fd14ceSopenharmony_ci    HcFree(deviceId);
97717fd14ceSopenharmony_ci    return HC_SUCCESS;
97817fd14ceSopenharmony_ci}
97917fd14ceSopenharmony_ci
98017fd14ceSopenharmony_cistatic int32_t BuildServerAuthContext(int64_t requestId, int32_t opCode, const char *appId, CJson *context)
98117fd14ceSopenharmony_ci{
98217fd14ceSopenharmony_ci    int32_t res = CheckConfirmationExist(context);
98317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
98417fd14ceSopenharmony_ci        return res;
98517fd14ceSopenharmony_ci    }
98617fd14ceSopenharmony_ci    res = AddOsAccountIdToContextIfValid(context);
98717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
98817fd14ceSopenharmony_ci        return res;
98917fd14ceSopenharmony_ci    }
99017fd14ceSopenharmony_ci    int32_t osAccountId = ANY_OS_ACCOUNT;
99117fd14ceSopenharmony_ci    (void)GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId);
99217fd14ceSopenharmony_ci    const char *peerUdid = GetPeerUdidFromJson(osAccountId, context);
99317fd14ceSopenharmony_ci    if (peerUdid == NULL) {
99417fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
99517fd14ceSopenharmony_ci    }
99617fd14ceSopenharmony_ci    PRINT_SENSITIVE_DATA("PeerUdid", peerUdid);
99717fd14ceSopenharmony_ci    if (AddDeviceIdToJson(context, peerUdid) != HC_SUCCESS) {
99817fd14ceSopenharmony_ci        LOGE("add deviceId to context fail.");
99917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
100017fd14ceSopenharmony_ci    }
100117fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_BIND, false) != HC_SUCCESS) {
100217fd14ceSopenharmony_ci        LOGE("add isBind to context fail.");
100317fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
100417fd14ceSopenharmony_ci    }
100517fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_CLIENT, false) != HC_SUCCESS) {
100617fd14ceSopenharmony_ci        LOGE("add isClient to context fail.");
100717fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
100817fd14ceSopenharmony_ci    }
100917fd14ceSopenharmony_ci    if (AddInt64StringToJson(context, FIELD_REQUEST_ID, requestId) != HC_SUCCESS) {
101017fd14ceSopenharmony_ci        LOGE("add requestId to context fail.");
101117fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
101217fd14ceSopenharmony_ci    }
101317fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_APP_ID, appId) != HC_SUCCESS) {
101417fd14ceSopenharmony_ci        LOGE("add appId to context fail.");
101517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
101617fd14ceSopenharmony_ci    }
101717fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, opCode) != HC_SUCCESS) {
101817fd14ceSopenharmony_ci        LOGE("add opCode to context fail.");
101917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
102017fd14ceSopenharmony_ci    }
102117fd14ceSopenharmony_ci    return AddChannelInfoToContext(SERVICE_CHANNEL, DEFAULT_CHANNEL_ID, context);
102217fd14ceSopenharmony_ci}
102317fd14ceSopenharmony_ci
102417fd14ceSopenharmony_cistatic int32_t BuildServerP2PAuthContext(int64_t requestId, int32_t opCode, const char *appId, CJson *context)
102517fd14ceSopenharmony_ci{
102617fd14ceSopenharmony_ci    int32_t res = CheckConfirmationExist(context);
102717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
102817fd14ceSopenharmony_ci        return res;
102917fd14ceSopenharmony_ci    }
103017fd14ceSopenharmony_ci    res = AddOsAccountIdToContextIfValid(context);
103117fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
103217fd14ceSopenharmony_ci        return res;
103317fd14ceSopenharmony_ci    }
103417fd14ceSopenharmony_ci    const char *peerUdid = GetStringFromJson(context, FIELD_PEER_CONN_DEVICE_ID);
103517fd14ceSopenharmony_ci    const char *pinCode = GetStringFromJson(context, FIELD_PIN_CODE);
103617fd14ceSopenharmony_ci    if (peerUdid == NULL && pinCode == NULL) {
103717fd14ceSopenharmony_ci        LOGE("need peerConnDeviceId or pinCode!");
103817fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
103917fd14ceSopenharmony_ci    }
104017fd14ceSopenharmony_ci    if (peerUdid != NULL) {
104117fd14ceSopenharmony_ci        PRINT_SENSITIVE_DATA("PeerUdid", peerUdid);
104217fd14ceSopenharmony_ci        if (AddDeviceIdToJson(context, peerUdid) != HC_SUCCESS) {
104317fd14ceSopenharmony_ci            LOGE("add deviceId to context fail.");
104417fd14ceSopenharmony_ci            return HC_ERR_JSON_ADD;
104517fd14ceSopenharmony_ci        }
104617fd14ceSopenharmony_ci    }
104717fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_BIND, false) != HC_SUCCESS) {
104817fd14ceSopenharmony_ci        LOGE("add isBind to context fail.");
104917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
105017fd14ceSopenharmony_ci    }
105117fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_CLIENT, false) != HC_SUCCESS) {
105217fd14ceSopenharmony_ci        LOGE("add isClient to context fail.");
105317fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
105417fd14ceSopenharmony_ci    }
105517fd14ceSopenharmony_ci    if (AddInt64StringToJson(context, FIELD_REQUEST_ID, requestId) != HC_SUCCESS) {
105617fd14ceSopenharmony_ci        LOGE("add requestId to context fail.");
105717fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
105817fd14ceSopenharmony_ci    }
105917fd14ceSopenharmony_ci    if (AddStringToJson(context, FIELD_APP_ID, appId) != HC_SUCCESS) {
106017fd14ceSopenharmony_ci        LOGE("add appId to context fail.");
106117fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
106217fd14ceSopenharmony_ci    }
106317fd14ceSopenharmony_ci    if (AddIntToJson(context, FIELD_OPERATION_CODE, opCode) != HC_SUCCESS) {
106417fd14ceSopenharmony_ci        LOGE("add opCode to context fail.");
106517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
106617fd14ceSopenharmony_ci    }
106717fd14ceSopenharmony_ci    return AddChannelInfoToContext(SERVICE_CHANNEL, DEFAULT_CHANNEL_ID, context);
106817fd14ceSopenharmony_ci}
106917fd14ceSopenharmony_ci
107017fd14ceSopenharmony_cistatic int32_t OpenServerAuthSession(int64_t requestId, const CJson *receivedMsg, const DeviceAuthCallback *callback)
107117fd14ceSopenharmony_ci{
107217fd14ceSopenharmony_ci    int32_t opCode = AUTH_FORM_ACCOUNT_UNRELATED;
107317fd14ceSopenharmony_ci    if (GetIntFromJson(receivedMsg, FIELD_AUTH_FORM, &opCode) != HC_SUCCESS) {
107417fd14ceSopenharmony_ci        if (GetIntFromJson(receivedMsg, FIELD_OP_CODE, &opCode) != HC_SUCCESS) {
107517fd14ceSopenharmony_ci            opCode = AUTH_FORM_INVALID_TYPE;
107617fd14ceSopenharmony_ci            LOGW("use default opCode.");
107717fd14ceSopenharmony_ci        }
107817fd14ceSopenharmony_ci    }
107917fd14ceSopenharmony_ci    char *returnDataStr = ProcessRequestCallback(requestId, opCode, NULL, callback);
108017fd14ceSopenharmony_ci    if (returnDataStr == NULL) {
108117fd14ceSopenharmony_ci        LOGE("The OnRequest callback is fail!");
108217fd14ceSopenharmony_ci        return HC_ERR_REQ_REJECTED;
108317fd14ceSopenharmony_ci    }
108417fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(returnDataStr);
108517fd14ceSopenharmony_ci    FreeJsonString(returnDataStr);
108617fd14ceSopenharmony_ci    if (context == NULL) {
108717fd14ceSopenharmony_ci        LOGE("Failed to create context from string!");
108817fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
108917fd14ceSopenharmony_ci    }
109017fd14ceSopenharmony_ci    const char *appId = GetStringFromJson(context, FIELD_SERVICE_PKG_NAME);
109117fd14ceSopenharmony_ci    if (appId == NULL) {
109217fd14ceSopenharmony_ci        LOGE("get appId from json fail.");
109317fd14ceSopenharmony_ci        FreeJson(context);
109417fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
109517fd14ceSopenharmony_ci    }
109617fd14ceSopenharmony_ci    int32_t res = BuildServerAuthContext(requestId, opCode, appId, context);
109717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
109817fd14ceSopenharmony_ci        FreeJson(context);
109917fd14ceSopenharmony_ci        return res;
110017fd14ceSopenharmony_ci    }
110117fd14ceSopenharmony_ci    SessionInitParams params = { context, *callback };
110217fd14ceSopenharmony_ci    res = OpenDevSession(requestId, appId, &params);
110317fd14ceSopenharmony_ci    FreeJson(context);
110417fd14ceSopenharmony_ci    return res;
110517fd14ceSopenharmony_ci}
110617fd14ceSopenharmony_ci
110717fd14ceSopenharmony_cistatic int32_t OpenServerAuthSessionForP2P(
110817fd14ceSopenharmony_ci    int64_t requestId, const CJson *receivedMsg, const DeviceAuthCallback *callback)
110917fd14ceSopenharmony_ci{
111017fd14ceSopenharmony_ci    int32_t opCode = P2P_BIND;
111117fd14ceSopenharmony_ci    if (GetIntFromJson(receivedMsg, FIELD_OP_CODE, &opCode) != HC_SUCCESS) {
111217fd14ceSopenharmony_ci        opCode = P2P_BIND;
111317fd14ceSopenharmony_ci        LOGW("use default opCode.");
111417fd14ceSopenharmony_ci    }
111517fd14ceSopenharmony_ci    char *returnDataStr = ProcessRequestCallback(requestId, opCode, NULL, callback);
111617fd14ceSopenharmony_ci    if (returnDataStr == NULL) {
111717fd14ceSopenharmony_ci        LOGE("The OnRequest callback is fail!");
111817fd14ceSopenharmony_ci        return HC_ERR_REQ_REJECTED;
111917fd14ceSopenharmony_ci    }
112017fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(returnDataStr);
112117fd14ceSopenharmony_ci    FreeJsonString(returnDataStr);
112217fd14ceSopenharmony_ci    if (context == NULL) {
112317fd14ceSopenharmony_ci        LOGE("Failed to create context from string!");
112417fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
112517fd14ceSopenharmony_ci    }
112617fd14ceSopenharmony_ci    if (AddBoolToJson(context, FIELD_IS_DIRECT_AUTH, true) != HC_SUCCESS) {
112717fd14ceSopenharmony_ci        LOGE("Failed to add isDirectAuth to context!");
112817fd14ceSopenharmony_ci        FreeJson(context);
112917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
113017fd14ceSopenharmony_ci    }
113117fd14ceSopenharmony_ci    const char *pkgName = GetStringFromJson(context, FIELD_SERVICE_PKG_NAME);
113217fd14ceSopenharmony_ci    if (pkgName == NULL && AddStringToJson(context, FIELD_SERVICE_PKG_NAME, DEFAULT_PACKAGE_NAME) != HC_SUCCESS) {
113317fd14ceSopenharmony_ci        LOGE("Failed to add default package name to context!");
113417fd14ceSopenharmony_ci        FreeJson(context);
113517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
113617fd14ceSopenharmony_ci    }
113717fd14ceSopenharmony_ci    const char *serviceType = GetStringFromJson(context, FIELD_SERVICE_TYPE);
113817fd14ceSopenharmony_ci    if (serviceType == NULL && AddStringToJson(context, FIELD_SERVICE_TYPE, DEFAULT_SERVICE_TYPE) != HC_SUCCESS) {
113917fd14ceSopenharmony_ci        LOGE("Failed to add default package name to context!");
114017fd14ceSopenharmony_ci        FreeJson(context);
114117fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
114217fd14ceSopenharmony_ci    }
114317fd14ceSopenharmony_ci    const char *appId = pkgName != NULL ? pkgName : DEFAULT_PACKAGE_NAME;
114417fd14ceSopenharmony_ci    int32_t res = BuildServerP2PAuthContext(requestId, opCode, appId, context);
114517fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
114617fd14ceSopenharmony_ci        FreeJson(context);
114717fd14ceSopenharmony_ci        return res;
114817fd14ceSopenharmony_ci    }
114917fd14ceSopenharmony_ci    SessionInitParams params = { context, *callback };
115017fd14ceSopenharmony_ci    res = OpenDevSession(requestId, appId, &params);
115117fd14ceSopenharmony_ci    FreeJson(context);
115217fd14ceSopenharmony_ci    return res;
115317fd14ceSopenharmony_ci}
115417fd14ceSopenharmony_ci
115517fd14ceSopenharmony_cistatic int32_t ProcessData(int64_t authReqId, const uint8_t *data, uint32_t dataLen,
115617fd14ceSopenharmony_ci    const DeviceAuthCallback *gaCallback)
115717fd14ceSopenharmony_ci{
115817fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
115917fd14ceSopenharmony_ci    SET_TRACE_ID(authReqId);
116017fd14ceSopenharmony_ci    if (!IsSessionExist(authReqId)) {
116117fd14ceSopenharmony_ci        ADD_PERFORM_DATA(authReqId, false, false, HcGetCurTimeInMillis());
116217fd14ceSopenharmony_ci    } else {
116317fd14ceSopenharmony_ci        UPDATE_PERFORM_DATA_BY_SELF_INDEX(authReqId, HcGetCurTimeInMillis());
116417fd14ceSopenharmony_ci    }
116517fd14ceSopenharmony_ci    LOGI("[GA] Begin ProcessData. [DataLen]: %u, [ReqId]: %" PRId64, dataLen, authReqId);
116617fd14ceSopenharmony_ci    if ((data == NULL) || (dataLen > MAX_DATA_BUFFER_SIZE)) {
116717fd14ceSopenharmony_ci        LOGE("Invalid input for ProcessData!");
116817fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
116917fd14ceSopenharmony_ci    }
117017fd14ceSopenharmony_ci    CJson *receivedMsg = CreateJsonFromString((const char *)data);
117117fd14ceSopenharmony_ci    if (receivedMsg == NULL) {
117217fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
117317fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
117417fd14ceSopenharmony_ci    }
117517fd14ceSopenharmony_ci    int32_t res;
117617fd14ceSopenharmony_ci    if (!IsSessionExist(authReqId)) {
117717fd14ceSopenharmony_ci        res = OpenServerAuthSession(authReqId, receivedMsg, gaCallback);
117817fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
117917fd14ceSopenharmony_ci            FreeJson(receivedMsg);
118017fd14ceSopenharmony_ci            return res;
118117fd14ceSopenharmony_ci        }
118217fd14ceSopenharmony_ci    }
118317fd14ceSopenharmony_ci    if (HasAccountAuthPlugin() == HC_SUCCESS) {
118417fd14ceSopenharmony_ci        res = AddOriginDataForPlugin(receivedMsg, data);
118517fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
118617fd14ceSopenharmony_ci            FreeJson(receivedMsg);
118717fd14ceSopenharmony_ci            return res;
118817fd14ceSopenharmony_ci        }
118917fd14ceSopenharmony_ci    }
119017fd14ceSopenharmony_ci    res = PushProcSessionTask(authReqId, receivedMsg);
119117fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
119217fd14ceSopenharmony_ci        FreeJson(receivedMsg);
119317fd14ceSopenharmony_ci        return res;
119417fd14ceSopenharmony_ci    }
119517fd14ceSopenharmony_ci    return HC_SUCCESS;
119617fd14ceSopenharmony_ci}
119717fd14ceSopenharmony_ci
119817fd14ceSopenharmony_cistatic void CancelRequest(int64_t requestId, const char *appId)
119917fd14ceSopenharmony_ci{
120017fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
120117fd14ceSopenharmony_ci    SET_TRACE_ID(requestId);
120217fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(DEFAULT_OS_ACCOUNT, NULL, appId, CANCEL_REQUEST_EVENT);
120317fd14ceSopenharmony_ci    if (appId == NULL) {
120417fd14ceSopenharmony_ci        LOGE("Invalid app id!");
120517fd14ceSopenharmony_ci        return;
120617fd14ceSopenharmony_ci    }
120717fd14ceSopenharmony_ci    LOGI("cancel request. [AppId]: %s, [ReqId]: %" PRId64, appId, requestId);
120817fd14ceSopenharmony_ci    CancelDevSession(requestId, appId);
120917fd14ceSopenharmony_ci}
121017fd14ceSopenharmony_ci
121117fd14ceSopenharmony_cistatic int32_t GetRealInfo(int32_t osAccountId, const char *pseudonymId, char **realInfo)
121217fd14ceSopenharmony_ci{
121317fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(osAccountId, NULL, NULL, GET_REAL_INFO_EVENT);
121417fd14ceSopenharmony_ci    if (pseudonymId == NULL || realInfo == NULL) {
121517fd14ceSopenharmony_ci        LOGE("Invalid params!");
121617fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
121717fd14ceSopenharmony_ci    }
121817fd14ceSopenharmony_ci    PseudonymManager *pseudonymInstance = GetPseudonymInstance();
121917fd14ceSopenharmony_ci    if (pseudonymInstance == NULL) {
122017fd14ceSopenharmony_ci        LOGE("not support privacy enhancement!");
122117fd14ceSopenharmony_ci        return HC_ERR_NOT_SUPPORT;
122217fd14ceSopenharmony_ci    }
122317fd14ceSopenharmony_ci    return pseudonymInstance->getRealInfo(osAccountId, pseudonymId, realInfo);
122417fd14ceSopenharmony_ci}
122517fd14ceSopenharmony_ci
122617fd14ceSopenharmony_cistatic int32_t GetPseudonymId(int32_t osAccountId, const char *indexKey, char **pseudonymId)
122717fd14ceSopenharmony_ci{
122817fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(osAccountId, NULL, NULL, GET_PSEUDONYM_ID_EVENT);
122917fd14ceSopenharmony_ci    if (indexKey == NULL || pseudonymId == NULL) {
123017fd14ceSopenharmony_ci        LOGE("Invalid params!");
123117fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
123217fd14ceSopenharmony_ci    }
123317fd14ceSopenharmony_ci    PseudonymManager *pseudonymInstance = GetPseudonymInstance();
123417fd14ceSopenharmony_ci    if (pseudonymInstance == NULL) {
123517fd14ceSopenharmony_ci        LOGE("not support privacy enhancement!");
123617fd14ceSopenharmony_ci        return HC_ERR_NOT_SUPPORT;
123717fd14ceSopenharmony_ci    }
123817fd14ceSopenharmony_ci    return pseudonymInstance->getPseudonymId(osAccountId, indexKey, pseudonymId);
123917fd14ceSopenharmony_ci}
124017fd14ceSopenharmony_ci
124117fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC int32_t ProcessCredential(int32_t operationCode, const char *reqJsonStr, char **returnData)
124217fd14ceSopenharmony_ci{
124317fd14ceSopenharmony_ci    if (reqJsonStr == NULL || returnData == NULL) {
124417fd14ceSopenharmony_ci        LOGE("Invalid params!");
124517fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
124617fd14ceSopenharmony_ci    }
124717fd14ceSopenharmony_ci
124817fd14ceSopenharmony_ci    const CredentialOperator *credOperator = GetCredentialOperator();
124917fd14ceSopenharmony_ci    if (credOperator == NULL) {
125017fd14ceSopenharmony_ci        LOGE("credOperator is null!");
125117fd14ceSopenharmony_ci        return HC_ERR_NOT_SUPPORT;
125217fd14ceSopenharmony_ci    }
125317fd14ceSopenharmony_ci
125417fd14ceSopenharmony_ci    int32_t res = HC_ERR_UNSUPPORTED_OPCODE;
125517fd14ceSopenharmony_ci    switch (operationCode) {
125617fd14ceSopenharmony_ci        case CRED_OP_QUERY:
125717fd14ceSopenharmony_ci            res = credOperator->queryCredential(reqJsonStr, returnData);
125817fd14ceSopenharmony_ci            break;
125917fd14ceSopenharmony_ci        case CRED_OP_CREATE:
126017fd14ceSopenharmony_ci            res = credOperator->genarateCredential(reqJsonStr, returnData);
126117fd14ceSopenharmony_ci            break;
126217fd14ceSopenharmony_ci        case CRED_OP_IMPORT:
126317fd14ceSopenharmony_ci            res = credOperator->importCredential(reqJsonStr, returnData);
126417fd14ceSopenharmony_ci            break;
126517fd14ceSopenharmony_ci        case CRED_OP_DELETE:
126617fd14ceSopenharmony_ci            res = credOperator->deleteCredential(reqJsonStr, returnData);
126717fd14ceSopenharmony_ci            break;
126817fd14ceSopenharmony_ci        default:
126917fd14ceSopenharmony_ci            LOGE("invalid opCode: %d", operationCode);
127017fd14ceSopenharmony_ci            break;
127117fd14ceSopenharmony_ci    }
127217fd14ceSopenharmony_ci
127317fd14ceSopenharmony_ci    return res;
127417fd14ceSopenharmony_ci}
127517fd14ceSopenharmony_ci
127617fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC int32_t ProcessAuthDevice(
127717fd14ceSopenharmony_ci    int64_t authReqId, const char *authParams, const DeviceAuthCallback *callback)
127817fd14ceSopenharmony_ci{
127917fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
128017fd14ceSopenharmony_ci    SET_TRACE_ID(authReqId);
128117fd14ceSopenharmony_ci    LOGI("[DA] Begin ProcessAuthDevice [ReqId]: %" PRId64, authReqId);
128217fd14ceSopenharmony_ci    if (authParams == NULL || HcStrlen(authParams) > MAX_DATA_BUFFER_SIZE) {
128317fd14ceSopenharmony_ci        LOGE("Invalid input for ProcessData!");
128417fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
128517fd14ceSopenharmony_ci    }
128617fd14ceSopenharmony_ci    CJson *json = CreateJsonFromString(authParams);
128717fd14ceSopenharmony_ci    if (json == NULL) {
128817fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
128917fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
129017fd14ceSopenharmony_ci    }
129117fd14ceSopenharmony_ci    const char *data = GetStringFromJson(json, "data");
129217fd14ceSopenharmony_ci    if (data == NULL) {
129317fd14ceSopenharmony_ci        LOGE("Failed to get received data from parameter!");
129417fd14ceSopenharmony_ci        FreeJson(json);
129517fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
129617fd14ceSopenharmony_ci    }
129717fd14ceSopenharmony_ci    CJson *receivedMsg = CreateJsonFromString(data);
129817fd14ceSopenharmony_ci    FreeJson(json);
129917fd14ceSopenharmony_ci    if (receivedMsg == NULL) {
130017fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
130117fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
130217fd14ceSopenharmony_ci    }
130317fd14ceSopenharmony_ci    int32_t res;
130417fd14ceSopenharmony_ci    if (!IsSessionExist(authReqId)) {
130517fd14ceSopenharmony_ci        res = OpenServerAuthSessionForP2P(authReqId, receivedMsg, callback);
130617fd14ceSopenharmony_ci        if (res != HC_SUCCESS) {
130717fd14ceSopenharmony_ci            FreeJson(receivedMsg);
130817fd14ceSopenharmony_ci            return res;
130917fd14ceSopenharmony_ci        }
131017fd14ceSopenharmony_ci    }
131117fd14ceSopenharmony_ci    res = PushProcSessionTask(authReqId, receivedMsg);
131217fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
131317fd14ceSopenharmony_ci        FreeJson(receivedMsg);
131417fd14ceSopenharmony_ci        return res;
131517fd14ceSopenharmony_ci    }
131617fd14ceSopenharmony_ci    return HC_SUCCESS;
131717fd14ceSopenharmony_ci}
131817fd14ceSopenharmony_ci
131917fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC int32_t StartAuthDevice(
132017fd14ceSopenharmony_ci    int64_t authReqId, const char *authParams, const DeviceAuthCallback *callback)
132117fd14ceSopenharmony_ci{
132217fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
132317fd14ceSopenharmony_ci    SET_TRACE_ID(authReqId);
132417fd14ceSopenharmony_ci    LOGI("StartAuthDevice. [ReqId]:%" PRId64, authReqId);
132517fd14ceSopenharmony_ci
132617fd14ceSopenharmony_ci    if ((authParams == NULL) || (callback == NULL) || HcStrlen(authParams) > MAX_DATA_BUFFER_SIZE) {
132717fd14ceSopenharmony_ci        LOGE("The input auth params is invalid!");
132817fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
132917fd14ceSopenharmony_ci    }
133017fd14ceSopenharmony_ci    CJson *context = CreateJsonFromString(authParams);
133117fd14ceSopenharmony_ci    if (context == NULL) {
133217fd14ceSopenharmony_ci        LOGE("Failed to create json from string!");
133317fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
133417fd14ceSopenharmony_ci    }
133517fd14ceSopenharmony_ci    int32_t osAccountId = INVALID_OS_ACCOUNT;
133617fd14ceSopenharmony_ci    if (GetIntFromJson(context, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
133717fd14ceSopenharmony_ci        LOGE("Failed to get osAccountId from json!");
133817fd14ceSopenharmony_ci        FreeJson(context);
133917fd14ceSopenharmony_ci        return HC_ERR_JSON_FAIL;
134017fd14ceSopenharmony_ci    }
134117fd14ceSopenharmony_ci    osAccountId = DevAuthGetRealOsAccountLocalId(osAccountId);
134217fd14ceSopenharmony_ci    if (osAccountId == INVALID_OS_ACCOUNT) {
134317fd14ceSopenharmony_ci        FreeJson(context);
134417fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
134517fd14ceSopenharmony_ci    }
134617fd14ceSopenharmony_ci    if (!CheckIsForegroundOsAccountId(osAccountId)) {
134717fd14ceSopenharmony_ci        LOGE("This access is not from the foreground user, rejected it.");
134817fd14ceSopenharmony_ci        return HC_ERR_CROSS_USER_ACCESS;
134917fd14ceSopenharmony_ci    }
135017fd14ceSopenharmony_ci    int32_t res = BuildClientAuthContext(osAccountId, authReqId, DEFAULT_PACKAGE_NAME, context);
135117fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
135217fd14ceSopenharmony_ci        FreeJson(context);
135317fd14ceSopenharmony_ci        return res;
135417fd14ceSopenharmony_ci    }
135517fd14ceSopenharmony_ci    res = BuildP2PBindContext(context);
135617fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
135717fd14ceSopenharmony_ci        FreeJson(context);
135817fd14ceSopenharmony_ci        return res;
135917fd14ceSopenharmony_ci    }
136017fd14ceSopenharmony_ci    SessionInitParams params = { context, *callback };
136117fd14ceSopenharmony_ci    res = OpenDevSession(authReqId, DEFAULT_PACKAGE_NAME, &params);
136217fd14ceSopenharmony_ci    FreeJson(context);
136317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
136417fd14ceSopenharmony_ci        LOGE("OpenDevSession fail. [Res]: %d", res);
136517fd14ceSopenharmony_ci        return res;
136617fd14ceSopenharmony_ci    }
136717fd14ceSopenharmony_ci    return PushStartSessionTask(authReqId);
136817fd14ceSopenharmony_ci}
136917fd14ceSopenharmony_ci
137017fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC int32_t CancelAuthRequest(int64_t requestId, const char *authParams)
137117fd14ceSopenharmony_ci{
137217fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
137317fd14ceSopenharmony_ci    SET_TRACE_ID(requestId);
137417fd14ceSopenharmony_ci    if (authParams == NULL || HcStrlen(authParams) > MAX_DATA_BUFFER_SIZE) {
137517fd14ceSopenharmony_ci        LOGE("Invalid authParams!");
137617fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
137717fd14ceSopenharmony_ci    }
137817fd14ceSopenharmony_ci    LOGI("cancel request. [ReqId]: %" PRId64, requestId);
137917fd14ceSopenharmony_ci    CancelDevSession(requestId, DEFAULT_PACKAGE_NAME);
138017fd14ceSopenharmony_ci    return HC_SUCCESS;
138117fd14ceSopenharmony_ci}
138217fd14ceSopenharmony_ci
138317fd14ceSopenharmony_cistatic int32_t AllocGmAndGa(void)
138417fd14ceSopenharmony_ci{
138517fd14ceSopenharmony_ci    if (g_groupManagerInstance == NULL) {
138617fd14ceSopenharmony_ci        g_groupManagerInstance = (DeviceGroupManager *)HcMalloc(sizeof(DeviceGroupManager), 0);
138717fd14ceSopenharmony_ci        if (g_groupManagerInstance == NULL) {
138817fd14ceSopenharmony_ci            LOGE("Failed to allocate groupManager Instance memory!");
138917fd14ceSopenharmony_ci            return HC_ERR_ALLOC_MEMORY;
139017fd14ceSopenharmony_ci        }
139117fd14ceSopenharmony_ci    }
139217fd14ceSopenharmony_ci    if (g_groupAuthManager == NULL) {
139317fd14ceSopenharmony_ci        g_groupAuthManager = (GroupAuthManager *)HcMalloc(sizeof(GroupAuthManager), 0);
139417fd14ceSopenharmony_ci        if (g_groupAuthManager == NULL) {
139517fd14ceSopenharmony_ci            LOGE("Failed to allocate groupAuth Instance memory!");
139617fd14ceSopenharmony_ci            HcFree(g_groupManagerInstance);
139717fd14ceSopenharmony_ci            g_groupManagerInstance = NULL;
139817fd14ceSopenharmony_ci            return HC_ERR_ALLOC_MEMORY;
139917fd14ceSopenharmony_ci        }
140017fd14ceSopenharmony_ci    }
140117fd14ceSopenharmony_ci    return HC_SUCCESS;
140217fd14ceSopenharmony_ci}
140317fd14ceSopenharmony_ci
140417fd14ceSopenharmony_cistatic void DestroyGmAndGa(void)
140517fd14ceSopenharmony_ci{
140617fd14ceSopenharmony_ci    if (g_groupAuthManager != NULL) {
140717fd14ceSopenharmony_ci        HcFree(g_groupAuthManager);
140817fd14ceSopenharmony_ci        g_groupAuthManager = NULL;
140917fd14ceSopenharmony_ci    }
141017fd14ceSopenharmony_ci    if (g_groupManagerInstance != NULL) {
141117fd14ceSopenharmony_ci        HcFree(g_groupManagerInstance);
141217fd14ceSopenharmony_ci        g_groupManagerInstance = NULL;
141317fd14ceSopenharmony_ci    }
141417fd14ceSopenharmony_ci}
141517fd14ceSopenharmony_ci
141617fd14ceSopenharmony_cistatic int32_t InitAllModules(void)
141717fd14ceSopenharmony_ci{
141817fd14ceSopenharmony_ci    int32_t res = GetLoaderInstance()->initAlg();
141917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
142017fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init algorithm module!");
142117fd14ceSopenharmony_ci        return res;
142217fd14ceSopenharmony_ci    }
142317fd14ceSopenharmony_ci    res = InitCredMgr();
142417fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
142517fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init cred mgr!");
142617fd14ceSopenharmony_ci        return res;
142717fd14ceSopenharmony_ci    }
142817fd14ceSopenharmony_ci    res = InitModules();
142917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
143017fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init all authenticator modules!");
143117fd14ceSopenharmony_ci        goto CLEAN_CRED;
143217fd14ceSopenharmony_ci    }
143317fd14ceSopenharmony_ci    res = InitCallbackManager();
143417fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
143517fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init callback manage module!");
143617fd14ceSopenharmony_ci        goto CLEAN_MODULE;
143717fd14ceSopenharmony_ci    }
143817fd14ceSopenharmony_ci    res = InitGroupManager();
143917fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
144017fd14ceSopenharmony_ci        goto CLEAN_CALLBACK;
144117fd14ceSopenharmony_ci    }
144217fd14ceSopenharmony_ci    res = InitDevSessionManager();
144317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
144417fd14ceSopenharmony_ci        goto CLEAN_GROUP_MANAGER;
144517fd14ceSopenharmony_ci    }
144617fd14ceSopenharmony_ci    (void)InitGroupAuthManager();
144717fd14ceSopenharmony_ci    res = InitTaskManager();
144817fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
144917fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init worker thread!");
145017fd14ceSopenharmony_ci        goto CLEAN_ALL;
145117fd14ceSopenharmony_ci    }
145217fd14ceSopenharmony_ci    return res;
145317fd14ceSopenharmony_ciCLEAN_ALL:
145417fd14ceSopenharmony_ci    DestroyDevSessionManager();
145517fd14ceSopenharmony_ciCLEAN_GROUP_MANAGER:
145617fd14ceSopenharmony_ci    DestroyGroupManager();
145717fd14ceSopenharmony_ciCLEAN_CALLBACK:
145817fd14ceSopenharmony_ci    DestroyCallbackManager();
145917fd14ceSopenharmony_ciCLEAN_MODULE:
146017fd14ceSopenharmony_ci    DestroyModules();
146117fd14ceSopenharmony_ciCLEAN_CRED:
146217fd14ceSopenharmony_ci    DestroyCredMgr();
146317fd14ceSopenharmony_ci    return res;
146417fd14ceSopenharmony_ci}
146517fd14ceSopenharmony_ci
146617fd14ceSopenharmony_cistatic void InitPseudonymModule(void)
146717fd14ceSopenharmony_ci{
146817fd14ceSopenharmony_ci    PseudonymManager *manager = GetPseudonymInstance();
146917fd14ceSopenharmony_ci    if (manager == NULL) {
147017fd14ceSopenharmony_ci        LOGE("Pseudonym manager is null!");
147117fd14ceSopenharmony_ci        return;
147217fd14ceSopenharmony_ci    }
147317fd14ceSopenharmony_ci    manager->loadPseudonymData();
147417fd14ceSopenharmony_ci}
147517fd14ceSopenharmony_ci
147617fd14ceSopenharmony_cistatic void DoOnChannelOpened(HcTaskBase *baseTask)
147717fd14ceSopenharmony_ci{
147817fd14ceSopenharmony_ci    if (baseTask == NULL) {
147917fd14ceSopenharmony_ci        LOGE("The input task is NULL!");
148017fd14ceSopenharmony_ci        return;
148117fd14ceSopenharmony_ci    }
148217fd14ceSopenharmony_ci    SoftBusTask *task = (SoftBusTask *)baseTask;
148317fd14ceSopenharmony_ci    SET_LOG_MODE(TRACE_MODE);
148417fd14ceSopenharmony_ci    SET_TRACE_ID(task->requestId);
148517fd14ceSopenharmony_ci    LOGI("[Start]: DoOnChannelOpened!");
148617fd14ceSopenharmony_ci    int32_t res = StartDevSession(task->requestId);
148717fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
148817fd14ceSopenharmony_ci        LOGE("start session fail.[Res]: %d", res);
148917fd14ceSopenharmony_ci        CloseDevSession(task->requestId);
149017fd14ceSopenharmony_ci    }
149117fd14ceSopenharmony_ci}
149217fd14ceSopenharmony_ci
149317fd14ceSopenharmony_cistatic void InitSoftBusTask(SoftBusTask *task, int64_t requestId)
149417fd14ceSopenharmony_ci{
149517fd14ceSopenharmony_ci    task->base.doAction = DoOnChannelOpened;
149617fd14ceSopenharmony_ci    task->base.destroy = NULL;
149717fd14ceSopenharmony_ci    task->requestId = requestId;
149817fd14ceSopenharmony_ci}
149917fd14ceSopenharmony_ci
150017fd14ceSopenharmony_cistatic int OnChannelOpenedCb(int64_t requestId, int result)
150117fd14ceSopenharmony_ci{
150217fd14ceSopenharmony_ci    if (result != HC_SUCCESS) {
150317fd14ceSopenharmony_ci        LOGE("[SoftBus][Out]: Failed to open channel! res: %d", result);
150417fd14ceSopenharmony_ci        CloseDevSession(requestId);
150517fd14ceSopenharmony_ci        return HC_ERR_SOFT_BUS;
150617fd14ceSopenharmony_ci    }
150717fd14ceSopenharmony_ci    LOGI("[Start]: OnChannelOpened! [ReqId]: %" PRId64, requestId);
150817fd14ceSopenharmony_ci    SoftBusTask *task = (SoftBusTask *)HcMalloc(sizeof(SoftBusTask), 0);
150917fd14ceSopenharmony_ci    if (task == NULL) {
151017fd14ceSopenharmony_ci        LOGE("Failed to allocate task memory!");
151117fd14ceSopenharmony_ci        CloseDevSession(requestId);
151217fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
151317fd14ceSopenharmony_ci    }
151417fd14ceSopenharmony_ci    InitSoftBusTask(task, requestId);
151517fd14ceSopenharmony_ci    if (PushTask((HcTaskBase *)task) != HC_SUCCESS) {
151617fd14ceSopenharmony_ci        HcFree(task);
151717fd14ceSopenharmony_ci        CloseDevSession(requestId);
151817fd14ceSopenharmony_ci        return HC_ERR_INIT_TASK_FAIL;
151917fd14ceSopenharmony_ci    }
152017fd14ceSopenharmony_ci    LOGI("[End]: OnChannelOpened!");
152117fd14ceSopenharmony_ci    return HC_SUCCESS;
152217fd14ceSopenharmony_ci}
152317fd14ceSopenharmony_ci
152417fd14ceSopenharmony_cistatic void OnChannelClosedCb(void)
152517fd14ceSopenharmony_ci{
152617fd14ceSopenharmony_ci    return;
152717fd14ceSopenharmony_ci}
152817fd14ceSopenharmony_ci
152917fd14ceSopenharmony_cistatic void OnBytesReceivedCb(int64_t requestId, uint8_t *data, uint32_t dataLen)
153017fd14ceSopenharmony_ci{
153117fd14ceSopenharmony_ci    if ((data == NULL) || (dataLen == 0) || (dataLen > MAX_DATA_BUFFER_SIZE)) {
153217fd14ceSopenharmony_ci        LOGE("Invalid input params!");
153317fd14ceSopenharmony_ci        return;
153417fd14ceSopenharmony_ci    }
153517fd14ceSopenharmony_ci    (void)ProcessBindData(requestId, data, dataLen);
153617fd14ceSopenharmony_ci}
153717fd14ceSopenharmony_ci
153817fd14ceSopenharmony_cistatic int32_t RegCallback(const char *appId, const DeviceAuthCallback *callback)
153917fd14ceSopenharmony_ci{
154017fd14ceSopenharmony_ci    SET_LOG_MODE(NORMAL_MODE);
154117fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(DEFAULT_OS_ACCOUNT, NULL, appId, REG_CALLBACK_EVENT);
154217fd14ceSopenharmony_ci    if ((appId == NULL) || (callback == NULL)) {
154317fd14ceSopenharmony_ci        LOGE("The input parameters contains NULL value!");
154417fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
154517fd14ceSopenharmony_ci    }
154617fd14ceSopenharmony_ci    ChannelProxy proxy = {
154717fd14ceSopenharmony_ci        .onChannelOpened = OnChannelOpenedCb,
154817fd14ceSopenharmony_ci        .onChannelClosed = OnChannelClosedCb,
154917fd14ceSopenharmony_ci        .onBytesReceived = OnBytesReceivedCb
155017fd14ceSopenharmony_ci    };
155117fd14ceSopenharmony_ci    int32_t res = InitChannelManager(&proxy);
155217fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
155317fd14ceSopenharmony_ci        LOGE("[End]: [Service]: Failed to init channel manage module!");
155417fd14ceSopenharmony_ci        return res;
155517fd14ceSopenharmony_ci    }
155617fd14ceSopenharmony_ci    return RegGroupManagerCallback(appId, callback);
155717fd14ceSopenharmony_ci}
155817fd14ceSopenharmony_ci
155917fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC int InitDeviceAuthService(void)
156017fd14ceSopenharmony_ci{
156117fd14ceSopenharmony_ci    LOGI("[Service]: Start to init device auth service!");
156217fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(DEFAULT_OS_ACCOUNT, NULL, NULL, INIT_DEVICE_AUTH_SERVICE_EVENT);
156317fd14ceSopenharmony_ci    if (CheckInit() == FINISH_INIT) {
156417fd14ceSopenharmony_ci        LOGI("[End]: [Service]: Device auth service is running!");
156517fd14ceSopenharmony_ci        return HC_SUCCESS;
156617fd14ceSopenharmony_ci    }
156717fd14ceSopenharmony_ci    int32_t res = AllocGmAndGa();
156817fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
156917fd14ceSopenharmony_ci        return res;
157017fd14ceSopenharmony_ci    }
157117fd14ceSopenharmony_ci    InitOsAccountAdapter();
157217fd14ceSopenharmony_ci    res = InitAllModules();
157317fd14ceSopenharmony_ci    if (res != HC_SUCCESS) {
157417fd14ceSopenharmony_ci        DestroyGmAndGa();
157517fd14ceSopenharmony_ci        return res;
157617fd14ceSopenharmony_ci    }
157717fd14ceSopenharmony_ci    INIT_PERFORMANCE_DUMPER();
157817fd14ceSopenharmony_ci    InitPseudonymModule();
157917fd14ceSopenharmony_ci    DEV_AUTH_LOAD_PLUGIN();
158017fd14ceSopenharmony_ci    SetInitStatus();
158117fd14ceSopenharmony_ci    LOGI("[End]: [Service]: Init device auth service successfully!");
158217fd14ceSopenharmony_ci    return HC_SUCCESS;
158317fd14ceSopenharmony_ci}
158417fd14ceSopenharmony_ci
158517fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC void DestroyDeviceAuthService(void)
158617fd14ceSopenharmony_ci{
158717fd14ceSopenharmony_ci    LOGI("[Service]: Start to destroy device auth service!");
158817fd14ceSopenharmony_ci    DEV_AUTH_REPORT_UE_CALL_EVENT_BY_PARAMS(DEFAULT_OS_ACCOUNT, NULL, NULL, DESTROY_DEVICE_AUTH_SERVICE_EVENT);
158917fd14ceSopenharmony_ci    if (CheckDestroy() == FINISH_DESTROY) {
159017fd14ceSopenharmony_ci        LOGI("[End]: [Service]: The service has not been initialized!");
159117fd14ceSopenharmony_ci        return;
159217fd14ceSopenharmony_ci    }
159317fd14ceSopenharmony_ci    DestroyTaskManager();
159417fd14ceSopenharmony_ci    DestroyDevSessionManager();
159517fd14ceSopenharmony_ci    DestroyGroupManager();
159617fd14ceSopenharmony_ci    DestroyGmAndGa();
159717fd14ceSopenharmony_ci    DEV_AUTH_UNLOAD_PLUGIN();
159817fd14ceSopenharmony_ci    DestroyModules();
159917fd14ceSopenharmony_ci    DestroyCredMgr();
160017fd14ceSopenharmony_ci    DestroyChannelManager();
160117fd14ceSopenharmony_ci    DestroyCallbackManager();
160217fd14ceSopenharmony_ci    DESTROY_PERFORMANCE_DUMPER();
160317fd14ceSopenharmony_ci    DestroyPseudonymManager();
160417fd14ceSopenharmony_ci    DestroyOsAccountAdapter();
160517fd14ceSopenharmony_ci    SetDeInitStatus();
160617fd14ceSopenharmony_ci    LOGI("[End]: [Service]: Destroy device auth service successfully!");
160717fd14ceSopenharmony_ci}
160817fd14ceSopenharmony_ci
160917fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC const DeviceGroupManager *GetGmInstance(void)
161017fd14ceSopenharmony_ci{
161117fd14ceSopenharmony_ci    if (g_groupManagerInstance == NULL) {
161217fd14ceSopenharmony_ci        LOGE("Service not init.");
161317fd14ceSopenharmony_ci        return NULL;
161417fd14ceSopenharmony_ci    }
161517fd14ceSopenharmony_ci
161617fd14ceSopenharmony_ci    g_groupManagerInstance->regCallback = RegCallback;
161717fd14ceSopenharmony_ci    g_groupManagerInstance->unRegCallback = UnRegGroupManagerCallback;
161817fd14ceSopenharmony_ci    g_groupManagerInstance->regDataChangeListener = RegListenerImpl;
161917fd14ceSopenharmony_ci    g_groupManagerInstance->unRegDataChangeListener = UnRegListenerImpl;
162017fd14ceSopenharmony_ci    g_groupManagerInstance->createGroup = CreateGroupImpl;
162117fd14ceSopenharmony_ci    g_groupManagerInstance->deleteGroup = DeleteGroupImpl;
162217fd14ceSopenharmony_ci    g_groupManagerInstance->addMemberToGroup = AddMemberToGroup;
162317fd14ceSopenharmony_ci    g_groupManagerInstance->deleteMemberFromGroup = DeleteMemberFromGroupImpl;
162417fd14ceSopenharmony_ci    g_groupManagerInstance->addMultiMembersToGroup = AddMultiMembersToGroupImpl;
162517fd14ceSopenharmony_ci    g_groupManagerInstance->delMultiMembersFromGroup = DelMultiMembersFromGroupImpl;
162617fd14ceSopenharmony_ci    g_groupManagerInstance->processData = ProcessBindData;
162717fd14ceSopenharmony_ci    g_groupManagerInstance->getRegisterInfo = GetRegisterInfoImpl;
162817fd14ceSopenharmony_ci    g_groupManagerInstance->checkAccessToGroup = CheckAccessToGroupImpl;
162917fd14ceSopenharmony_ci    g_groupManagerInstance->getPkInfoList = GetPkInfoListImpl;
163017fd14ceSopenharmony_ci    g_groupManagerInstance->getGroupInfoById = GetGroupInfoByIdImpl;
163117fd14ceSopenharmony_ci    g_groupManagerInstance->getGroupInfo = GetGroupInfoImpl;
163217fd14ceSopenharmony_ci    g_groupManagerInstance->getJoinedGroups = GetJoinedGroupsImpl;
163317fd14ceSopenharmony_ci    g_groupManagerInstance->getRelatedGroups = GetRelatedGroupsImpl;
163417fd14ceSopenharmony_ci    g_groupManagerInstance->getDeviceInfoById = GetDeviceInfoByIdImpl;
163517fd14ceSopenharmony_ci    g_groupManagerInstance->getTrustedDevices = GetTrustedDevicesImpl;
163617fd14ceSopenharmony_ci    g_groupManagerInstance->isDeviceInGroup = IsDeviceInGroupImpl;
163717fd14ceSopenharmony_ci    g_groupManagerInstance->cancelRequest = CancelRequest;
163817fd14ceSopenharmony_ci    g_groupManagerInstance->destroyInfo = DestroyInfoImpl;
163917fd14ceSopenharmony_ci    return g_groupManagerInstance;
164017fd14ceSopenharmony_ci}
164117fd14ceSopenharmony_ci
164217fd14ceSopenharmony_ciDEVICE_AUTH_API_PUBLIC const GroupAuthManager *GetGaInstance(void)
164317fd14ceSopenharmony_ci{
164417fd14ceSopenharmony_ci    if (g_groupAuthManager == NULL) {
164517fd14ceSopenharmony_ci        LOGE("Service not init.");
164617fd14ceSopenharmony_ci        return NULL;
164717fd14ceSopenharmony_ci    }
164817fd14ceSopenharmony_ci
164917fd14ceSopenharmony_ci    g_groupAuthManager->processData = ProcessData;
165017fd14ceSopenharmony_ci    g_groupAuthManager->authDevice = AuthDevice;
165117fd14ceSopenharmony_ci    g_groupAuthManager->cancelRequest = CancelRequest;
165217fd14ceSopenharmony_ci    g_groupAuthManager->getRealInfo = GetRealInfo;
165317fd14ceSopenharmony_ci    g_groupAuthManager->getPseudonymId = GetPseudonymId;
165417fd14ceSopenharmony_ci    return g_groupAuthManager;
165517fd14ceSopenharmony_ci}
1656