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 
22 typedef 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 
35 typedef 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 
52 typedef 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 
183 typedef enum {
184     HCF_OPERATIOPN_ONLY_SIGN = 1,
185     HCF_OPERATION_SIGN,
186 } HcfSignParams;
187 
188 typedef enum {
189     HCF_UNCOMPRESSED_FORMAT_VALUE = 1,
190     HCF_COMPRESSED_FORMAT_VALUE,
191 } HcfFormatValue;
192 
193 typedef struct {
194     const char *formatName;
195     HcfFormatValue formatValue;
196 } HcfFormatMap;
197 
198 typedef struct {
199     const char *tag;
200     HcfAlgParaType paraType;
201     HcfAlgParaValue paraValue;
202 } HcfParaConfig;
203 
204 typedef struct {
205     const char *algNameStr;
206     HcfAlgValue algValue;
207 } HcfAlgMap;
208 
209 typedef struct {
210     const char *curveNameStr;
211     HcfAlgParaValue algValue;
212 } HcfCurveMap;
213 
214 typedef struct {
215     HcfAlgValue algo;
216     HcfAlgParaValue keySize;
217     HcfAlgParaValue mode;
218     HcfAlgParaValue paddingMode;
219     HcfAlgParaValue md;
220     HcfAlgParaValue mgf1md;
221 } CipherAttr;
222 
223 typedef struct {
224     HcfAlgValue algo; // algType
225     int32_t bits; // keyLen
226     int32_t primes; // number of primes
227 } HcfAsyKeyGenParams;
228 
229 typedef struct {
230     HcfAlgValue algo; // algType
231     HcfAlgParaValue padding;
232     HcfAlgParaValue md;
233     HcfAlgParaValue mgf1md;
234     HcfAlgParaValue operation;
235 } HcfSignatureParams;
236 
237 typedef struct {
238     HcfAlgValue algo;
239 } HcfKeyAgreementParams;
240 
241 typedef struct {
242     HcfAlgValue algo; // algType
243     HcfAlgParaValue md;
244     HcfAlgParaValue mode;
245 } HcfKdfDeriveParams;
246 
247 typedef HcfResult (*SetParameterFunc) (const HcfParaConfig* config, void *params);
248 
249 #ifdef __cplusplus
250 extern "C" {
251 #endif
252 
253 HcfResult ParseAndSetParameter(const char *paramsStr, void *params, SetParameterFunc setFunc);
254 
255 HcfResult ParseAlgNameToParams(const char *algNameStr, HcfAsyKeyGenParams *params);
256 
257 HcfResult ParseCurveNameToParams(const char *curveNameStr, HcfAsyKeyGenParams *params);
258 
259 HcfResult GetAlgValueByCurveName(const char *curveNameStr, HcfAlgParaValue *algValue);
260 
261 HcfResult GetFormatValueByFormatName(const char *formatName, HcfFormatValue *formatValue);
262 
263 #ifdef __cplusplus
264 }
265 #endif
266 #endif
267