117fd14ceSopenharmony_ci/*
217fd14ceSopenharmony_ci * Copyright (C) 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 "cert_operation.h"
1717fd14ceSopenharmony_ci
1817fd14ceSopenharmony_ci#include "account_auth_plugin_proxy.h"
1917fd14ceSopenharmony_ci#include "account_related_group_auth.h"
2017fd14ceSopenharmony_ci#include "alg_loader.h"
2117fd14ceSopenharmony_ci#include "asy_token_manager.h"
2217fd14ceSopenharmony_ci#include "data_manager.h"
2317fd14ceSopenharmony_ci#include "group_auth_data_operation.h"
2417fd14ceSopenharmony_ci#include "group_operation_common.h"
2517fd14ceSopenharmony_ci#include "hc_log.h"
2617fd14ceSopenharmony_ci#include "hc_types.h"
2717fd14ceSopenharmony_ci#include "identity_common.h"
2817fd14ceSopenharmony_ci#include "pseudonym_manager.h"
2917fd14ceSopenharmony_ci#include "sym_token_manager.h"
3017fd14ceSopenharmony_ci
3117fd14ceSopenharmony_ci#define FIELD_SHARED_SECRET "sharedSecret"
3217fd14ceSopenharmony_ci
3317fd14ceSopenharmony_cistatic int32_t SetProtocolsForUidType(IdentityInfo *info)
3417fd14ceSopenharmony_ci{
3517fd14ceSopenharmony_ci#ifdef ENABLE_ACCOUNT_AUTH_ISO
3617fd14ceSopenharmony_ci    ProtocolEntity *entity = (ProtocolEntity *)HcMalloc(sizeof(ProtocolEntity), 0);
3717fd14ceSopenharmony_ci    if (entity == NULL) {
3817fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for entity!");
3917fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
4017fd14ceSopenharmony_ci    }
4117fd14ceSopenharmony_ci    entity->protocolType = ALG_ISO;
4217fd14ceSopenharmony_ci    entity->expandProcessCmds = CMD_ADD_TRUST_DEVICE;
4317fd14ceSopenharmony_ci    if (info->protocolVec.pushBack(&info->protocolVec, (const ProtocolEntity **)&entity) == NULL) {
4417fd14ceSopenharmony_ci        LOGE("Failed to push entity to vec");
4517fd14ceSopenharmony_ci        HcFree(entity);
4617fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
4717fd14ceSopenharmony_ci    }
4817fd14ceSopenharmony_ci#else
4917fd14ceSopenharmony_ci    (void)info;
5017fd14ceSopenharmony_ci#endif
5117fd14ceSopenharmony_ci
5217fd14ceSopenharmony_ci    return HC_SUCCESS;
5317fd14ceSopenharmony_ci}
5417fd14ceSopenharmony_ci
5517fd14ceSopenharmony_cistatic int32_t GetIdentityInfoByType(int32_t keyType, int32_t trustType, const char *groupId, IdentityInfo *info)
5617fd14ceSopenharmony_ci{
5717fd14ceSopenharmony_ci    CJson *urlJson = CreateJson();
5817fd14ceSopenharmony_ci    if (urlJson == NULL) {
5917fd14ceSopenharmony_ci        LOGE("Failed to create url json!");
6017fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
6117fd14ceSopenharmony_ci    }
6217fd14ceSopenharmony_ci    if (AddIntToJson(urlJson, PRESHARED_URL_CREDENTIAL_TYPE, PRE_SHARED) != HC_SUCCESS) {
6317fd14ceSopenharmony_ci        LOGE("Failed to add credential type!");
6417fd14ceSopenharmony_ci        FreeJson(urlJson);
6517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
6617fd14ceSopenharmony_ci    }
6717fd14ceSopenharmony_ci    if (AddIntToJson(urlJson, PRESHARED_URL_KEY_TYPE, keyType) != HC_SUCCESS) {
6817fd14ceSopenharmony_ci        LOGE("Failed to add key type!");
6917fd14ceSopenharmony_ci        FreeJson(urlJson);
7017fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
7117fd14ceSopenharmony_ci    }
7217fd14ceSopenharmony_ci    if (AddIntToJson(urlJson, PRESHARED_URL_TRUST_TYPE, trustType) != HC_SUCCESS) {
7317fd14ceSopenharmony_ci        LOGE("Failed to add trust type!");
7417fd14ceSopenharmony_ci        FreeJson(urlJson);
7517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
7617fd14ceSopenharmony_ci    }
7717fd14ceSopenharmony_ci    if ((trustType == TRUST_TYPE_P2P || trustType == TRUST_TYPE_UID) &&
7817fd14ceSopenharmony_ci        AddStringToJson(urlJson, FIELD_GROUP_ID, groupId) != HC_SUCCESS) {
7917fd14ceSopenharmony_ci        LOGE("Failed to add group id!");
8017fd14ceSopenharmony_ci        FreeJson(urlJson);
8117fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
8217fd14ceSopenharmony_ci    }
8317fd14ceSopenharmony_ci    char *urlStr = PackJsonToString(urlJson);
8417fd14ceSopenharmony_ci    FreeJson(urlJson);
8517fd14ceSopenharmony_ci    if (urlStr == NULL) {
8617fd14ceSopenharmony_ci        LOGE("Failed to pack url json to string!");
8717fd14ceSopenharmony_ci        return HC_ERR_PACKAGE_JSON_TO_STRING_FAIL;
8817fd14ceSopenharmony_ci    }
8917fd14ceSopenharmony_ci
9017fd14ceSopenharmony_ci    int32_t ret = SetPreSharedUrlForProof(urlStr, &info->proof.preSharedUrl);
9117fd14ceSopenharmony_ci    FreeJsonString(urlStr);
9217fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
9317fd14ceSopenharmony_ci        LOGE("Failed to set preSharedUrl of proof!");
9417fd14ceSopenharmony_ci        return ret;
9517fd14ceSopenharmony_ci    }
9617fd14ceSopenharmony_ci
9717fd14ceSopenharmony_ci    ret = SetProtocolsForUidType(info);
9817fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
9917fd14ceSopenharmony_ci        LOGE("Failed to set protocols!");
10017fd14ceSopenharmony_ci        return ret;
10117fd14ceSopenharmony_ci    }
10217fd14ceSopenharmony_ci
10317fd14ceSopenharmony_ci    info->proofType = PRE_SHARED;
10417fd14ceSopenharmony_ci    return ret;
10517fd14ceSopenharmony_ci}
10617fd14ceSopenharmony_ci
10717fd14ceSopenharmony_ciint32_t AddCertInfoToJson(const CertInfo *certInfo, CJson *out)
10817fd14ceSopenharmony_ci{
10917fd14ceSopenharmony_ci    if (certInfo == NULL || out == NULL) {
11017fd14ceSopenharmony_ci        LOGE("Invalid cert info or out!");
11117fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
11217fd14ceSopenharmony_ci    }
11317fd14ceSopenharmony_ci    if (AddIntToJson(out, FIELD_SIGN_ALG, certInfo->signAlg) != HC_SUCCESS) {
11417fd14ceSopenharmony_ci        LOGE("add sign alg to json failed!");
11517fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
11617fd14ceSopenharmony_ci    }
11717fd14ceSopenharmony_ci    if (AddStringToJson(out, FIELD_PK_INFO, (const char *)certInfo->pkInfoStr.val) != HC_SUCCESS) {
11817fd14ceSopenharmony_ci        LOGE("add pk info str to json failed!");
11917fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
12017fd14ceSopenharmony_ci    }
12117fd14ceSopenharmony_ci    if (AddByteToJson(out, FIELD_PK_INFO_SIGNATURE, certInfo->pkInfoSignature.val,
12217fd14ceSopenharmony_ci        certInfo->pkInfoSignature.length) != HC_SUCCESS) {
12317fd14ceSopenharmony_ci        LOGE("add pk info sign to json failed!");
12417fd14ceSopenharmony_ci        return HC_ERR_JSON_ADD;
12517fd14ceSopenharmony_ci    }
12617fd14ceSopenharmony_ci    return HC_SUCCESS;
12717fd14ceSopenharmony_ci}
12817fd14ceSopenharmony_ci
12917fd14ceSopenharmony_cistatic int32_t GetSelfUserId(int32_t osAccountId, char *userId, uint32_t userIdLen)
13017fd14ceSopenharmony_ci{
13117fd14ceSopenharmony_ci    GroupEntryVec accountVec = CreateGroupEntryVec();
13217fd14ceSopenharmony_ci    QueryGroupParams queryParams = InitQueryGroupParams();
13317fd14ceSopenharmony_ci    queryParams.groupType = IDENTICAL_ACCOUNT_GROUP;
13417fd14ceSopenharmony_ci    do {
13517fd14ceSopenharmony_ci        if (QueryGroups(osAccountId, &queryParams, &accountVec) != HC_SUCCESS) {
13617fd14ceSopenharmony_ci            LOGD("No identical-account group in db, no identical-account auth!");
13717fd14ceSopenharmony_ci            break;
13817fd14ceSopenharmony_ci        }
13917fd14ceSopenharmony_ci        uint32_t index = 0;
14017fd14ceSopenharmony_ci        TrustedGroupEntry **ptr = NULL;
14117fd14ceSopenharmony_ci        while (index < accountVec.size(&accountVec)) {
14217fd14ceSopenharmony_ci            ptr = accountVec.getp(&accountVec, index);
14317fd14ceSopenharmony_ci            if ((ptr == NULL) || (*ptr == NULL)) {
14417fd14ceSopenharmony_ci                index++;
14517fd14ceSopenharmony_ci                continue;
14617fd14ceSopenharmony_ci            }
14717fd14ceSopenharmony_ci            if (memcpy_s(userId, userIdLen, StringGet(&(*ptr)->userId), StringLength(&(*ptr)->userId)) != EOK) {
14817fd14ceSopenharmony_ci                LOGE("copy fail");
14917fd14ceSopenharmony_ci                ClearGroupEntryVec(&accountVec);
15017fd14ceSopenharmony_ci                return HC_ERROR;
15117fd14ceSopenharmony_ci            }
15217fd14ceSopenharmony_ci            index++;
15317fd14ceSopenharmony_ci        }
15417fd14ceSopenharmony_ci    } while (0);
15517fd14ceSopenharmony_ci    ClearGroupEntryVec(&accountVec);
15617fd14ceSopenharmony_ci    return HC_SUCCESS;
15717fd14ceSopenharmony_ci}
15817fd14ceSopenharmony_ci
15917fd14ceSopenharmony_cistatic void GetLocalIdenticalGroup(int32_t osAccountId, CJson *param, QueryGroupParams *queryParams,
16017fd14ceSopenharmony_ci    GroupEntryVec *groupEntryVec)
16117fd14ceSopenharmony_ci{
16217fd14ceSopenharmony_ci    char selfUserId[USER_ID_LEN] = { 0 };
16317fd14ceSopenharmony_ci    int32_t ret = GetSelfUserId(osAccountId, selfUserId, USER_ID_LEN);
16417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
16517fd14ceSopenharmony_ci        LOGE("Get user id fail");
16617fd14ceSopenharmony_ci        return;
16717fd14ceSopenharmony_ci    }
16817fd14ceSopenharmony_ci
16917fd14ceSopenharmony_ci    ret = AddStringToJson(param, FIELD_USER_ID, selfUserId);
17017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
17117fd14ceSopenharmony_ci        LOGE("add self userId to params fail");
17217fd14ceSopenharmony_ci        return;
17317fd14ceSopenharmony_ci    }
17417fd14ceSopenharmony_ci
17517fd14ceSopenharmony_ci    BaseGroupAuth *groupAuth = GetAccountRelatedGroupAuth();
17617fd14ceSopenharmony_ci    if (groupAuth == NULL) {
17717fd14ceSopenharmony_ci        LOGE("Failed to get account group auth!");
17817fd14ceSopenharmony_ci        return;
17917fd14ceSopenharmony_ci    }
18017fd14ceSopenharmony_ci
18117fd14ceSopenharmony_ci    ((AccountRelatedGroupAuth *)groupAuth)
18217fd14ceSopenharmony_ci        ->getAccountCandidateGroup(osAccountId, param, queryParams, groupEntryVec);
18317fd14ceSopenharmony_ci    if (groupEntryVec->size(groupEntryVec) == 0) {
18417fd14ceSopenharmony_ci        LOGE("group not found by self user id!");
18517fd14ceSopenharmony_ci    }
18617fd14ceSopenharmony_ci}
18717fd14ceSopenharmony_ci
18817fd14ceSopenharmony_cistatic TrustedGroupEntry *GetSelfGroupEntryByPeerCert(int32_t osAccountId, const CertInfo *certInfo)
18917fd14ceSopenharmony_ci{
19017fd14ceSopenharmony_ci    CJson *peerPkInfoJson = CreateJsonFromString((const char *)certInfo->pkInfoStr.val);
19117fd14ceSopenharmony_ci    if (peerPkInfoJson == NULL) {
19217fd14ceSopenharmony_ci        LOGE("Failed to create peer pkInfoJson!");
19317fd14ceSopenharmony_ci        return NULL;
19417fd14ceSopenharmony_ci    }
19517fd14ceSopenharmony_ci    const char *peerUserId = GetStringFromJson(peerPkInfoJson, FIELD_USER_ID);
19617fd14ceSopenharmony_ci    if (peerUserId == NULL) {
19717fd14ceSopenharmony_ci        LOGE("Failed to get peer userId!");
19817fd14ceSopenharmony_ci        FreeJson(peerPkInfoJson);
19917fd14ceSopenharmony_ci        return NULL;
20017fd14ceSopenharmony_ci    }
20117fd14ceSopenharmony_ci    CJson *param = CreateJson();
20217fd14ceSopenharmony_ci    if (param == NULL) {
20317fd14ceSopenharmony_ci        LOGE("Failed to create query param!");
20417fd14ceSopenharmony_ci        FreeJson(peerPkInfoJson);
20517fd14ceSopenharmony_ci        return NULL;
20617fd14ceSopenharmony_ci    }
20717fd14ceSopenharmony_ci    if (AddStringToJson(param, FIELD_USER_ID, peerUserId) != HC_SUCCESS) {
20817fd14ceSopenharmony_ci        LOGE("Failed to add peer userId to param!");
20917fd14ceSopenharmony_ci        FreeJson(param);
21017fd14ceSopenharmony_ci        FreeJson(peerPkInfoJson);
21117fd14ceSopenharmony_ci        return NULL;
21217fd14ceSopenharmony_ci    }
21317fd14ceSopenharmony_ci    FreeJson(peerPkInfoJson);
21417fd14ceSopenharmony_ci    BaseGroupAuth *groupAuth = GetAccountRelatedGroupAuth();
21517fd14ceSopenharmony_ci    if (groupAuth == NULL) {
21617fd14ceSopenharmony_ci        LOGE("Failed to get account group auth!");
21717fd14ceSopenharmony_ci        FreeJson(param);
21817fd14ceSopenharmony_ci        return NULL;
21917fd14ceSopenharmony_ci    }
22017fd14ceSopenharmony_ci    GroupEntryVec groupEntryVec = CreateGroupEntryVec();
22117fd14ceSopenharmony_ci    QueryGroupParams queryParams = InitQueryGroupParams();
22217fd14ceSopenharmony_ci    ((AccountRelatedGroupAuth *)groupAuth)
22317fd14ceSopenharmony_ci        ->getAccountCandidateGroup(osAccountId, param, &queryParams, &groupEntryVec);
22417fd14ceSopenharmony_ci    if (groupEntryVec.size(&groupEntryVec) == 0) {
22517fd14ceSopenharmony_ci        LOGE("group not found by peer user id!");
22617fd14ceSopenharmony_ci        (void)GetLocalIdenticalGroup(osAccountId, param, &queryParams, &groupEntryVec);
22717fd14ceSopenharmony_ci        if (groupEntryVec.size(&groupEntryVec) == 0) {
22817fd14ceSopenharmony_ci            LOGE("can not find group");
22917fd14ceSopenharmony_ci            ClearGroupEntryVec(&groupEntryVec);
23017fd14ceSopenharmony_ci            FreeJson(param);
23117fd14ceSopenharmony_ci            return NULL;
23217fd14ceSopenharmony_ci        }
23317fd14ceSopenharmony_ci    }
23417fd14ceSopenharmony_ci    FreeJson(param);
23517fd14ceSopenharmony_ci    TrustedGroupEntry *returnEntry = DeepCopyGroupEntry(groupEntryVec.get(&groupEntryVec, 0));
23617fd14ceSopenharmony_ci    ClearGroupEntryVec(&groupEntryVec);
23717fd14ceSopenharmony_ci    return returnEntry;
23817fd14ceSopenharmony_ci}
23917fd14ceSopenharmony_ci
24017fd14ceSopenharmony_cistatic int32_t GetSelfDeviceEntryByPeerCert(
24117fd14ceSopenharmony_ci    int32_t osAccountId, const CertInfo *certInfo, TrustedDeviceEntry *deviceEntry)
24217fd14ceSopenharmony_ci{
24317fd14ceSopenharmony_ci    TrustedGroupEntry *groupEntry = GetSelfGroupEntryByPeerCert(osAccountId, certInfo);
24417fd14ceSopenharmony_ci    if (groupEntry == NULL) {
24517fd14ceSopenharmony_ci        LOGE("Failed to get self group entry!");
24617fd14ceSopenharmony_ci        return HC_ERR_GROUP_NOT_EXIST;
24717fd14ceSopenharmony_ci    }
24817fd14ceSopenharmony_ci    const char *groupId = StringGet(&groupEntry->id);
24917fd14ceSopenharmony_ci    int32_t ret = GetSelfDeviceEntry(osAccountId, groupId, deviceEntry);
25017fd14ceSopenharmony_ci    DestroyGroupEntry(groupEntry);
25117fd14ceSopenharmony_ci    return ret;
25217fd14ceSopenharmony_ci}
25317fd14ceSopenharmony_ci
25417fd14ceSopenharmony_cistatic int32_t VerifyPeerCertInfo(int32_t osAccountId, const char *selfUserId, const char *selfAuthId,
25517fd14ceSopenharmony_ci    const CertInfo *certInfo)
25617fd14ceSopenharmony_ci{
25717fd14ceSopenharmony_ci    uint8_t *keyAliasValue = (uint8_t *)HcMalloc(SHA256_LEN, 0);
25817fd14ceSopenharmony_ci    if (keyAliasValue == NULL) {
25917fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for key alias value!");
26017fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
26117fd14ceSopenharmony_ci    }
26217fd14ceSopenharmony_ci    Uint8Buff keyAlias = { .val = keyAliasValue, .length = SHA256_LEN };
26317fd14ceSopenharmony_ci    int32_t ret = GetAccountAuthTokenManager()->generateKeyAlias(selfUserId, selfAuthId, &keyAlias, true);
26417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
26517fd14ceSopenharmony_ci        LOGE("Failed to generate server pk alias!");
26617fd14ceSopenharmony_ci        HcFree(keyAliasValue);
26717fd14ceSopenharmony_ci        return ret;
26817fd14ceSopenharmony_ci    }
26917fd14ceSopenharmony_ci    KeyParams keyParams = { { keyAlias.val, keyAlias.length, true }, false, osAccountId };
27017fd14ceSopenharmony_ci    ret = GetLoaderInstance()->verify(
27117fd14ceSopenharmony_ci        &keyParams, &certInfo->pkInfoStr, certInfo->signAlg, &certInfo->pkInfoSignature);
27217fd14ceSopenharmony_ci    HcFree(keyAliasValue);
27317fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
27417fd14ceSopenharmony_ci        return HC_ERR_VERIFY_FAILED;
27517fd14ceSopenharmony_ci    }
27617fd14ceSopenharmony_ci    return HC_SUCCESS;
27717fd14ceSopenharmony_ci}
27817fd14ceSopenharmony_ci
27917fd14ceSopenharmony_cistatic int32_t GetPeerPubKeyFromCert(const CertInfo *peerCertInfo, Uint8Buff *peerPkBuff)
28017fd14ceSopenharmony_ci{
28117fd14ceSopenharmony_ci    CJson *pkInfoPeer = CreateJsonFromString((const char *)peerCertInfo->pkInfoStr.val);
28217fd14ceSopenharmony_ci    if (pkInfoPeer == NULL) {
28317fd14ceSopenharmony_ci        LOGE("Failed to create peer pkInfo json!");
28417fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
28517fd14ceSopenharmony_ci    }
28617fd14ceSopenharmony_ci    const char *devicePk = GetStringFromJson(pkInfoPeer, FIELD_DEVICE_PK);
28717fd14ceSopenharmony_ci    if (devicePk == NULL) {
28817fd14ceSopenharmony_ci        LOGE("Failed to get peer devicePk!");
28917fd14ceSopenharmony_ci        FreeJson(pkInfoPeer);
29017fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
29117fd14ceSopenharmony_ci    }
29217fd14ceSopenharmony_ci    uint32_t pkSize = HcStrlen(devicePk) / BYTE_TO_HEX_OPER_LENGTH;
29317fd14ceSopenharmony_ci    peerPkBuff->val = (uint8_t *)HcMalloc(pkSize, 0);
29417fd14ceSopenharmony_ci    if (peerPkBuff->val == NULL) {
29517fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for peerPk!");
29617fd14ceSopenharmony_ci        FreeJson(pkInfoPeer);
29717fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
29817fd14ceSopenharmony_ci    }
29917fd14ceSopenharmony_ci    if (GetByteFromJson(pkInfoPeer, FIELD_DEVICE_PK, peerPkBuff->val, pkSize) != HC_SUCCESS) {
30017fd14ceSopenharmony_ci        LOGE("Failed to get peer public key!");
30117fd14ceSopenharmony_ci        HcFree(peerPkBuff->val);
30217fd14ceSopenharmony_ci        FreeJson(pkInfoPeer);
30317fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
30417fd14ceSopenharmony_ci    }
30517fd14ceSopenharmony_ci    FreeJson(pkInfoPeer);
30617fd14ceSopenharmony_ci    peerPkBuff->length = pkSize;
30717fd14ceSopenharmony_ci    return HC_SUCCESS;
30817fd14ceSopenharmony_ci}
30917fd14ceSopenharmony_ci
31017fd14ceSopenharmony_cistatic int32_t GetSharedSecretForAccountInPake(int32_t osAccountId, const char *userId, const char *authId,
31117fd14ceSopenharmony_ci    const CertInfo *peerCertInfo, Uint8Buff *sharedSecret)
31217fd14ceSopenharmony_ci{
31317fd14ceSopenharmony_ci    uint8_t *priAliasVal = (uint8_t *)HcMalloc(SHA256_LEN, 0);
31417fd14ceSopenharmony_ci    if (priAliasVal == NULL) {
31517fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for self key alias!");
31617fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
31717fd14ceSopenharmony_ci    }
31817fd14ceSopenharmony_ci    Uint8Buff aliasBuff = { priAliasVal, SHA256_LEN };
31917fd14ceSopenharmony_ci    int32_t ret = GetAccountAuthTokenManager()->generateKeyAlias(userId, authId, &aliasBuff, false);
32017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
32117fd14ceSopenharmony_ci        HcFree(priAliasVal);
32217fd14ceSopenharmony_ci        return ret;
32317fd14ceSopenharmony_ci    }
32417fd14ceSopenharmony_ci    Uint8Buff peerPkBuff = { 0 };
32517fd14ceSopenharmony_ci    ret = GetPeerPubKeyFromCert(peerCertInfo, &peerPkBuff);
32617fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
32717fd14ceSopenharmony_ci        HcFree(priAliasVal);
32817fd14ceSopenharmony_ci        return ret;
32917fd14ceSopenharmony_ci    }
33017fd14ceSopenharmony_ci
33117fd14ceSopenharmony_ci    uint32_t sharedKeyAliasLen = HcStrlen(SHARED_KEY_ALIAS) + 1;
33217fd14ceSopenharmony_ci    sharedSecret->val = (uint8_t *)HcMalloc(sharedKeyAliasLen, 0);
33317fd14ceSopenharmony_ci    if (sharedSecret->val == NULL) {
33417fd14ceSopenharmony_ci        LOGE("Failed to malloc for psk alias.");
33517fd14ceSopenharmony_ci        HcFree(priAliasVal);
33617fd14ceSopenharmony_ci        ClearFreeUint8Buff(&peerPkBuff);
33717fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
33817fd14ceSopenharmony_ci    }
33917fd14ceSopenharmony_ci    sharedSecret->length = sharedKeyAliasLen;
34017fd14ceSopenharmony_ci    (void)memcpy_s(sharedSecret->val, sharedKeyAliasLen, SHARED_KEY_ALIAS, sharedKeyAliasLen);
34117fd14ceSopenharmony_ci    KeyParams privKeyParams = { { aliasBuff.val, aliasBuff.length, true }, false, osAccountId };
34217fd14ceSopenharmony_ci    KeyBuff pubKeyBuff = { peerPkBuff.val, peerPkBuff.length, false };
34317fd14ceSopenharmony_ci    ret = GetLoaderInstance()->agreeSharedSecretWithStorage(
34417fd14ceSopenharmony_ci        &privKeyParams, &pubKeyBuff, P256, P256_SHARED_SECRET_KEY_SIZE, sharedSecret);
34517fd14ceSopenharmony_ci    HcFree(priAliasVal);
34617fd14ceSopenharmony_ci    ClearFreeUint8Buff(&peerPkBuff);
34717fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
34817fd14ceSopenharmony_ci        LOGE("Failed to agree shared secret!");
34917fd14ceSopenharmony_ci        FreeBuffData(sharedSecret);
35017fd14ceSopenharmony_ci    }
35117fd14ceSopenharmony_ci    return ret;
35217fd14ceSopenharmony_ci}
35317fd14ceSopenharmony_ci
35417fd14ceSopenharmony_ciint32_t GenerateCertInfo(const Uint8Buff *pkInfoStr, const Uint8Buff *pkInfoSignature, CertInfo *certInfo)
35517fd14ceSopenharmony_ci{
35617fd14ceSopenharmony_ci    uint32_t pkInfoLen = pkInfoStr->length;
35717fd14ceSopenharmony_ci    certInfo->pkInfoStr.val = (uint8_t *)HcMalloc(pkInfoLen, 0);
35817fd14ceSopenharmony_ci    if (certInfo->pkInfoStr.val == NULL) {
35917fd14ceSopenharmony_ci        LOGE("Failed to alloc pkInfo memory!");
36017fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
36117fd14ceSopenharmony_ci    }
36217fd14ceSopenharmony_ci    if (memcpy_s(certInfo->pkInfoStr.val, pkInfoLen, pkInfoStr->val, pkInfoLen) != EOK) {
36317fd14ceSopenharmony_ci        LOGE("Failed to copy pkInfo!");
36417fd14ceSopenharmony_ci        FreeBuffData(&certInfo->pkInfoStr);
36517fd14ceSopenharmony_ci        return HC_ERR_MEMORY_COPY;
36617fd14ceSopenharmony_ci    }
36717fd14ceSopenharmony_ci    certInfo->pkInfoStr.length = pkInfoLen;
36817fd14ceSopenharmony_ci
36917fd14ceSopenharmony_ci    uint32_t signatureLen = pkInfoSignature->length;
37017fd14ceSopenharmony_ci    certInfo->pkInfoSignature.val = (uint8_t *)HcMalloc(signatureLen, 0);
37117fd14ceSopenharmony_ci    if (certInfo->pkInfoSignature.val == NULL) {
37217fd14ceSopenharmony_ci        LOGE("Failed to alloc pkInfoSignature memory!");
37317fd14ceSopenharmony_ci        FreeBuffData(&certInfo->pkInfoStr);
37417fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
37517fd14ceSopenharmony_ci    }
37617fd14ceSopenharmony_ci    if (memcpy_s(certInfo->pkInfoSignature.val, signatureLen, pkInfoSignature->val, signatureLen) != EOK) {
37717fd14ceSopenharmony_ci        LOGE("Failed to copy pkInfoSignature!");
37817fd14ceSopenharmony_ci        FreeBuffData(&certInfo->pkInfoStr);
37917fd14ceSopenharmony_ci        FreeBuffData(&certInfo->pkInfoSignature);
38017fd14ceSopenharmony_ci        return HC_ERR_MEMORY_COPY;
38117fd14ceSopenharmony_ci    }
38217fd14ceSopenharmony_ci    certInfo->pkInfoSignature.length = signatureLen;
38317fd14ceSopenharmony_ci    return HC_SUCCESS;
38417fd14ceSopenharmony_ci}
38517fd14ceSopenharmony_ci
38617fd14ceSopenharmony_cistatic int32_t GetCertInfo(int32_t osAccountId, const char *userId, const char *authId, CertInfo *certInfo)
38717fd14ceSopenharmony_ci{
38817fd14ceSopenharmony_ci    AccountToken *token = CreateAccountToken();
38917fd14ceSopenharmony_ci    if (token == NULL) {
39017fd14ceSopenharmony_ci        LOGE("Failed to create account token.");
39117fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
39217fd14ceSopenharmony_ci    }
39317fd14ceSopenharmony_ci    int32_t ret = GetAccountAuthTokenManager()->getToken(osAccountId, token, userId, authId);
39417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
39517fd14ceSopenharmony_ci        LOGE("Failed to get account token!");
39617fd14ceSopenharmony_ci        DestroyAccountToken(token);
39717fd14ceSopenharmony_ci        return ret;
39817fd14ceSopenharmony_ci    }
39917fd14ceSopenharmony_ci    ret = GenerateCertInfo(&token->pkInfoStr, &token->pkInfoSignature, certInfo);
40017fd14ceSopenharmony_ci    DestroyAccountToken(token);
40117fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
40217fd14ceSopenharmony_ci        LOGE("Failed to generate cert info!");
40317fd14ceSopenharmony_ci        return ret;
40417fd14ceSopenharmony_ci    }
40517fd14ceSopenharmony_ci    certInfo->signAlg = P256;
40617fd14ceSopenharmony_ci    return HC_SUCCESS;
40717fd14ceSopenharmony_ci}
40817fd14ceSopenharmony_ci
40917fd14ceSopenharmony_cistatic int32_t GetAccountAsymIdentityInfo(
41017fd14ceSopenharmony_ci    int32_t osAccountId, const char *userId, const char *authId, IdentityInfo *info, bool isNeedGeneratePdid)
41117fd14ceSopenharmony_ci{
41217fd14ceSopenharmony_ci    int32_t ret = GetCertInfo(osAccountId, userId, authId, &info->proof.certInfo);
41317fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
41417fd14ceSopenharmony_ci        LOGE("Failed to generate certInfo!");
41517fd14ceSopenharmony_ci        return ret;
41617fd14ceSopenharmony_ci    }
41717fd14ceSopenharmony_ci
41817fd14ceSopenharmony_ci#ifdef ENABLE_ACCOUNT_AUTH_EC_SPEKE
41917fd14ceSopenharmony_ci    ProtocolEntity *ecSpekeEntity = (ProtocolEntity *)HcMalloc(sizeof(ProtocolEntity), 0);
42017fd14ceSopenharmony_ci    if (ecSpekeEntity == NULL) {
42117fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for ec speke entity!");
42217fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
42317fd14ceSopenharmony_ci    }
42417fd14ceSopenharmony_ci    ecSpekeEntity->protocolType = ALG_EC_SPEKE;
42517fd14ceSopenharmony_ci    ecSpekeEntity->expandProcessCmds = CMD_ADD_TRUST_DEVICE;
42617fd14ceSopenharmony_ci#ifdef ENABLE_PSEUDONYM
42717fd14ceSopenharmony_ci    if (isNeedGeneratePdid) {
42817fd14ceSopenharmony_ci        ecSpekeEntity->expandProcessCmds |= CMD_MK_AGREE;
42917fd14ceSopenharmony_ci    }
43017fd14ceSopenharmony_ci#else
43117fd14ceSopenharmony_ci    (void)isNeedGeneratePdid;
43217fd14ceSopenharmony_ci#endif
43317fd14ceSopenharmony_ci    info->protocolVec.pushBack(&info->protocolVec, (const ProtocolEntity **)&ecSpekeEntity);
43417fd14ceSopenharmony_ci#else
43517fd14ceSopenharmony_ci    (void)isNeedGeneratePdid;
43617fd14ceSopenharmony_ci#endif
43717fd14ceSopenharmony_ci
43817fd14ceSopenharmony_ci    info->proofType = CERTIFICATED;
43917fd14ceSopenharmony_ci    return HC_SUCCESS;
44017fd14ceSopenharmony_ci}
44117fd14ceSopenharmony_ci
44217fd14ceSopenharmony_cistatic int32_t GetLocalDeviceType(int32_t osAccountId, const CJson *in, const char *groupId, int32_t *localDevType)
44317fd14ceSopenharmony_ci{
44417fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
44517fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
44617fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for deviceEntry!");
44717fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
44817fd14ceSopenharmony_ci    }
44917fd14ceSopenharmony_ci    int32_t ret = GetPeerDeviceEntry(osAccountId, in, groupId, deviceEntry);
45017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
45117fd14ceSopenharmony_ci        LOGI("Peer device not found, set local device type to accessory!");
45217fd14ceSopenharmony_ci        *localDevType = DEVICE_TYPE_ACCESSORY;
45317fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
45417fd14ceSopenharmony_ci        return HC_SUCCESS;
45517fd14ceSopenharmony_ci    }
45617fd14ceSopenharmony_ci    if (deviceEntry->source == SELF_CREATED) {
45717fd14ceSopenharmony_ci        LOGI("Peer device is self created, set local device type to accessory!");
45817fd14ceSopenharmony_ci        *localDevType = DEVICE_TYPE_ACCESSORY;
45917fd14ceSopenharmony_ci    }
46017fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
46117fd14ceSopenharmony_ci    return HC_SUCCESS;
46217fd14ceSopenharmony_ci}
46317fd14ceSopenharmony_ci
46417fd14ceSopenharmony_cistatic int32_t GenerateAuthTokenForAccessory(int32_t osAccountId, const char *groupId, Uint8Buff *authToken)
46517fd14ceSopenharmony_ci{
46617fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
46717fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
46817fd14ceSopenharmony_ci        LOGE("Failed to create device entry!");
46917fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
47017fd14ceSopenharmony_ci    }
47117fd14ceSopenharmony_ci    int32_t ret = GetSelfDeviceEntry(osAccountId, groupId, deviceEntry);
47217fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
47317fd14ceSopenharmony_ci        LOGE("Failed to get self device entry!");
47417fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
47517fd14ceSopenharmony_ci        return ret;
47617fd14ceSopenharmony_ci    }
47717fd14ceSopenharmony_ci    const char *userIdSelf = StringGet(&deviceEntry->userId);
47817fd14ceSopenharmony_ci    const char *devIdSelf = StringGet(&deviceEntry->authId);
47917fd14ceSopenharmony_ci    uint8_t keyAliasVal[SHA256_LEN] = { 0 };
48017fd14ceSopenharmony_ci    Uint8Buff keyAlias = { keyAliasVal, SHA256_LEN };
48117fd14ceSopenharmony_ci    ret = GetSymTokenManager()->generateKeyAlias(userIdSelf, devIdSelf, &keyAlias);
48217fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
48317fd14ceSopenharmony_ci        LOGE("Failed to generate key alias for authCode!");
48417fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
48517fd14ceSopenharmony_ci        return ret;
48617fd14ceSopenharmony_ci    }
48717fd14ceSopenharmony_ci
48817fd14ceSopenharmony_ci    authToken->val = (uint8_t *)HcMalloc(AUTH_TOKEN_SIZE, 0);
48917fd14ceSopenharmony_ci    if (authToken->val == NULL) {
49017fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for auth token!");
49117fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
49217fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
49317fd14ceSopenharmony_ci    }
49417fd14ceSopenharmony_ci    authToken->length = AUTH_TOKEN_SIZE;
49517fd14ceSopenharmony_ci    Uint8Buff userIdBuff = { (uint8_t *)userIdSelf, HcStrlen(userIdSelf) };
49617fd14ceSopenharmony_ci    Uint8Buff challenge = { (uint8_t *)KEY_INFO_PERSISTENT_TOKEN, HcStrlen(KEY_INFO_PERSISTENT_TOKEN) };
49717fd14ceSopenharmony_ci    KeyParams keyAliasParams = { { keyAlias.val, keyAlias.length, true }, false, osAccountId };
49817fd14ceSopenharmony_ci    ret = GetLoaderInstance()->computeHkdf(&keyAliasParams, &userIdBuff, &challenge, authToken);
49917fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
50017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
50117fd14ceSopenharmony_ci        LOGE("Failed to computeHkdf from authCode to authToken!");
50217fd14ceSopenharmony_ci        FreeBuffData(authToken);
50317fd14ceSopenharmony_ci    }
50417fd14ceSopenharmony_ci    return ret;
50517fd14ceSopenharmony_ci}
50617fd14ceSopenharmony_ci
50717fd14ceSopenharmony_cistatic int32_t GenerateTokenAliasForController(
50817fd14ceSopenharmony_ci    int32_t osAccountId, const CJson *in, const char *groupId, Uint8Buff *authTokenAlias)
50917fd14ceSopenharmony_ci{
51017fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
51117fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
51217fd14ceSopenharmony_ci        LOGE("Failed to create device entry!");
51317fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
51417fd14ceSopenharmony_ci    }
51517fd14ceSopenharmony_ci    int32_t ret = GetPeerDeviceEntry(osAccountId, in, groupId, deviceEntry);
51617fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
51717fd14ceSopenharmony_ci        LOGE("Failed to get peer device entry!");
51817fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
51917fd14ceSopenharmony_ci        return ret;
52017fd14ceSopenharmony_ci    }
52117fd14ceSopenharmony_ci    authTokenAlias->val = (uint8_t *)HcMalloc(SHA256_LEN, 0);
52217fd14ceSopenharmony_ci    if (authTokenAlias->val == NULL) {
52317fd14ceSopenharmony_ci        LOGE("Failed to alloc memory for auth token alias!");
52417fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
52517fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
52617fd14ceSopenharmony_ci    }
52717fd14ceSopenharmony_ci    authTokenAlias->length = SHA256_LEN;
52817fd14ceSopenharmony_ci    const char *userIdPeer = StringGet(&deviceEntry->userId);
52917fd14ceSopenharmony_ci    const char *devIdPeer = StringGet(&deviceEntry->authId);
53017fd14ceSopenharmony_ci    ret = GetSymTokenManager()->generateKeyAlias(userIdPeer, devIdPeer, authTokenAlias);
53117fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
53217fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
53317fd14ceSopenharmony_ci        LOGE("Failed to generate key alias for authToken!");
53417fd14ceSopenharmony_ci        FreeBuffData(authTokenAlias);
53517fd14ceSopenharmony_ci    }
53617fd14ceSopenharmony_ci    return ret;
53717fd14ceSopenharmony_ci}
53817fd14ceSopenharmony_ci
53917fd14ceSopenharmony_cistatic int32_t GenerateAuthTokenByDevType(
54017fd14ceSopenharmony_ci    const CJson *in, const CJson *urlJson, Uint8Buff *authToken, bool *isTokenStored)
54117fd14ceSopenharmony_ci{
54217fd14ceSopenharmony_ci    int32_t osAccountId = INVALID_OS_ACCOUNT;
54317fd14ceSopenharmony_ci    if (GetIntFromJson(in, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
54417fd14ceSopenharmony_ci        LOGE("Failed to get osAccountId!");
54517fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
54617fd14ceSopenharmony_ci    }
54717fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(urlJson, FIELD_GROUP_ID);
54817fd14ceSopenharmony_ci    if (groupId == NULL) {
54917fd14ceSopenharmony_ci        LOGE("Failed to get groupId!");
55017fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
55117fd14ceSopenharmony_ci    }
55217fd14ceSopenharmony_ci    int32_t localDevType = DEVICE_TYPE_CONTROLLER;
55317fd14ceSopenharmony_ci    int32_t ret = GetLocalDeviceType(osAccountId, in, groupId, &localDevType);
55417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
55517fd14ceSopenharmony_ci        LOGE("Failed to get local device type!");
55617fd14ceSopenharmony_ci        return ret;
55717fd14ceSopenharmony_ci    }
55817fd14ceSopenharmony_ci    if (localDevType == DEVICE_TYPE_ACCESSORY) {
55917fd14ceSopenharmony_ci        *isTokenStored = false;
56017fd14ceSopenharmony_ci        ret = GenerateAuthTokenForAccessory(osAccountId, groupId, authToken);
56117fd14ceSopenharmony_ci    } else {
56217fd14ceSopenharmony_ci        ret = GenerateTokenAliasForController(osAccountId, in, groupId, authToken);
56317fd14ceSopenharmony_ci    }
56417fd14ceSopenharmony_ci    return ret;
56517fd14ceSopenharmony_ci}
56617fd14ceSopenharmony_ci
56717fd14ceSopenharmony_cistatic int32_t GetSelfAccountIdentityInfo(
56817fd14ceSopenharmony_ci    int32_t osAccountId, const char *groupId, IdentityInfo *info, bool isNeedGeneratePdid)
56917fd14ceSopenharmony_ci{
57017fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
57117fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
57217fd14ceSopenharmony_ci        LOGE("Failed to create device entry!");
57317fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
57417fd14ceSopenharmony_ci    }
57517fd14ceSopenharmony_ci    int32_t ret = GetSelfDeviceEntry(osAccountId, groupId, deviceEntry);
57617fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
57717fd14ceSopenharmony_ci        LOGE("Failed to get self device entry!");
57817fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
57917fd14ceSopenharmony_ci        return ret;
58017fd14ceSopenharmony_ci    }
58117fd14ceSopenharmony_ci    if (deviceEntry->credential == SYMMETRIC_CRED) {
58217fd14ceSopenharmony_ci        ret = GetIdentityInfoByType(KEY_TYPE_SYM, TRUST_TYPE_UID, groupId, info);
58317fd14ceSopenharmony_ci    } else {
58417fd14ceSopenharmony_ci        const char *userId = StringGet(&deviceEntry->userId);
58517fd14ceSopenharmony_ci        const char *authId = StringGet(&deviceEntry->authId);
58617fd14ceSopenharmony_ci        ret = GetAccountAsymIdentityInfo(osAccountId, userId, authId, info, isNeedGeneratePdid);
58717fd14ceSopenharmony_ci    }
58817fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
58917fd14ceSopenharmony_ci    return ret;
59017fd14ceSopenharmony_ci}
59117fd14ceSopenharmony_ci
59217fd14ceSopenharmony_cistatic bool isNeedGeneratePdidByPeerCert(int32_t osAccountId, const CertInfo *certInfo)
59317fd14ceSopenharmony_ci{
59417fd14ceSopenharmony_ci#ifdef ENABLE_PSEUDONYM
59517fd14ceSopenharmony_ci    CJson *pkInfoJson = CreateJsonFromString((const char *)certInfo->pkInfoStr.val);
59617fd14ceSopenharmony_ci    if (pkInfoJson == NULL) {
59717fd14ceSopenharmony_ci        LOGE("Failed to create pkInfo json!");
59817fd14ceSopenharmony_ci        return false;
59917fd14ceSopenharmony_ci    }
60017fd14ceSopenharmony_ci    const char *userId = GetStringFromJson(pkInfoJson, FIELD_USER_ID);
60117fd14ceSopenharmony_ci    if (userId == NULL) {
60217fd14ceSopenharmony_ci        LOGE("Failed to get userId!");
60317fd14ceSopenharmony_ci        FreeJson(pkInfoJson);
60417fd14ceSopenharmony_ci        return false;
60517fd14ceSopenharmony_ci    }
60617fd14ceSopenharmony_ci    bool isNeedGenerate = GetPseudonymInstance()->isNeedRefreshPseudonymId(osAccountId, userId);
60717fd14ceSopenharmony_ci    FreeJson(pkInfoJson);
60817fd14ceSopenharmony_ci    return isNeedGenerate;
60917fd14ceSopenharmony_ci#else
61017fd14ceSopenharmony_ci    (void)osAccountId;
61117fd14ceSopenharmony_ci    (void)certInfo;
61217fd14ceSopenharmony_ci    return false;
61317fd14ceSopenharmony_ci#endif
61417fd14ceSopenharmony_ci}
61517fd14ceSopenharmony_ci
61617fd14ceSopenharmony_ciint32_t GetAccountRelatedCredInfo(
61717fd14ceSopenharmony_ci    int32_t osAccountId, const char *groupId, const char *deviceId, bool isUdid, IdentityInfo *info)
61817fd14ceSopenharmony_ci{
61917fd14ceSopenharmony_ci    if (groupId == NULL || deviceId == NULL || info == NULL) {
62017fd14ceSopenharmony_ci        LOGE("Invalid input params!");
62117fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
62217fd14ceSopenharmony_ci    }
62317fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
62417fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
62517fd14ceSopenharmony_ci        LOGE("Failed to create device entry!");
62617fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
62717fd14ceSopenharmony_ci    }
62817fd14ceSopenharmony_ci    int32_t ret = GaGetTrustedDeviceEntryById(osAccountId, deviceId, isUdid, groupId, deviceEntry);
62917fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
63017fd14ceSopenharmony_ci        LOGI("peer device not exist, get self identity info.");
63117fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
63217fd14ceSopenharmony_ci        return GetSelfAccountIdentityInfo(osAccountId, groupId, info, true);
63317fd14ceSopenharmony_ci    }
63417fd14ceSopenharmony_ci    bool isNeedGeneratePdid = false;
63517fd14ceSopenharmony_ci#ifdef ENABLE_PSEUDONYM
63617fd14ceSopenharmony_ci    const char *peerUserId = StringGet(&deviceEntry->userId);
63717fd14ceSopenharmony_ci    isNeedGeneratePdid = GetPseudonymInstance()->isNeedRefreshPseudonymId(osAccountId, peerUserId);
63817fd14ceSopenharmony_ci#endif
63917fd14ceSopenharmony_ci    if (deviceEntry->source == SELF_CREATED) {
64017fd14ceSopenharmony_ci        LOGI("peer device is from self created, get self identity info.");
64117fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
64217fd14ceSopenharmony_ci        return GetSelfAccountIdentityInfo(osAccountId, groupId, info, isNeedGeneratePdid);
64317fd14ceSopenharmony_ci    }
64417fd14ceSopenharmony_ci    int credType = deviceEntry->credential;
64517fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
64617fd14ceSopenharmony_ci    if (credType == SYMMETRIC_CRED) {
64717fd14ceSopenharmony_ci        LOGI("credential type is symmetric, get sym identity info.");
64817fd14ceSopenharmony_ci        return GetIdentityInfoByType(KEY_TYPE_SYM, TRUST_TYPE_UID, groupId, info);
64917fd14ceSopenharmony_ci    } else {
65017fd14ceSopenharmony_ci        LOGI("credential type is asymmetric, get self identity info.");
65117fd14ceSopenharmony_ci        return GetSelfAccountIdentityInfo(osAccountId, groupId, info, isNeedGeneratePdid);
65217fd14ceSopenharmony_ci    }
65317fd14ceSopenharmony_ci}
65417fd14ceSopenharmony_ci
65517fd14ceSopenharmony_cistatic int32_t GetSharedSecretByPeerCertFromPlugin(
65617fd14ceSopenharmony_ci    int32_t osAccountId, const char *peerUserId, const CertInfo *peerCertInfo, Uint8Buff *sharedSecret)
65717fd14ceSopenharmony_ci{
65817fd14ceSopenharmony_ci    CJson *input = CreateJson();
65917fd14ceSopenharmony_ci    if (input == NULL) {
66017fd14ceSopenharmony_ci        LOGE("Create input params json failed!");
66117fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
66217fd14ceSopenharmony_ci    }
66317fd14ceSopenharmony_ci    CJson *output = CreateJson();
66417fd14ceSopenharmony_ci    if (output == NULL) {
66517fd14ceSopenharmony_ci        LOGE("Create output results json failed!");
66617fd14ceSopenharmony_ci        FreeJson(input);
66717fd14ceSopenharmony_ci        return HC_ERR_JSON_CREATE;
66817fd14ceSopenharmony_ci    }
66917fd14ceSopenharmony_ci    int32_t res = HC_ERR_JSON_ADD;
67017fd14ceSopenharmony_ci    if ((peerUserId != NULL) && (AddStringToJson(input, FIELD_PEER_USER_ID, peerUserId) != HC_SUCCESS)) {
67117fd14ceSopenharmony_ci        LOGE("peer user id eixsts, but add peer user id to json failed!");
67217fd14ceSopenharmony_ci        goto ERR;
67317fd14ceSopenharmony_ci    }
67417fd14ceSopenharmony_ci    GOTO_ERR_AND_SET_RET(AddCertInfoToJson(peerCertInfo, input), res);
67517fd14ceSopenharmony_ci    GOTO_ERR_AND_SET_RET(ExcuteCredMgrCmd(osAccountId, GET_SHARED_SECRET_BY_PEER_CERT, input, output), res);
67617fd14ceSopenharmony_ci    res = HC_ERR_JSON_GET;
67717fd14ceSopenharmony_ci    const char *sharedKeyAlias = GetStringFromJson(output, FIELD_SHARED_SECRET);
67817fd14ceSopenharmony_ci    if (sharedKeyAlias == NULL) {
67917fd14ceSopenharmony_ci        LOGE("Get alias failed!");
68017fd14ceSopenharmony_ci        goto ERR;
68117fd14ceSopenharmony_ci    }
68217fd14ceSopenharmony_ci    uint32_t sharedKeyAliasLen = HcStrlen(sharedKeyAlias) + 1;
68317fd14ceSopenharmony_ci    uint8_t *aliasVal = (uint8_t *)HcMalloc(sharedKeyAliasLen, 0);
68417fd14ceSopenharmony_ci    GOTO_IF_CHECK_NULL(aliasVal, FIELD_SHARED_SECRET);
68517fd14ceSopenharmony_ci    if (memcpy_s(aliasVal, sharedKeyAliasLen, sharedKeyAlias, sharedKeyAliasLen) != EOK) {
68617fd14ceSopenharmony_ci        LOGE("parse output result set memcpy alias failed!");
68717fd14ceSopenharmony_ci        HcFree(aliasVal);
68817fd14ceSopenharmony_ci        aliasVal = NULL;
68917fd14ceSopenharmony_ci        goto ERR;
69017fd14ceSopenharmony_ci    }
69117fd14ceSopenharmony_ci    sharedSecret->val = aliasVal;
69217fd14ceSopenharmony_ci    sharedSecret->length = sharedKeyAliasLen;
69317fd14ceSopenharmony_ci    res = HC_SUCCESS;
69417fd14ceSopenharmony_ciERR:
69517fd14ceSopenharmony_ci    FreeJson(input);
69617fd14ceSopenharmony_ci    FreeJson(output);
69717fd14ceSopenharmony_ci    return res;
69817fd14ceSopenharmony_ci}
69917fd14ceSopenharmony_ci
70017fd14ceSopenharmony_ciint32_t GetAccountAsymSharedSecret(int32_t osAccountId, const char *peerUserId, const CertInfo *peerCertInfo,
70117fd14ceSopenharmony_ci    Uint8Buff *sharedSecret)
70217fd14ceSopenharmony_ci{
70317fd14ceSopenharmony_ci    if (peerCertInfo == NULL || sharedSecret == NULL) {
70417fd14ceSopenharmony_ci        LOGE("Invalid input params!");
70517fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
70617fd14ceSopenharmony_ci    }
70717fd14ceSopenharmony_ci    if (HasAccountAuthPlugin() == HC_SUCCESS) {
70817fd14ceSopenharmony_ci        return GetSharedSecretByPeerCertFromPlugin(osAccountId, peerUserId, peerCertInfo, sharedSecret);
70917fd14ceSopenharmony_ci    }
71017fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
71117fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
71217fd14ceSopenharmony_ci        LOGE("Failed to create self device entry!");
71317fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
71417fd14ceSopenharmony_ci    }
71517fd14ceSopenharmony_ci    int32_t ret = GetSelfDeviceEntryByPeerCert(osAccountId, peerCertInfo, deviceEntry);
71617fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
71717fd14ceSopenharmony_ci        LOGE("Failed to get self device entry!");
71817fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
71917fd14ceSopenharmony_ci        return ret;
72017fd14ceSopenharmony_ci    }
72117fd14ceSopenharmony_ci    const char *selfUserId = StringGet(&deviceEntry->userId);
72217fd14ceSopenharmony_ci    const char *selfAuthId = StringGet(&deviceEntry->authId);
72317fd14ceSopenharmony_ci    ret = VerifyPeerCertInfo(osAccountId, selfUserId, selfAuthId, peerCertInfo);
72417fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
72517fd14ceSopenharmony_ci        LOGE("Failed to verify peer cert! [Res]: %d", ret);
72617fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
72717fd14ceSopenharmony_ci        return ret;
72817fd14ceSopenharmony_ci    }
72917fd14ceSopenharmony_ci    ret = GetSharedSecretForAccountInPake(osAccountId, selfUserId, selfAuthId, peerCertInfo, sharedSecret);
73017fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
73117fd14ceSopenharmony_ci    return ret;
73217fd14ceSopenharmony_ci}
73317fd14ceSopenharmony_ci
73417fd14ceSopenharmony_ciint32_t GetAccountSymSharedSecret(const CJson *in, const CJson *urlJson, Uint8Buff *sharedSecret)
73517fd14ceSopenharmony_ci{
73617fd14ceSopenharmony_ci    if (in == NULL || urlJson == NULL || sharedSecret == NULL) {
73717fd14ceSopenharmony_ci        LOGE("Invalid input params!");
73817fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
73917fd14ceSopenharmony_ci    }
74017fd14ceSopenharmony_ci    int32_t osAccountId;
74117fd14ceSopenharmony_ci    if (GetIntFromJson(in, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
74217fd14ceSopenharmony_ci        LOGE("Failed to get osAccountId!");
74317fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
74417fd14ceSopenharmony_ci    }
74517fd14ceSopenharmony_ci    bool isTokenStored = true;
74617fd14ceSopenharmony_ci    Uint8Buff authToken = { NULL, 0 };
74717fd14ceSopenharmony_ci    int32_t ret = GenerateAuthTokenByDevType(in, urlJson, &authToken, &isTokenStored);
74817fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
74917fd14ceSopenharmony_ci        LOGE("Failed to generate auth token!");
75017fd14ceSopenharmony_ci        return ret;
75117fd14ceSopenharmony_ci    }
75217fd14ceSopenharmony_ci    uint8_t seed[SEED_SIZE] = { 0 };
75317fd14ceSopenharmony_ci    Uint8Buff seedBuff = { seed, SEED_SIZE };
75417fd14ceSopenharmony_ci    ret = GetByteFromJson(in, FIELD_SEED, seed, SEED_SIZE);
75517fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
75617fd14ceSopenharmony_ci        LOGE("Failed to get seed!");
75717fd14ceSopenharmony_ci        FreeBuffData(&authToken);
75817fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
75917fd14ceSopenharmony_ci    }
76017fd14ceSopenharmony_ci    sharedSecret->val = (uint8_t *)HcMalloc(ISO_PSK_LEN, 0);
76117fd14ceSopenharmony_ci    if (sharedSecret->val == NULL) {
76217fd14ceSopenharmony_ci        LOGE("Failed to alloc sharedSecret memory!");
76317fd14ceSopenharmony_ci        FreeBuffData(&authToken);
76417fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
76517fd14ceSopenharmony_ci    }
76617fd14ceSopenharmony_ci    sharedSecret->length = ISO_PSK_LEN;
76717fd14ceSopenharmony_ci    KeyParams keyParams = { { authToken.val, authToken.length, isTokenStored }, false, osAccountId };
76817fd14ceSopenharmony_ci    ret = GetLoaderInstance()->computeHmac(&keyParams, &seedBuff, sharedSecret);
76917fd14ceSopenharmony_ci    FreeBuffData(&authToken);
77017fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
77117fd14ceSopenharmony_ci        LOGE("ComputeHmac for psk failed, ret: %d.", ret);
77217fd14ceSopenharmony_ci        FreeBuffData(sharedSecret);
77317fd14ceSopenharmony_ci    }
77417fd14ceSopenharmony_ci    return ret;
77517fd14ceSopenharmony_ci}
77617fd14ceSopenharmony_ci
77717fd14ceSopenharmony_ciint32_t GetAccountAsymCredInfo(int32_t osAccountId, const CertInfo *certInfo, IdentityInfo **returnInfo)
77817fd14ceSopenharmony_ci{
77917fd14ceSopenharmony_ci    if (certInfo == NULL || returnInfo == NULL) {
78017fd14ceSopenharmony_ci        LOGE("Invalid input params!");
78117fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
78217fd14ceSopenharmony_ci    }
78317fd14ceSopenharmony_ci    TrustedDeviceEntry *deviceEntry = CreateDeviceEntry();
78417fd14ceSopenharmony_ci    if (deviceEntry == NULL) {
78517fd14ceSopenharmony_ci        LOGE("Failed to create self device entry!");
78617fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
78717fd14ceSopenharmony_ci    }
78817fd14ceSopenharmony_ci    int32_t ret = GetSelfDeviceEntryByPeerCert(osAccountId, certInfo, deviceEntry);
78917fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
79017fd14ceSopenharmony_ci        LOGE("Failed to get self device entry!");
79117fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
79217fd14ceSopenharmony_ci        return ret;
79317fd14ceSopenharmony_ci    }
79417fd14ceSopenharmony_ci    IdentityInfo *info = CreateIdentityInfo();
79517fd14ceSopenharmony_ci    if (info == NULL) {
79617fd14ceSopenharmony_ci        LOGE("Failed to create identity info!");
79717fd14ceSopenharmony_ci        DestroyDeviceEntry(deviceEntry);
79817fd14ceSopenharmony_ci        return HC_ERR_ALLOC_MEMORY;
79917fd14ceSopenharmony_ci    }
80017fd14ceSopenharmony_ci    const char *selfUserId = StringGet(&deviceEntry->userId);
80117fd14ceSopenharmony_ci    const char *selfAuthId = StringGet(&deviceEntry->authId);
80217fd14ceSopenharmony_ci    bool isNeedGeneratePdid = isNeedGeneratePdidByPeerCert(osAccountId, certInfo);
80317fd14ceSopenharmony_ci    ret = GetAccountAsymIdentityInfo(osAccountId, selfUserId, selfAuthId, info, isNeedGeneratePdid);
80417fd14ceSopenharmony_ci    DestroyDeviceEntry(deviceEntry);
80517fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
80617fd14ceSopenharmony_ci        LOGE("Failed to get account asym identity info!");
80717fd14ceSopenharmony_ci        DestroyIdentityInfo(info);
80817fd14ceSopenharmony_ci        return ret;
80917fd14ceSopenharmony_ci    }
81017fd14ceSopenharmony_ci    *returnInfo = info;
81117fd14ceSopenharmony_ci    return HC_SUCCESS;
81217fd14ceSopenharmony_ci}
81317fd14ceSopenharmony_ci
81417fd14ceSopenharmony_ciint32_t GetAccountSymCredInfoByPeerUrl(const CJson *in, const CJson *urlJson, IdentityInfo *info)
81517fd14ceSopenharmony_ci{
81617fd14ceSopenharmony_ci    if (in == NULL || urlJson == NULL || info == NULL) {
81717fd14ceSopenharmony_ci        LOGE("Invalid input params!");
81817fd14ceSopenharmony_ci        return HC_ERR_INVALID_PARAMS;
81917fd14ceSopenharmony_ci    }
82017fd14ceSopenharmony_ci    int32_t osAccountId = INVALID_OS_ACCOUNT;
82117fd14ceSopenharmony_ci    if (GetIntFromJson(in, FIELD_OS_ACCOUNT_ID, &osAccountId) != HC_SUCCESS) {
82217fd14ceSopenharmony_ci        LOGE("Failed to get osAccountId!");
82317fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
82417fd14ceSopenharmony_ci    }
82517fd14ceSopenharmony_ci    const char *groupId = GetStringFromJson(urlJson, FIELD_GROUP_ID);
82617fd14ceSopenharmony_ci    if (groupId == NULL) {
82717fd14ceSopenharmony_ci        LOGE("Failed to get group id!");
82817fd14ceSopenharmony_ci        return HC_ERR_JSON_GET;
82917fd14ceSopenharmony_ci    }
83017fd14ceSopenharmony_ci    int32_t ret = CheckGroupExist(osAccountId, groupId);
83117fd14ceSopenharmony_ci    if (ret != HC_SUCCESS) {
83217fd14ceSopenharmony_ci        LOGE("group not exist!");
83317fd14ceSopenharmony_ci        return ret;
83417fd14ceSopenharmony_ci    }
83517fd14ceSopenharmony_ci    return GetIdentityInfoByType(KEY_TYPE_SYM, TRUST_TYPE_UID, groupId, info);
83617fd14ceSopenharmony_ci}