11b8d9b87Sopenharmony_ci/* 21b8d9b87Sopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 31b8d9b87Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41b8d9b87Sopenharmony_ci * you may not use this file except in compliance with the License. 51b8d9b87Sopenharmony_ci * You may obtain a copy of the License at 61b8d9b87Sopenharmony_ci * 71b8d9b87Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81b8d9b87Sopenharmony_ci * 91b8d9b87Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101b8d9b87Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111b8d9b87Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121b8d9b87Sopenharmony_ci * See the License for the specific language governing permissions and 131b8d9b87Sopenharmony_ci * limitations under the License. 141b8d9b87Sopenharmony_ci */ 151b8d9b87Sopenharmony_ci 161b8d9b87Sopenharmony_ci#include "key_utils.h" 171b8d9b87Sopenharmony_ci#include <securec.h> 181b8d9b87Sopenharmony_ci#include "config.h" 191b8d9b87Sopenharmony_ci#include "params_parser.h" 201b8d9b87Sopenharmony_ci#include "log.h" 211b8d9b87Sopenharmony_ci#include "memory.h" 221b8d9b87Sopenharmony_ci#include "utils.h" 231b8d9b87Sopenharmony_ci 241b8d9b87Sopenharmony_ciHcfResult CopyAsyKeyParamsSpec(const HcfAsyKeyParamsSpec *srcSpec, HcfAsyKeyParamsSpec *destSpec) 251b8d9b87Sopenharmony_ci{ 261b8d9b87Sopenharmony_ci if (srcSpec == NULL || srcSpec->algName == NULL || destSpec == NULL) { 271b8d9b87Sopenharmony_ci LOGE("Invalid input parameter."); 281b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 291b8d9b87Sopenharmony_ci } 301b8d9b87Sopenharmony_ci size_t srcAlgNameLen = HcfStrlen(srcSpec->algName); 311b8d9b87Sopenharmony_ci if (!srcAlgNameLen) { 321b8d9b87Sopenharmony_ci LOGE("algName is empty!"); 331b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 341b8d9b87Sopenharmony_ci } 351b8d9b87Sopenharmony_ci destSpec->algName = (char *)HcfMalloc(srcAlgNameLen + 1, 0); 361b8d9b87Sopenharmony_ci if (destSpec->algName == NULL) { 371b8d9b87Sopenharmony_ci LOGE("Failed to allocate alg name memory"); 381b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 391b8d9b87Sopenharmony_ci } 401b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->algName, srcAlgNameLen, srcSpec->algName, srcAlgNameLen); 411b8d9b87Sopenharmony_ci destSpec->specType = srcSpec->specType; 421b8d9b87Sopenharmony_ci return HCF_SUCCESS; 431b8d9b87Sopenharmony_ci} 441b8d9b87Sopenharmony_ci 451b8d9b87Sopenharmony_ciHcfResult CopyPoint(const HcfPoint *src, HcfPoint *dest) 461b8d9b87Sopenharmony_ci{ 471b8d9b87Sopenharmony_ci if (src == NULL || src->x.data == NULL || src->x.len == 0 || 481b8d9b87Sopenharmony_ci src->y.data == NULL || src->y.len == 0 || dest == NULL) { 491b8d9b87Sopenharmony_ci LOGE("Invalid input parameter."); 501b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 511b8d9b87Sopenharmony_ci } 521b8d9b87Sopenharmony_ci dest->x.data = (unsigned char *)HcfMalloc(src->x.len, 0); 531b8d9b87Sopenharmony_ci if (dest->x.data == NULL) { 541b8d9b87Sopenharmony_ci LOGE("Failed to allocate x data memory"); 551b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 561b8d9b87Sopenharmony_ci } 571b8d9b87Sopenharmony_ci dest->y.data = (unsigned char *)HcfMalloc(src->y.len, 0); 581b8d9b87Sopenharmony_ci if (dest->y.data == NULL) { 591b8d9b87Sopenharmony_ci LOGE("Failed to allocate y data memory"); 601b8d9b87Sopenharmony_ci HcfFree(dest->x.data); 611b8d9b87Sopenharmony_ci dest->x.data = NULL; 621b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 631b8d9b87Sopenharmony_ci } 641b8d9b87Sopenharmony_ci (void)memcpy_s(dest->x.data, src->x.len, src->x.data, src->x.len); 651b8d9b87Sopenharmony_ci (void)memcpy_s(dest->y.data, src->y.len, src->y.data, src->y.len); 661b8d9b87Sopenharmony_ci dest->x.len = src->x.len; 671b8d9b87Sopenharmony_ci dest->y.len = src->y.len; 681b8d9b87Sopenharmony_ci return HCF_SUCCESS; 691b8d9b87Sopenharmony_ci} 701b8d9b87Sopenharmony_ci 711b8d9b87Sopenharmony_cistatic HcfResult CopyEcField(const HcfECField *src, HcfECField **dest) 721b8d9b87Sopenharmony_ci{ 731b8d9b87Sopenharmony_ci if (src == NULL || src->fieldType == NULL || dest == NULL) { 741b8d9b87Sopenharmony_ci LOGE("Invalid input parameter."); 751b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 761b8d9b87Sopenharmony_ci } 771b8d9b87Sopenharmony_ci HcfECField *tmpField = (HcfECField *)HcfMalloc(sizeof(HcfECFieldFp), 0); 781b8d9b87Sopenharmony_ci if (tmpField == NULL) { 791b8d9b87Sopenharmony_ci LOGE("Alloc memory failed."); 801b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 811b8d9b87Sopenharmony_ci } 821b8d9b87Sopenharmony_ci size_t srcFieldTypeLen = HcfStrlen(src->fieldType); 831b8d9b87Sopenharmony_ci if (!srcFieldTypeLen) { 841b8d9b87Sopenharmony_ci LOGE("fieldType is empty!"); 851b8d9b87Sopenharmony_ci HcfFree(tmpField); 861b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 871b8d9b87Sopenharmony_ci } 881b8d9b87Sopenharmony_ci tmpField->fieldType = (char *)HcfMalloc(srcFieldTypeLen + 1, 0); 891b8d9b87Sopenharmony_ci if (tmpField->fieldType == NULL) { 901b8d9b87Sopenharmony_ci LOGE("Failed to allocate field memory."); 911b8d9b87Sopenharmony_ci HcfFree(tmpField); 921b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 931b8d9b87Sopenharmony_ci } 941b8d9b87Sopenharmony_ci HcfECFieldFp *tmpDest = (HcfECFieldFp *)(tmpField); 951b8d9b87Sopenharmony_ci HcfECFieldFp *tmpSrc = (HcfECFieldFp *)(src); 961b8d9b87Sopenharmony_ci tmpDest->p.data = (unsigned char *)HcfMalloc(tmpSrc->p.len, 0); 971b8d9b87Sopenharmony_ci if (tmpDest->p.data == NULL) { 981b8d9b87Sopenharmony_ci LOGE("Failed to allocate b data memory"); 991b8d9b87Sopenharmony_ci HcfFree(tmpField->fieldType); 1001b8d9b87Sopenharmony_ci HcfFree(tmpField); 1011b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1021b8d9b87Sopenharmony_ci } 1031b8d9b87Sopenharmony_ci (void)memcpy_s(tmpField->fieldType, srcFieldTypeLen, src->fieldType, srcFieldTypeLen); 1041b8d9b87Sopenharmony_ci (void)memcpy_s(tmpDest->p.data, tmpSrc->p.len, tmpSrc->p.data, tmpSrc->p.len); 1051b8d9b87Sopenharmony_ci tmpDest->p.len = tmpSrc->p.len; 1061b8d9b87Sopenharmony_ci *dest = tmpField; 1071b8d9b87Sopenharmony_ci return HCF_SUCCESS; 1081b8d9b87Sopenharmony_ci} 1091b8d9b87Sopenharmony_ci 1101b8d9b87Sopenharmony_ciHcfResult CopyEccCommonSpec(const HcfEccCommParamsSpec *srcSpec, HcfEccCommParamsSpec *destSpec) 1111b8d9b87Sopenharmony_ci{ 1121b8d9b87Sopenharmony_ci if (srcSpec == NULL || srcSpec->a.data == NULL || srcSpec->a.len == 0 || srcSpec->b.data == NULL || 1131b8d9b87Sopenharmony_ci srcSpec->b.len == 0 || srcSpec->n.data == NULL || srcSpec->n.len == 0 || destSpec == NULL) { 1141b8d9b87Sopenharmony_ci LOGE("Invalid input parameter."); 1151b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 1161b8d9b87Sopenharmony_ci } 1171b8d9b87Sopenharmony_ci if (CopyAsyKeyParamsSpec(&(srcSpec->base), &(destSpec->base)) != HCF_SUCCESS) { 1181b8d9b87Sopenharmony_ci LOGE("Failed to copy src common spec"); 1191b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 1201b8d9b87Sopenharmony_ci } 1211b8d9b87Sopenharmony_ci destSpec->a.data = (unsigned char *)HcfMalloc(srcSpec->a.len, 0); 1221b8d9b87Sopenharmony_ci if (destSpec->a.data == NULL) { 1231b8d9b87Sopenharmony_ci LOGE("Failed to allocate a data memory"); 1241b8d9b87Sopenharmony_ci FreeEccCommParamsSpec(destSpec); 1251b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1261b8d9b87Sopenharmony_ci } 1271b8d9b87Sopenharmony_ci destSpec->b.data = (unsigned char *)HcfMalloc(srcSpec->b.len, 0); 1281b8d9b87Sopenharmony_ci if (destSpec->b.data == NULL) { 1291b8d9b87Sopenharmony_ci LOGE("Failed to allocate b data memory"); 1301b8d9b87Sopenharmony_ci FreeEccCommParamsSpec(destSpec); 1311b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1321b8d9b87Sopenharmony_ci } 1331b8d9b87Sopenharmony_ci destSpec->n.data = (unsigned char *)HcfMalloc(srcSpec->n.len, 0); 1341b8d9b87Sopenharmony_ci if (destSpec->n.data == NULL) { 1351b8d9b87Sopenharmony_ci LOGE("Failed to allocate n data memory"); 1361b8d9b87Sopenharmony_ci FreeEccCommParamsSpec(destSpec); 1371b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1381b8d9b87Sopenharmony_ci } 1391b8d9b87Sopenharmony_ci HcfResult res = CopyEcField(srcSpec->field, &(destSpec->field)); 1401b8d9b87Sopenharmony_ci if (res != HCF_SUCCESS) { 1411b8d9b87Sopenharmony_ci LOGE("Failed to allocate field data memory"); 1421b8d9b87Sopenharmony_ci FreeEccCommParamsSpec(destSpec); 1431b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1441b8d9b87Sopenharmony_ci } 1451b8d9b87Sopenharmony_ci res = CopyPoint(&(srcSpec->g), &(destSpec->g)); 1461b8d9b87Sopenharmony_ci if (res != HCF_SUCCESS) { 1471b8d9b87Sopenharmony_ci LOGE("Failed to allocate field data memory"); 1481b8d9b87Sopenharmony_ci FreeEccCommParamsSpec(destSpec); 1491b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1501b8d9b87Sopenharmony_ci } 1511b8d9b87Sopenharmony_ci destSpec->h = srcSpec->h; 1521b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->a.data, srcSpec->a.len, srcSpec->a.data, srcSpec->a.len); 1531b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->b.data, srcSpec->b.len, srcSpec->b.data, srcSpec->b.len); 1541b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->n.data, srcSpec->n.len, srcSpec->n.data, srcSpec->n.len); 1551b8d9b87Sopenharmony_ci destSpec->a.len = srcSpec->a.len; 1561b8d9b87Sopenharmony_ci destSpec->b.len = srcSpec->b.len; 1571b8d9b87Sopenharmony_ci destSpec->n.len = srcSpec->n.len; 1581b8d9b87Sopenharmony_ci return HCF_SUCCESS; 1591b8d9b87Sopenharmony_ci} 1601b8d9b87Sopenharmony_ci 1611b8d9b87Sopenharmony_ciHcfResult CreateEccCommonSpecImpl(const HcfEccCommParamsSpec *srcSpec, HcfEccCommParamsSpec **destSpec) 1621b8d9b87Sopenharmony_ci{ 1631b8d9b87Sopenharmony_ci if (srcSpec == NULL || destSpec == NULL) { 1641b8d9b87Sopenharmony_ci LOGE("Invalid input parameter."); 1651b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 1661b8d9b87Sopenharmony_ci } 1671b8d9b87Sopenharmony_ci HcfEccCommParamsSpec *tmpSpec = (HcfEccCommParamsSpec *)HcfMalloc(sizeof(HcfEccCommParamsSpec), 0); 1681b8d9b87Sopenharmony_ci if (tmpSpec == NULL) { 1691b8d9b87Sopenharmony_ci LOGE("Failed to allocate dest spec memory"); 1701b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1711b8d9b87Sopenharmony_ci } 1721b8d9b87Sopenharmony_ci if (CopyEccCommonSpec(srcSpec, tmpSpec) != HCF_SUCCESS) { 1731b8d9b87Sopenharmony_ci LOGE("CreateEccCommonSpecImpl error!"); 1741b8d9b87Sopenharmony_ci HcfFree(tmpSpec); 1751b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 1761b8d9b87Sopenharmony_ci } 1771b8d9b87Sopenharmony_ci *destSpec = tmpSpec; 1781b8d9b87Sopenharmony_ci return HCF_SUCCESS; 1791b8d9b87Sopenharmony_ci} 1801b8d9b87Sopenharmony_ci 1811b8d9b87Sopenharmony_ciHcfResult CopyDhCommonSpec(const HcfDhCommParamsSpec *srcSpec, HcfDhCommParamsSpec *destSpec) 1821b8d9b87Sopenharmony_ci{ 1831b8d9b87Sopenharmony_ci if (CopyAsyKeyParamsSpec(&(srcSpec->base), &(destSpec->base)) != HCF_SUCCESS) { 1841b8d9b87Sopenharmony_ci LOGE("Failed to copy src common spec"); 1851b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 1861b8d9b87Sopenharmony_ci } 1871b8d9b87Sopenharmony_ci destSpec->p.data = (unsigned char *)HcfMalloc(srcSpec->p.len, 0); 1881b8d9b87Sopenharmony_ci if (destSpec->p.data == NULL) { 1891b8d9b87Sopenharmony_ci LOGE("Failed to allocate p data memory"); 1901b8d9b87Sopenharmony_ci FreeDhCommParamsSpec(destSpec); 1911b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1921b8d9b87Sopenharmony_ci } 1931b8d9b87Sopenharmony_ci 1941b8d9b87Sopenharmony_ci destSpec->g.data = (unsigned char *)HcfMalloc(srcSpec->g.len, 0); 1951b8d9b87Sopenharmony_ci if (destSpec->g.data == NULL) { 1961b8d9b87Sopenharmony_ci LOGE("Failed to allocate g data memory"); 1971b8d9b87Sopenharmony_ci FreeDhCommParamsSpec(destSpec); 1981b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 1991b8d9b87Sopenharmony_ci } 2001b8d9b87Sopenharmony_ci destSpec->length = srcSpec->length; 2011b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->p.data, srcSpec->p.len, srcSpec->p.data, srcSpec->p.len); 2021b8d9b87Sopenharmony_ci (void)memcpy_s(destSpec->g.data, srcSpec->g.len, srcSpec->g.data, srcSpec->g.len); 2031b8d9b87Sopenharmony_ci destSpec->p.len = srcSpec->p.len; 2041b8d9b87Sopenharmony_ci destSpec->g.len = srcSpec->g.len; 2051b8d9b87Sopenharmony_ci return HCF_SUCCESS; 2061b8d9b87Sopenharmony_ci} 2071b8d9b87Sopenharmony_ci 2081b8d9b87Sopenharmony_ciHcfResult CreateDhCommonSpecImpl(const HcfDhCommParamsSpec *srcSpec, HcfDhCommParamsSpec **destSpec) 2091b8d9b87Sopenharmony_ci{ 2101b8d9b87Sopenharmony_ci HcfDhCommParamsSpec *spec = (HcfDhCommParamsSpec *)HcfMalloc(sizeof(HcfDhCommParamsSpec), 0); 2111b8d9b87Sopenharmony_ci if (spec == NULL) { 2121b8d9b87Sopenharmony_ci LOGE("Failed to allocate dest spec memory"); 2131b8d9b87Sopenharmony_ci return HCF_ERR_MALLOC; 2141b8d9b87Sopenharmony_ci } 2151b8d9b87Sopenharmony_ci 2161b8d9b87Sopenharmony_ci if (CopyDhCommonSpec(srcSpec, spec) != HCF_SUCCESS) { 2171b8d9b87Sopenharmony_ci LOGE("Failed to copy src spec"); 2181b8d9b87Sopenharmony_ci HcfFree(spec); 2191b8d9b87Sopenharmony_ci return HCF_INVALID_PARAMS; 2201b8d9b87Sopenharmony_ci } 2211b8d9b87Sopenharmony_ci 2221b8d9b87Sopenharmony_ci *destSpec = spec; 2231b8d9b87Sopenharmony_ci return HCF_SUCCESS; 2241b8d9b87Sopenharmony_ci} 225