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