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}