11b8d9b87Sopenharmony_ci/*
21b8d9b87Sopenharmony_ci* Copyright (C) 2022-2024 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#ifndef HCF_PARAMS_PARSER_H
171b8d9b87Sopenharmony_ci#define HCF_PARAMS_PARSER_H
181b8d9b87Sopenharmony_ci
191b8d9b87Sopenharmony_ci#include <stdint.h>
201b8d9b87Sopenharmony_ci#include "result.h"
211b8d9b87Sopenharmony_ci
221b8d9b87Sopenharmony_citypedef enum {
231b8d9b87Sopenharmony_ci    HCF_ALG_TYPE = 1,
241b8d9b87Sopenharmony_ci    HCF_ALG_KEY_TYPE,
251b8d9b87Sopenharmony_ci    HCF_ALG_MODE,
261b8d9b87Sopenharmony_ci    HCF_ALG_PADDING_TYPE,
271b8d9b87Sopenharmony_ci    HCF_ALG_PRIMES,
281b8d9b87Sopenharmony_ci    HCF_ALG_DIGEST,
291b8d9b87Sopenharmony_ci    HCF_ALG_MGF1_DIGEST,
301b8d9b87Sopenharmony_ci    HCF_ALG_TEXT_FORMAT,
311b8d9b87Sopenharmony_ci    HCF_ALG_SIGN_TYPE,
321b8d9b87Sopenharmony_ci    HCF_ALG_VERIFY_TYPE,
331b8d9b87Sopenharmony_ci} HcfAlgParaType;
341b8d9b87Sopenharmony_ci
351b8d9b87Sopenharmony_citypedef enum {
361b8d9b87Sopenharmony_ci    HCF_ALG_AES = 1,
371b8d9b87Sopenharmony_ci    HCF_ALG_DES,
381b8d9b87Sopenharmony_ci    HCF_ALG_RSA,
391b8d9b87Sopenharmony_ci    HCF_ALG_ECC,
401b8d9b87Sopenharmony_ci    HCF_ALG_DSA,
411b8d9b87Sopenharmony_ci    HCF_ALG_SM2,
421b8d9b87Sopenharmony_ci    HCF_ALG_SM4,
431b8d9b87Sopenharmony_ci    HCF_ALG_HMAC,
441b8d9b87Sopenharmony_ci    HCF_ALG_PKBDF2,
451b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BRAINPOOL,
461b8d9b87Sopenharmony_ci    HCF_ALG_ED25519,
471b8d9b87Sopenharmony_ci    HCF_ALG_X25519,
481b8d9b87Sopenharmony_ci    HCF_ALG_DH,
491b8d9b87Sopenharmony_ci    HCF_ALG_HKDF,
501b8d9b87Sopenharmony_ci} HcfAlgValue;
511b8d9b87Sopenharmony_ci
521b8d9b87Sopenharmony_citypedef enum {
531b8d9b87Sopenharmony_ci    HCF_ALG_ECC_224 = 1,
541b8d9b87Sopenharmony_ci    HCF_ALG_ECC_256,
551b8d9b87Sopenharmony_ci    HCF_ALG_ECC_384,
561b8d9b87Sopenharmony_ci    HCF_ALG_ECC_521,
571b8d9b87Sopenharmony_ci
581b8d9b87Sopenharmony_ci    HCF_ALG_AES_128,
591b8d9b87Sopenharmony_ci    HCF_ALG_AES_192,
601b8d9b87Sopenharmony_ci    HCF_ALG_AES_256,
611b8d9b87Sopenharmony_ci    HCF_ALG_SM4_128,
621b8d9b87Sopenharmony_ci    HCF_ALG_3DES_192,
631b8d9b87Sopenharmony_ci
641b8d9b87Sopenharmony_ci    HCF_ALG_MODE_NONE,
651b8d9b87Sopenharmony_ci    HCF_ALG_MODE_ECB,
661b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CBC,
671b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CTR,
681b8d9b87Sopenharmony_ci    HCF_ALG_MODE_OFB,
691b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CFB,
701b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CFB1,
711b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CFB8,
721b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CFB64,
731b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CFB128,
741b8d9b87Sopenharmony_ci    HCF_ALG_MODE_CCM,
751b8d9b87Sopenharmony_ci    HCF_ALG_MODE_GCM,
761b8d9b87Sopenharmony_ci
771b8d9b87Sopenharmony_ci    HCF_ALG_NOPADDING,
781b8d9b87Sopenharmony_ci    HCF_ALG_PADDING_PKCS5,
791b8d9b87Sopenharmony_ci    HCF_ALG_PADDING_PKCS7,
801b8d9b87Sopenharmony_ci
811b8d9b87Sopenharmony_ci    // rsa keysize
821b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_512,
831b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_768,
841b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_1024,
851b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_2048,
861b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_3072,
871b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_4096,
881b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_8192,
891b8d9b87Sopenharmony_ci
901b8d9b87Sopenharmony_ci    // rsa cipher padding,
911b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_PKCS1_PADDING,
921b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_PKCS1_OAEP_PADDING,
931b8d9b87Sopenharmony_ci    HCF_OPENSSL_RSA_PSS_PADDING,
941b8d9b87Sopenharmony_ci
951b8d9b87Sopenharmony_ci    // digest
961b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_NONE,
971b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_MD5,
981b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SM3,
991b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SHA1,
1001b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SHA224,
1011b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SHA256,
1021b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SHA384,
1031b8d9b87Sopenharmony_ci    HCF_OPENSSL_DIGEST_SHA512,
1041b8d9b87Sopenharmony_ci
1051b8d9b87Sopenharmony_ci    // primes
1061b8d9b87Sopenharmony_ci    HCF_OPENSSL_PRIMES_2,
1071b8d9b87Sopenharmony_ci    HCF_OPENSSL_PRIMES_3,
1081b8d9b87Sopenharmony_ci    HCF_OPENSSL_PRIMES_4,
1091b8d9b87Sopenharmony_ci    HCF_OPENSSL_PRIMES_5,
1101b8d9b87Sopenharmony_ci
1111b8d9b87Sopenharmony_ci    // dsa
1121b8d9b87Sopenharmony_ci    HCF_ALG_DSA_1024,
1131b8d9b87Sopenharmony_ci    HCF_ALG_DSA_2048,
1141b8d9b87Sopenharmony_ci    HCF_ALG_DSA_3072,
1151b8d9b87Sopenharmony_ci
1161b8d9b87Sopenharmony_ci    // sm2
1171b8d9b87Sopenharmony_ci    HCF_ALG_SM2_256,
1181b8d9b87Sopenharmony_ci
1191b8d9b87Sopenharmony_ci    // only for algName(NO SIZE)
1201b8d9b87Sopenharmony_ci    HCF_ALG_DSA_DEFAULT,
1211b8d9b87Sopenharmony_ci    HCF_ALG_RSA_DEFAULT,
1221b8d9b87Sopenharmony_ci    HCF_ALG_ECC_DEFAULT,
1231b8d9b87Sopenharmony_ci    HCF_ALG_SM2_DEFAULT,
1241b8d9b87Sopenharmony_ci    HCF_ALG_AES_DEFAULT,
1251b8d9b87Sopenharmony_ci    HCF_ALG_SM4_DEFAULT,
1261b8d9b87Sopenharmony_ci    HCF_ALG_3DES_DEFAULT,
1271b8d9b87Sopenharmony_ci    HCF_ALG_HMAC_DEFAULT,
1281b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BRAINPOOL_DEFAULT,
1291b8d9b87Sopenharmony_ci    HCF_ALG_X25519_DEFAULT,
1301b8d9b87Sopenharmony_ci    HCF_ALG_DH_DEFAULT,
1311b8d9b87Sopenharmony_ci
1321b8d9b87Sopenharmony_ci    // key derivation function, PBKDF2
1331b8d9b87Sopenharmony_ci    HCF_ALG_PBKDF2_DEFAULT,
1341b8d9b87Sopenharmony_ci
1351b8d9b87Sopenharmony_ci    // sm2 text format
1361b8d9b87Sopenharmony_ci    HCF_ALG_TEXT_FORMAT_C1C3C2,
1371b8d9b87Sopenharmony_ci    HCF_ALG_TEXT_FORMAT_C1C2C3,
1381b8d9b87Sopenharmony_ci
1391b8d9b87Sopenharmony_ci    // brainpool
1401b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP160R1,
1411b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP160T1,
1421b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP192R1,
1431b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP192T1,
1441b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP224R1,
1451b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP224T1,
1461b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP256R1,
1471b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP256T1,
1481b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP320R1,
1491b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP320T1,
1501b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP384R1,
1511b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP384T1,
1521b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP512R1,
1531b8d9b87Sopenharmony_ci    HCF_ALG_ECC_BP512T1,
1541b8d9b87Sopenharmony_ci
1551b8d9b87Sopenharmony_ci    // ed25519
1561b8d9b87Sopenharmony_ci    HCF_ALG_ED25519_256,
1571b8d9b87Sopenharmony_ci    HCF_ALG_X25519_256,
1581b8d9b87Sopenharmony_ci
1591b8d9b87Sopenharmony_ci    // DH keysize
1601b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_1536,
1611b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_2048,
1621b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_3072,
1631b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_4096,
1641b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_6144,
1651b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_MODP_8192,
1661b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_FFDHE_2048,
1671b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_FFDHE_3072,
1681b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_FFDHE_4096,
1691b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_FFDHE_6144,
1701b8d9b87Sopenharmony_ci    HCF_OPENSSL_DH_FFDHE_8192,
1711b8d9b87Sopenharmony_ci
1721b8d9b87Sopenharmony_ci    HCF_ALG_ONLY_SIGN,
1731b8d9b87Sopenharmony_ci    HCF_ALG_VERIFY_RECOVER,
1741b8d9b87Sopenharmony_ci    // key derivation function, HKDF
1751b8d9b87Sopenharmony_ci    HCF_ALG_HKDF_DEFAULT,
1761b8d9b87Sopenharmony_ci
1771b8d9b87Sopenharmony_ci    // hkdf mode
1781b8d9b87Sopenharmony_ci    HCF_ALG_MODE_EXTRACT_AND_EXPAND,
1791b8d9b87Sopenharmony_ci    HCF_ALG_MODE_EXTRACT_ONLY,
1801b8d9b87Sopenharmony_ci    HCF_ALG_MODE_EXPAND_ONLY,
1811b8d9b87Sopenharmony_ci} HcfAlgParaValue;
1821b8d9b87Sopenharmony_ci
1831b8d9b87Sopenharmony_citypedef enum {
1841b8d9b87Sopenharmony_ci    HCF_OPERATIOPN_ONLY_SIGN = 1,
1851b8d9b87Sopenharmony_ci    HCF_OPERATION_SIGN,
1861b8d9b87Sopenharmony_ci} HcfSignParams;
1871b8d9b87Sopenharmony_ci
1881b8d9b87Sopenharmony_citypedef enum {
1891b8d9b87Sopenharmony_ci    HCF_UNCOMPRESSED_FORMAT_VALUE = 1,
1901b8d9b87Sopenharmony_ci    HCF_COMPRESSED_FORMAT_VALUE,
1911b8d9b87Sopenharmony_ci} HcfFormatValue;
1921b8d9b87Sopenharmony_ci
1931b8d9b87Sopenharmony_citypedef struct {
1941b8d9b87Sopenharmony_ci    const char *formatName;
1951b8d9b87Sopenharmony_ci    HcfFormatValue formatValue;
1961b8d9b87Sopenharmony_ci} HcfFormatMap;
1971b8d9b87Sopenharmony_ci
1981b8d9b87Sopenharmony_citypedef struct {
1991b8d9b87Sopenharmony_ci    const char *tag;
2001b8d9b87Sopenharmony_ci    HcfAlgParaType paraType;
2011b8d9b87Sopenharmony_ci    HcfAlgParaValue paraValue;
2021b8d9b87Sopenharmony_ci} HcfParaConfig;
2031b8d9b87Sopenharmony_ci
2041b8d9b87Sopenharmony_citypedef struct {
2051b8d9b87Sopenharmony_ci    const char *algNameStr;
2061b8d9b87Sopenharmony_ci    HcfAlgValue algValue;
2071b8d9b87Sopenharmony_ci} HcfAlgMap;
2081b8d9b87Sopenharmony_ci
2091b8d9b87Sopenharmony_citypedef struct {
2101b8d9b87Sopenharmony_ci    const char *curveNameStr;
2111b8d9b87Sopenharmony_ci    HcfAlgParaValue algValue;
2121b8d9b87Sopenharmony_ci} HcfCurveMap;
2131b8d9b87Sopenharmony_ci
2141b8d9b87Sopenharmony_citypedef struct {
2151b8d9b87Sopenharmony_ci    HcfAlgValue algo;
2161b8d9b87Sopenharmony_ci    HcfAlgParaValue keySize;
2171b8d9b87Sopenharmony_ci    HcfAlgParaValue mode;
2181b8d9b87Sopenharmony_ci    HcfAlgParaValue paddingMode;
2191b8d9b87Sopenharmony_ci    HcfAlgParaValue md;
2201b8d9b87Sopenharmony_ci    HcfAlgParaValue mgf1md;
2211b8d9b87Sopenharmony_ci} CipherAttr;
2221b8d9b87Sopenharmony_ci
2231b8d9b87Sopenharmony_citypedef struct {
2241b8d9b87Sopenharmony_ci    HcfAlgValue algo; // algType
2251b8d9b87Sopenharmony_ci    int32_t bits; // keyLen
2261b8d9b87Sopenharmony_ci    int32_t primes; // number of primes
2271b8d9b87Sopenharmony_ci} HcfAsyKeyGenParams;
2281b8d9b87Sopenharmony_ci
2291b8d9b87Sopenharmony_citypedef struct {
2301b8d9b87Sopenharmony_ci    HcfAlgValue algo; // algType
2311b8d9b87Sopenharmony_ci    HcfAlgParaValue padding;
2321b8d9b87Sopenharmony_ci    HcfAlgParaValue md;
2331b8d9b87Sopenharmony_ci    HcfAlgParaValue mgf1md;
2341b8d9b87Sopenharmony_ci    HcfAlgParaValue operation;
2351b8d9b87Sopenharmony_ci} HcfSignatureParams;
2361b8d9b87Sopenharmony_ci
2371b8d9b87Sopenharmony_citypedef struct {
2381b8d9b87Sopenharmony_ci    HcfAlgValue algo;
2391b8d9b87Sopenharmony_ci} HcfKeyAgreementParams;
2401b8d9b87Sopenharmony_ci
2411b8d9b87Sopenharmony_citypedef struct {
2421b8d9b87Sopenharmony_ci    HcfAlgValue algo; // algType
2431b8d9b87Sopenharmony_ci    HcfAlgParaValue md;
2441b8d9b87Sopenharmony_ci    HcfAlgParaValue mode;
2451b8d9b87Sopenharmony_ci} HcfKdfDeriveParams;
2461b8d9b87Sopenharmony_ci
2471b8d9b87Sopenharmony_citypedef HcfResult (*SetParameterFunc) (const HcfParaConfig* config, void *params);
2481b8d9b87Sopenharmony_ci
2491b8d9b87Sopenharmony_ci#ifdef __cplusplus
2501b8d9b87Sopenharmony_ciextern "C" {
2511b8d9b87Sopenharmony_ci#endif
2521b8d9b87Sopenharmony_ci
2531b8d9b87Sopenharmony_ciHcfResult ParseAndSetParameter(const char *paramsStr, void *params, SetParameterFunc setFunc);
2541b8d9b87Sopenharmony_ci
2551b8d9b87Sopenharmony_ciHcfResult ParseAlgNameToParams(const char *algNameStr, HcfAsyKeyGenParams *params);
2561b8d9b87Sopenharmony_ci
2571b8d9b87Sopenharmony_ciHcfResult ParseCurveNameToParams(const char *curveNameStr, HcfAsyKeyGenParams *params);
2581b8d9b87Sopenharmony_ci
2591b8d9b87Sopenharmony_ciHcfResult GetAlgValueByCurveName(const char *curveNameStr, HcfAlgParaValue *algValue);
2601b8d9b87Sopenharmony_ci
2611b8d9b87Sopenharmony_ciHcfResult GetFormatValueByFormatName(const char *formatName, HcfFormatValue *formatValue);
2621b8d9b87Sopenharmony_ci
2631b8d9b87Sopenharmony_ci#ifdef __cplusplus
2641b8d9b87Sopenharmony_ci}
2651b8d9b87Sopenharmony_ci#endif
2661b8d9b87Sopenharmony_ci#endif
267