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     HCF_ALG_ECC_SECP256K1,
156 
157     // ed25519
158     HCF_ALG_ED25519_256,
159     HCF_ALG_X25519_256,
160 
161     // DH keysize
162     HCF_OPENSSL_DH_MODP_1536,
163     HCF_OPENSSL_DH_MODP_2048,
164     HCF_OPENSSL_DH_MODP_3072,
165     HCF_OPENSSL_DH_MODP_4096,
166     HCF_OPENSSL_DH_MODP_6144,
167     HCF_OPENSSL_DH_MODP_8192,
168     HCF_OPENSSL_DH_FFDHE_2048,
169     HCF_OPENSSL_DH_FFDHE_3072,
170     HCF_OPENSSL_DH_FFDHE_4096,
171     HCF_OPENSSL_DH_FFDHE_6144,
172     HCF_OPENSSL_DH_FFDHE_8192,
173 
174     HCF_ALG_ONLY_SIGN,
175     HCF_ALG_VERIFY_RECOVER,
176     // key derivation function, HKDF
177     HCF_ALG_HKDF_DEFAULT,
178 
179     // hkdf mode
180     HCF_ALG_MODE_EXTRACT_AND_EXPAND,
181     HCF_ALG_MODE_EXTRACT_ONLY,
182     HCF_ALG_MODE_EXPAND_ONLY,
183 } HcfAlgParaValue;
184 
185 typedef enum {
186     HCF_OPERATIOPN_ONLY_SIGN = 1,
187     HCF_OPERATION_SIGN,
188 } HcfSignParams;
189 
190 typedef enum {
191     HCF_UNCOMPRESSED_FORMAT_VALUE = 1,
192     HCF_COMPRESSED_FORMAT_VALUE,
193 } HcfFormatValue;
194 
195 typedef struct {
196     const char *formatName;
197     HcfFormatValue formatValue;
198 } HcfFormatMap;
199 
200 typedef struct {
201     const char *tag;
202     HcfAlgParaType paraType;
203     HcfAlgParaValue paraValue;
204 } HcfParaConfig;
205 
206 typedef struct {
207     const char *algNameStr;
208     HcfAlgValue algValue;
209 } HcfAlgMap;
210 
211 typedef struct {
212     const char *curveNameStr;
213     HcfAlgParaValue algValue;
214 } HcfCurveMap;
215 
216 typedef struct {
217     HcfAlgValue algo;
218     HcfAlgParaValue keySize;
219     HcfAlgParaValue mode;
220     HcfAlgParaValue paddingMode;
221     HcfAlgParaValue md;
222     HcfAlgParaValue mgf1md;
223 } CipherAttr;
224 
225 typedef struct {
226     HcfAlgValue algo; // algType
227     int32_t bits; // keyLen
228     int32_t primes; // number of primes
229 } HcfAsyKeyGenParams;
230 
231 typedef struct {
232     HcfAlgValue algo; // algType
233     HcfAlgParaValue padding;
234     HcfAlgParaValue md;
235     HcfAlgParaValue mgf1md;
236     HcfAlgParaValue operation;
237 } HcfSignatureParams;
238 
239 typedef struct {
240     HcfAlgValue algo;
241 } HcfKeyAgreementParams;
242 
243 typedef struct {
244     HcfAlgValue algo; // algType
245     HcfAlgParaValue md;
246     HcfAlgParaValue mode;
247 } HcfKdfDeriveParams;
248 
249 typedef HcfResult (*SetParameterFunc) (const HcfParaConfig* config, void *params);
250 
251 #ifdef __cplusplus
252 extern "C" {
253 #endif
254 
255 HcfResult ParseAndSetParameter(const char *paramsStr, void *params, SetParameterFunc setFunc);
256 
257 HcfResult ParseAlgNameToParams(const char *algNameStr, HcfAsyKeyGenParams *params);
258 
259 HcfResult ParseCurveNameToParams(const char *curveNameStr, HcfAsyKeyGenParams *params);
260 
261 HcfResult GetAlgValueByCurveName(const char *curveNameStr, HcfAlgParaValue *algValue);
262 
263 HcfResult GetFormatValueByFormatName(const char *formatName, HcfFormatValue *formatValue);
264 
265 #ifdef __cplusplus
266 }
267 #endif
268 #endif
269