1 /*
2  * XML Security Library (http://www.aleksey.com/xmlsec).
3  *
4  * This is free software; see Copyright file in the source
5  * distribution for preciese wording.
6  *
7  * Copyright (C) 2002-2016 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved.
8  */
9 #ifndef __XMLSEC_GCRYPT_CRYPTO_H__
10 #define __XMLSEC_GCRYPT_CRYPTO_H__
11 
12 #include <xmlsec/xmlsec.h>
13 #include <xmlsec/keys.h>
14 #include <xmlsec/transforms.h>
15 #include <xmlsec/dl.h>
16 
17 #include <gcrypt.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif /* __cplusplus */
22 
23 XMLSEC_CRYPTO_EXPORT xmlSecCryptoDLFunctionsPtr xmlSecCryptoGetFunctions_gcrypt(void);
24 
25 /********************************************************************
26  *
27  * Init shutdown
28  *
29  ********************************************************************/
30 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptInit                (void);
31 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptShutdown            (void);
32 
33 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeysMngrInit        (xmlSecKeysMngrPtr mngr);
34 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptGenerateRandom      (xmlSecBufferPtr buffer,
35                                                                          xmlSecSize size);
36 
37 
38 /********************************************************************
39  *
40  * AES transforms
41  *
42  *******************************************************************/
43 #ifndef XMLSEC_NO_AES
44 /**
45  * xmlSecGCryptKeyDataAesId:
46  *
47  * The AES key data klass.
48  */
49 #define xmlSecGCryptKeyDataAesId \
50         xmlSecGCryptKeyDataAesGetKlass()
51 XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId    xmlSecGCryptKeyDataAesGetKlass  (void);
52 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataAesSet       (xmlSecKeyDataPtr data,
53                                                                          const xmlSecByte* buf,
54                                                                          xmlSecSize bufSize);
55 /**
56  * xmlSecGCryptTransformAes128CbcId:
57  *
58  * The AES128 CBC cipher transform klass.
59  */
60 #define xmlSecGCryptTransformAes128CbcId \
61         xmlSecGCryptTransformAes128CbcGetKlass()
62 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformAes128CbcGetKlass(void);
63 
64 /**
65  * xmlSecGCryptTransformAes192CbcId:
66  *
67  * The AES192 CBC cipher transform klass.
68  */
69 #define xmlSecGCryptTransformAes192CbcId \
70         xmlSecGCryptTransformAes192CbcGetKlass()
71 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformAes192CbcGetKlass(void);
72 
73 /**
74  * xmlSecGCryptTransformAes256CbcId:
75  *
76  * The AES256 CBC cipher transform klass.
77  */
78 #define xmlSecGCryptTransformAes256CbcId \
79         xmlSecGCryptTransformAes256CbcGetKlass()
80 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformAes256CbcGetKlass(void);
81 
82 /**
83  * xmlSecGCryptTransformKWAes128Id:
84  *
85  * The AES 128 key wrap transform klass.
86  */
87 #define xmlSecGCryptTransformKWAes128Id \
88         xmlSecGCryptTransformKWAes128GetKlass()
89 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformKWAes128GetKlass(void);
90 
91 /**
92  * xmlSecGCryptTransformKWAes192Id:
93  *
94  * The AES 192 key wrap transform klass.
95  */
96 #define xmlSecGCryptTransformKWAes192Id \
97         xmlSecGCryptTransformKWAes192GetKlass()
98 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformKWAes192GetKlass(void);
99 
100 /**
101  * xmlSecGCryptTransformKWAes256Id:
102  *
103  * The AES 256 key wrap transform klass.
104  */
105 #define xmlSecGCryptTransformKWAes256Id \
106         xmlSecGCryptTransformKWAes256GetKlass()
107 XMLSEC_CRYPTO_EXPORT xmlSecTransformId  xmlSecGCryptTransformKWAes256GetKlass(void);
108 
109 
110 #endif /* XMLSEC_NO_AES */
111 
112 /********************************************************************
113  *
114  * DES transforms
115  *
116  *******************************************************************/
117 #ifndef XMLSEC_NO_DES
118 /**
119  * xmlSecGCryptKeyDataDesId:
120  *
121  * The DES key data klass.
122  */
123 #define xmlSecGCryptKeyDataDesId \
124         xmlSecGCryptKeyDataDesGetKlass()
125 XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId    xmlSecGCryptKeyDataDesGetKlass  (void);
126 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataDesSet       (xmlSecKeyDataPtr data,
127                                                                          const xmlSecByte* buf,
128                                                                          xmlSecSize bufSize);
129 
130 /**
131  * xmlSecGCryptTransformDes3CbcId:
132  *
133  * The DES3 CBC cipher transform klass.
134  */
135 #define xmlSecGCryptTransformDes3CbcId \
136         xmlSecGCryptTransformDes3CbcGetKlass()
137 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformDes3CbcGetKlass(void);
138 
139 /**
140  * xmlSecGCryptTransformKWDes3Id:
141  *
142  * The DES3 KW transform klass.
143  */
144 #define xmlSecGCryptTransformKWDes3Id \
145         xmlSecGCryptTransformKWDes3GetKlass()
146 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformKWDes3GetKlass(void);
147 
148 #endif /* XMLSEC_NO_DES */
149 
150 /********************************************************************
151  *
152  * DSA transform
153  *
154  *******************************************************************/
155 #ifndef XMLSEC_NO_DSA
156 
157 /**
158  * xmlSecGCryptKeyDataDsaId:
159  *
160  * The DSA key klass.
161  */
162 #define xmlSecGCryptKeyDataDsaId \
163         xmlSecGCryptKeyDataDsaGetKlass()
164 XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId    xmlSecGCryptKeyDataDsaGetKlass          (void);
165 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataDsaAdoptKey          (xmlSecKeyDataPtr data,
166                                                                                  gcry_sexp_t dsa_key);
167 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataDsaAdoptKeyPair      (xmlSecKeyDataPtr data,
168                                                                                  gcry_sexp_t pub_key,
169                                                                                  gcry_sexp_t priv_key);
170 XMLSEC_CRYPTO_EXPORT gcry_sexp_t        xmlSecGCryptKeyDataDsaGetPublicKey      (xmlSecKeyDataPtr data);
171 XMLSEC_CRYPTO_EXPORT gcry_sexp_t        xmlSecGCryptKeyDataDsaGetPrivateKey     (xmlSecKeyDataPtr data);
172 
173 #ifndef XMLSEC_NO_SHA1
174 /**
175  * xmlSecGCryptTransformDsaSha1Id:
176  *
177  * The DSA SHA1 signature transform klass.
178  */
179 #define xmlSecGCryptTransformDsaSha1Id \
180         xmlSecGCryptTransformDsaSha1GetKlass()
181 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformDsaSha1GetKlass(void);
182 #endif /* XMLSEC_NO_SHA1 */
183 
184 #endif /* XMLSEC_NO_DSA */
185 
186 
187 
188 /********************************************************************
189  *
190  * HMAC transforms
191  *
192  *******************************************************************/
193 #ifndef XMLSEC_NO_HMAC
194 
195 XMLSEC_CRYPTO_EXPORT int               xmlSecGCryptHmacGetMinOutputLength(void);
196 XMLSEC_CRYPTO_EXPORT void              xmlSecGCryptHmacSetMinOutputLength(int min_length);
197 
198 /**
199  * xmlSecGCryptKeyDataHmacId:
200  *
201  * The HMAC key klass.
202  */
203 #define xmlSecGCryptKeyDataHmacId \
204         xmlSecGCryptKeyDataHmacGetKlass()
205 XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId    xmlSecGCryptKeyDataHmacGetKlass (void);
206 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataHmacSet      (xmlSecKeyDataPtr data,
207                                                                          const xmlSecByte* buf,
208                                                                          xmlSecSize bufSize);
209 
210 #ifndef XMLSEC_NO_MD5
211 /**
212  * xmlSecGCryptTransformHmacMd5Id:
213  *
214  * The HMAC with MD5 signature transform klass.
215  */
216 #define xmlSecGCryptTransformHmacMd5Id \
217         xmlSecGCryptTransformHmacMd5GetKlass()
218 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacMd5GetKlass(void);
219 
220 #endif /* XMLSEC_NO_MD5 */
221 
222 #ifndef XMLSEC_NO_RIPEMD160
223 /**
224  * xmlSecGCryptTransformHmacRipemd160Id:
225  *
226  * The HMAC with RipeMD160 signature transform klass.
227  */
228 #define xmlSecGCryptTransformHmacRipemd160Id \
229         xmlSecGCryptTransformHmacRipemd160GetKlass()
230 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacRipemd160GetKlass(void);
231 #endif /* XMLSEC_NO_RIPEMD160 */
232 
233 #ifndef XMLSEC_NO_SHA1
234 /**
235  * xmlSecGCryptTransformHmacSha1Id:
236  *
237  * The HMAC with SHA1 signature transform klass.
238  */
239 #define xmlSecGCryptTransformHmacSha1Id \
240         xmlSecGCryptTransformHmacSha1GetKlass()
241 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacSha1GetKlass(void);
242 #endif /* XMLSEC_NO_SHA1 */
243 
244 #ifndef XMLSEC_NO_SHA256
245 /**
246  * xmlSecGCryptTransformHmacSha256Id:
247  *
248  * The HMAC with SHA256 signature transform klass.
249  */
250 #define xmlSecGCryptTransformHmacSha256Id \
251         xmlSecGCryptTransformHmacSha256GetKlass()
252 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacSha256GetKlass(void);
253 #endif /* XMLSEC_NO_SHA256 */
254 
255 #ifndef XMLSEC_NO_SHA384
256 /**
257  * xmlSecGCryptTransformHmacSha384Id:
258  *
259  * The HMAC with SHA384 signature transform klass.
260  */
261 #define xmlSecGCryptTransformHmacSha384Id \
262         xmlSecGCryptTransformHmacSha384GetKlass()
263 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacSha384GetKlass(void);
264 #endif /* XMLSEC_NO_SHA384 */
265 
266 #ifndef XMLSEC_NO_SHA512
267 /**
268  * xmlSecGCryptTransformHmacSha512Id:
269  *
270  * The HMAC with SHA512 signature transform klass.
271  */
272 #define xmlSecGCryptTransformHmacSha512Id \
273         xmlSecGCryptTransformHmacSha512GetKlass()
274 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformHmacSha512GetKlass(void);
275 #endif /* XMLSEC_NO_SHA512 */
276 
277 #endif /* XMLSEC_NO_HMAC */
278 
279 /********************************************************************
280  *
281  * RSA transforms
282  *
283  *******************************************************************/
284 #ifndef XMLSEC_NO_RSA
285 
286 /**
287  * xmlSecGCryptKeyDataRsaId:
288  *
289  * The RSA key klass.
290  */
291 #define xmlSecGCryptKeyDataRsaId \
292         xmlSecGCryptKeyDataRsaGetKlass()
293 XMLSEC_CRYPTO_EXPORT xmlSecKeyDataId    xmlSecGCryptKeyDataRsaGetKlass (void);
294 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataRsaAdoptKey          (xmlSecKeyDataPtr data,
295                                                                                  gcry_sexp_t rsa_key);
296 XMLSEC_CRYPTO_EXPORT int                xmlSecGCryptKeyDataRsaAdoptKeyPair      (xmlSecKeyDataPtr data,
297                                                                                  gcry_sexp_t pub_key,
298                                                                                  gcry_sexp_t priv_key);
299 XMLSEC_CRYPTO_EXPORT gcry_sexp_t        xmlSecGCryptKeyDataRsaGetPublicKey      (xmlSecKeyDataPtr data);
300 XMLSEC_CRYPTO_EXPORT gcry_sexp_t        xmlSecGCryptKeyDataRsaGetPrivateKey     (xmlSecKeyDataPtr data);
301 
302 #ifndef XMLSEC_NO_MD5
303 /**
304  * xmlSecGCryptTransformRsaMd5Id:
305  *
306  * The RSA-MD5 signature transform klass.
307  */
308 #define xmlSecGCryptTransformRsaMd5Id  \
309         xmlSecGCryptTransformRsaMd5GetKlass()
310 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaMd5GetKlass(void);
311 #endif /* XMLSEC_NO_MD5 */
312 
313 #ifndef XMLSEC_NO_RIPEMD160
314 /**
315  * xmlSecGCryptTransformRsaRipemd160Id:
316  *
317  * The RSA-RIPEMD160 signature transform klass.
318  */
319 #define xmlSecGCryptTransformRsaRipemd160Id    \
320         xmlSecGCryptTransformRsaRipemd160GetKlass()
321 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaRipemd160GetKlass(void);
322 #endif /* XMLSEC_NO_RIPEMD160 */
323 
324 #ifndef XMLSEC_NO_SHA1
325 /**
326  * xmlSecGCryptTransformRsaSha1Id:
327  *
328  * The RSA-SHA1 signature transform klass.
329  */
330 #define xmlSecGCryptTransformRsaSha1Id \
331         xmlSecGCryptTransformRsaSha1GetKlass()
332 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaSha1GetKlass(void);
333 #endif /* XMLSEC_NO_SHA1 */
334 
335 #ifndef XMLSEC_NO_SHA256
336 /**
337  * xmlSecGCryptTransformRsaSha256Id:
338  *
339  * The RSA-SHA256 signature transform klass.
340  */
341 #define xmlSecGCryptTransformRsaSha256Id       \
342         xmlSecGCryptTransformRsaSha256GetKlass()
343 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaSha256GetKlass(void);
344 #endif /* XMLSEC_NO_SHA256 */
345 
346 #ifndef XMLSEC_NO_SHA384
347 /**
348  * xmlSecGCryptTransformRsaSha384Id:
349  *
350  * The RSA-SHA384 signature transform klass.
351  */
352 #define xmlSecGCryptTransformRsaSha384Id       \
353         xmlSecGCryptTransformRsaSha384GetKlass()
354 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaSha384GetKlass(void);
355 #endif /* XMLSEC_NO_SHA384 */
356 
357 #ifndef XMLSEC_NO_SHA512
358 /**
359  * xmlSecGCryptTransformRsaSha512Id:
360  *
361  * The RSA-SHA512 signature transform klass.
362  */
363 #define xmlSecGCryptTransformRsaSha512Id       \
364         xmlSecGCryptTransformRsaSha512GetKlass()
365 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRsaSha512GetKlass(void);
366 #endif /* XMLSEC_NO_SHA512 */
367 
368 #endif /* XMLSEC_NO_RSA */
369 
370 
371 /********************************************************************
372  *
373  * SHA transforms
374  *
375  *******************************************************************/
376 #ifndef XMLSEC_NO_SHA1
377 /**
378  * xmlSecGCryptTransformSha1Id:
379  *
380  * The HMAC with SHA1 signature transform klass.
381  */
382 #define xmlSecGCryptTransformSha1Id \
383         xmlSecGCryptTransformSha1GetKlass()
384 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformSha1GetKlass(void);
385 #endif /* XMLSEC_NO_SHA1 */
386 
387 #ifndef XMLSEC_NO_SHA256
388 /**
389  * xmlSecGCryptTransformSha256Id:
390  *
391  * The HMAC with SHA256 signature transform klass.
392  */
393 #define xmlSecGCryptTransformSha256Id \
394         xmlSecGCryptTransformSha256GetKlass()
395 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformSha256GetKlass(void);
396 #endif /* XMLSEC_NO_SHA256 */
397 
398 #ifndef XMLSEC_NO_SHA384
399 /**
400  * xmlSecGCryptTransformSha384Id:
401  *
402  * The HMAC with SHA384 signature transform klass.
403  */
404 #define xmlSecGCryptTransformSha384Id \
405         xmlSecGCryptTransformSha384GetKlass()
406 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformSha384GetKlass(void);
407 #endif /* XMLSEC_NO_SHA384 */
408 
409 #ifndef XMLSEC_NO_SHA512
410 /**
411  * xmlSecGCryptTransformSha512Id:
412  *
413  * The HMAC with SHA512 signature transform klass.
414  */
415 #define xmlSecGCryptTransformSha512Id \
416         xmlSecGCryptTransformSha512GetKlass()
417 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformSha512GetKlass(void);
418 #endif /* XMLSEC_NO_SHA512 */
419 
420 /********************************************************************
421  *
422  * Md5 transforms
423  *
424  *******************************************************************/
425 #ifndef XMLSEC_NO_MD5
426 /**
427  * xmlSecGCryptTransformMd5Id:
428  *
429  * The MD5 digest transform klass.
430  */
431 #define xmlSecGCryptTransformMd5Id \
432         xmlSecGCryptTransformMd5GetKlass()
433 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformMd5GetKlass(void);
434 #endif /* XMLSEC_NO_MD5 */
435 
436 
437 /********************************************************************
438  *
439  * RipeMD160 transforms
440  *
441  *******************************************************************/
442 #ifndef XMLSEC_NO_RIPEMD160
443 /**
444  * xmlSecGCryptTransformRipemd160Id:
445  *
446  * The RIPEMD160 digest transform klass.
447  */
448 #define xmlSecGCryptTransformRipemd160Id \
449         xmlSecGCryptTransformRipemd160GetKlass()
450 XMLSEC_CRYPTO_EXPORT xmlSecTransformId xmlSecGCryptTransformRipemd160GetKlass(void);
451 #endif /* XMLSEC_NO_RIPEMD160 */
452 
453 
454 #ifdef __cplusplus
455 }
456 #endif /* __cplusplus */
457 
458 #endif /* __XMLSEC_GCRYPT_CRYPTO_H__ */
459 
460 #define __XMLSEC_GCRYPT_CRYPTO_H__
461