1/*
2* Copyright (C) 2022-2024 Huawei Device Co., Ltd.
3* Licensed under the Apache License, Version 2.0 (the "License");
4* you may not use this file except in compliance with the License.
5* You may obtain a copy of the License at
6*
7*    http://www.apache.org/licenses/LICENSE-2.0
8*
9* Unless required by applicable law or agreed to in writing, software
10* distributed under the License is distributed on an "AS IS" BASIS,
11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12* See the License for the specific language governing permissions and
13* limitations under the License.
14*/
15
16#ifndef HCF_PARAMS_PARSER_H
17#define HCF_PARAMS_PARSER_H
18
19#include <stdint.h>
20#include "result.h"
21
22typedef enum {
23    HCF_ALG_TYPE = 1,
24    HCF_ALG_KEY_TYPE,
25    HCF_ALG_MODE,
26    HCF_ALG_PADDING_TYPE,
27    HCF_ALG_PRIMES,
28    HCF_ALG_DIGEST,
29    HCF_ALG_MGF1_DIGEST,
30    HCF_ALG_TEXT_FORMAT,
31    HCF_ALG_SIGN_TYPE,
32    HCF_ALG_VERIFY_TYPE,
33} HcfAlgParaType;
34
35typedef enum {
36    HCF_ALG_AES = 1,
37    HCF_ALG_DES,
38    HCF_ALG_RSA,
39    HCF_ALG_ECC,
40    HCF_ALG_DSA,
41    HCF_ALG_SM2,
42    HCF_ALG_SM4,
43    HCF_ALG_HMAC,
44    HCF_ALG_PKBDF2,
45    HCF_ALG_ECC_BRAINPOOL,
46    HCF_ALG_ED25519,
47    HCF_ALG_X25519,
48    HCF_ALG_DH,
49    HCF_ALG_HKDF,
50} HcfAlgValue;
51
52typedef enum {
53    HCF_ALG_ECC_224 = 1,
54    HCF_ALG_ECC_256,
55    HCF_ALG_ECC_384,
56    HCF_ALG_ECC_521,
57
58    HCF_ALG_AES_128,
59    HCF_ALG_AES_192,
60    HCF_ALG_AES_256,
61    HCF_ALG_SM4_128,
62    HCF_ALG_3DES_192,
63
64    HCF_ALG_MODE_NONE,
65    HCF_ALG_MODE_ECB,
66    HCF_ALG_MODE_CBC,
67    HCF_ALG_MODE_CTR,
68    HCF_ALG_MODE_OFB,
69    HCF_ALG_MODE_CFB,
70    HCF_ALG_MODE_CFB1,
71    HCF_ALG_MODE_CFB8,
72    HCF_ALG_MODE_CFB64,
73    HCF_ALG_MODE_CFB128,
74    HCF_ALG_MODE_CCM,
75    HCF_ALG_MODE_GCM,
76
77    HCF_ALG_NOPADDING,
78    HCF_ALG_PADDING_PKCS5,
79    HCF_ALG_PADDING_PKCS7,
80
81    // rsa keysize
82    HCF_OPENSSL_RSA_512,
83    HCF_OPENSSL_RSA_768,
84    HCF_OPENSSL_RSA_1024,
85    HCF_OPENSSL_RSA_2048,
86    HCF_OPENSSL_RSA_3072,
87    HCF_OPENSSL_RSA_4096,
88    HCF_OPENSSL_RSA_8192,
89
90    // rsa cipher padding,
91    HCF_OPENSSL_RSA_PKCS1_PADDING,
92    HCF_OPENSSL_RSA_PKCS1_OAEP_PADDING,
93    HCF_OPENSSL_RSA_PSS_PADDING,
94
95    // digest
96    HCF_OPENSSL_DIGEST_NONE,
97    HCF_OPENSSL_DIGEST_MD5,
98    HCF_OPENSSL_DIGEST_SM3,
99    HCF_OPENSSL_DIGEST_SHA1,
100    HCF_OPENSSL_DIGEST_SHA224,
101    HCF_OPENSSL_DIGEST_SHA256,
102    HCF_OPENSSL_DIGEST_SHA384,
103    HCF_OPENSSL_DIGEST_SHA512,
104
105    // primes
106    HCF_OPENSSL_PRIMES_2,
107    HCF_OPENSSL_PRIMES_3,
108    HCF_OPENSSL_PRIMES_4,
109    HCF_OPENSSL_PRIMES_5,
110
111    // dsa
112    HCF_ALG_DSA_1024,
113    HCF_ALG_DSA_2048,
114    HCF_ALG_DSA_3072,
115
116    // sm2
117    HCF_ALG_SM2_256,
118
119    // only for algName(NO SIZE)
120    HCF_ALG_DSA_DEFAULT,
121    HCF_ALG_RSA_DEFAULT,
122    HCF_ALG_ECC_DEFAULT,
123    HCF_ALG_SM2_DEFAULT,
124    HCF_ALG_AES_DEFAULT,
125    HCF_ALG_SM4_DEFAULT,
126    HCF_ALG_3DES_DEFAULT,
127    HCF_ALG_HMAC_DEFAULT,
128    HCF_ALG_ECC_BRAINPOOL_DEFAULT,
129    HCF_ALG_X25519_DEFAULT,
130    HCF_ALG_DH_DEFAULT,
131
132    // key derivation function, PBKDF2
133    HCF_ALG_PBKDF2_DEFAULT,
134
135    // sm2 text format
136    HCF_ALG_TEXT_FORMAT_C1C3C2,
137    HCF_ALG_TEXT_FORMAT_C1C2C3,
138
139    // brainpool
140    HCF_ALG_ECC_BP160R1,
141    HCF_ALG_ECC_BP160T1,
142    HCF_ALG_ECC_BP192R1,
143    HCF_ALG_ECC_BP192T1,
144    HCF_ALG_ECC_BP224R1,
145    HCF_ALG_ECC_BP224T1,
146    HCF_ALG_ECC_BP256R1,
147    HCF_ALG_ECC_BP256T1,
148    HCF_ALG_ECC_BP320R1,
149    HCF_ALG_ECC_BP320T1,
150    HCF_ALG_ECC_BP384R1,
151    HCF_ALG_ECC_BP384T1,
152    HCF_ALG_ECC_BP512R1,
153    HCF_ALG_ECC_BP512T1,
154
155    // ed25519
156    HCF_ALG_ED25519_256,
157    HCF_ALG_X25519_256,
158
159    // DH keysize
160    HCF_OPENSSL_DH_MODP_1536,
161    HCF_OPENSSL_DH_MODP_2048,
162    HCF_OPENSSL_DH_MODP_3072,
163    HCF_OPENSSL_DH_MODP_4096,
164    HCF_OPENSSL_DH_MODP_6144,
165    HCF_OPENSSL_DH_MODP_8192,
166    HCF_OPENSSL_DH_FFDHE_2048,
167    HCF_OPENSSL_DH_FFDHE_3072,
168    HCF_OPENSSL_DH_FFDHE_4096,
169    HCF_OPENSSL_DH_FFDHE_6144,
170    HCF_OPENSSL_DH_FFDHE_8192,
171
172    HCF_ALG_ONLY_SIGN,
173    HCF_ALG_VERIFY_RECOVER,
174    // key derivation function, HKDF
175    HCF_ALG_HKDF_DEFAULT,
176
177    // hkdf mode
178    HCF_ALG_MODE_EXTRACT_AND_EXPAND,
179    HCF_ALG_MODE_EXTRACT_ONLY,
180    HCF_ALG_MODE_EXPAND_ONLY,
181} HcfAlgParaValue;
182
183typedef enum {
184    HCF_OPERATIOPN_ONLY_SIGN = 1,
185    HCF_OPERATION_SIGN,
186} HcfSignParams;
187
188typedef enum {
189    HCF_UNCOMPRESSED_FORMAT_VALUE = 1,
190    HCF_COMPRESSED_FORMAT_VALUE,
191} HcfFormatValue;
192
193typedef struct {
194    const char *formatName;
195    HcfFormatValue formatValue;
196} HcfFormatMap;
197
198typedef struct {
199    const char *tag;
200    HcfAlgParaType paraType;
201    HcfAlgParaValue paraValue;
202} HcfParaConfig;
203
204typedef struct {
205    const char *algNameStr;
206    HcfAlgValue algValue;
207} HcfAlgMap;
208
209typedef struct {
210    const char *curveNameStr;
211    HcfAlgParaValue algValue;
212} HcfCurveMap;
213
214typedef struct {
215    HcfAlgValue algo;
216    HcfAlgParaValue keySize;
217    HcfAlgParaValue mode;
218    HcfAlgParaValue paddingMode;
219    HcfAlgParaValue md;
220    HcfAlgParaValue mgf1md;
221} CipherAttr;
222
223typedef struct {
224    HcfAlgValue algo; // algType
225    int32_t bits; // keyLen
226    int32_t primes; // number of primes
227} HcfAsyKeyGenParams;
228
229typedef struct {
230    HcfAlgValue algo; // algType
231    HcfAlgParaValue padding;
232    HcfAlgParaValue md;
233    HcfAlgParaValue mgf1md;
234    HcfAlgParaValue operation;
235} HcfSignatureParams;
236
237typedef struct {
238    HcfAlgValue algo;
239} HcfKeyAgreementParams;
240
241typedef struct {
242    HcfAlgValue algo; // algType
243    HcfAlgParaValue md;
244    HcfAlgParaValue mode;
245} HcfKdfDeriveParams;
246
247typedef HcfResult (*SetParameterFunc) (const HcfParaConfig* config, void *params);
248
249#ifdef __cplusplus
250extern "C" {
251#endif
252
253HcfResult ParseAndSetParameter(const char *paramsStr, void *params, SetParameterFunc setFunc);
254
255HcfResult ParseAlgNameToParams(const char *algNameStr, HcfAsyKeyGenParams *params);
256
257HcfResult ParseCurveNameToParams(const char *curveNameStr, HcfAsyKeyGenParams *params);
258
259HcfResult GetAlgValueByCurveName(const char *curveNameStr, HcfAlgParaValue *algValue);
260
261HcfResult GetFormatValueByFormatName(const char *formatName, HcfFormatValue *formatValue);
262
263#ifdef __cplusplus
264}
265#endif
266#endif
267