Annotation of embedaddon/strongswan/src/libstrongswan/crypto/crypto_factory.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008 Martin Willi
3: * Copyright (C) 2016-2019 Andreas Steffen
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: /**
18: * @defgroup crypto_factory crypto_factory
19: * @{ @ingroup crypto
20: */
21:
22: #ifndef CRYPTO_FACTORY_H_
23: #define CRYPTO_FACTORY_H_
24:
25: typedef struct crypto_factory_t crypto_factory_t;
26:
27: #include <library.h>
28: #include <collections/enumerator.h>
29: #include <crypto/crypters/crypter.h>
30: #include <crypto/aead.h>
31: #include <crypto/signers/signer.h>
32: #include <crypto/hashers/hasher.h>
33: #include <crypto/prfs/prf.h>
34: #include <crypto/rngs/rng.h>
35: #include <crypto/xofs/xof.h>
36: #include <crypto/drbgs/drbg.h>
37: #include <crypto/nonce_gen.h>
38: #include <crypto/diffie_hellman.h>
39: #include <crypto/transform.h>
40:
41: #define CRYPTO_MAX_ALG_LINE 120 /* characters */
42:
43: /**
44: * Constructor function for crypters
45: */
46: typedef crypter_t* (*crypter_constructor_t)(encryption_algorithm_t algo,
47: size_t key_size);
48: /**
49: * Constructor function for aead transforms
50: */
51: typedef aead_t* (*aead_constructor_t)(encryption_algorithm_t algo,
52: size_t key_size, size_t salt_size);
53: /**
54: * Constructor function for signers
55: */
56: typedef signer_t* (*signer_constructor_t)(integrity_algorithm_t algo);
57:
58: /**
59: * Constructor function for hashers
60: */
61: typedef hasher_t* (*hasher_constructor_t)(hash_algorithm_t algo);
62:
63: /**
64: * Constructor function for pseudo random functions
65: */
66: typedef prf_t* (*prf_constructor_t)(pseudo_random_function_t algo);
67:
68: /**
69: * Constructor function for extended output functions
70: */
71: typedef xof_t* (*xof_constructor_t)(ext_out_function_t algo);
72:
73: /**
74: * Constructor function for deterministic random bit generators
75: */
76: typedef drbg_t* (*drbg_constructor_t)(drbg_type_t type, uint32_t strength,
77: rng_t *entropy, chunk_t personalization_str);
78:
79: /**
80: * Constructor function for source of randomness
81: */
82: typedef rng_t* (*rng_constructor_t)(rng_quality_t quality);
83:
84: /**
85: * Constructor function for nonce generators
86: */
87: typedef nonce_gen_t* (*nonce_gen_constructor_t)();
88:
89: /**
90: * Constructor function for diffie hellman
91: *
92: * The DH constructor accepts additional arguments for:
93: * - MODP_CUSTOM: chunk_t generator, chunk_t prime
94: */
95: typedef diffie_hellman_t* (*dh_constructor_t)(diffie_hellman_group_t group, ...);
96:
97: /**
98: * Handles crypto modules and creates instances.
99: */
100: struct crypto_factory_t {
101:
102: /**
103: * Create a crypter instance.
104: *
105: * @param algo encryption algorithm
106: * @param key_size length of the key in bytes
107: * @return crypter_t instance, NULL if not supported
108: */
109: crypter_t* (*create_crypter)(crypto_factory_t *this,
110: encryption_algorithm_t algo, size_t key_size);
111:
112: /**
113: * Create a aead instance.
114: *
115: * @param algo encryption algorithm
116: * @param key_size length of the key in bytes
117: * @param salt_size size of salt, implicit part of the nonce
118: * @return aead_t instance, NULL if not supported
119: */
120: aead_t* (*create_aead)(crypto_factory_t *this,
121: encryption_algorithm_t algo,
122: size_t key_size, size_t salt_size);
123:
124: /**
125: * Create a symmetric signer instance.
126: *
127: * @param algo MAC algorithm to use
128: * @return signer_t instance, NULL if not supported
129: */
130: signer_t* (*create_signer)(crypto_factory_t *this,
131: integrity_algorithm_t algo);
132:
133: /**
134: * Create a hasher instance.
135: *
136: * @param algo hash algorithm
137: * @return hasher_t instance, NULL if not supported
138: */
139: hasher_t* (*create_hasher)(crypto_factory_t *this, hash_algorithm_t algo);
140:
141: /**
142: * Create a pseudo random function instance.
143: *
144: * @param algo PRF algorithm to use
145: * @return prf_t instance, NULL if not supported
146: */
147: prf_t* (*create_prf)(crypto_factory_t *this, pseudo_random_function_t algo);
148:
149: /**
150: * Create an extended output function instance.
151: *
152: * @param algo XOF algorithm to use
153: * @return xof_t instance, NULL if not supported
154: */
155: xof_t* (*create_xof)(crypto_factory_t *this, ext_out_function_t algo);
156:
157: /**
158: * Create a deterministic random bit generator instance.
159: *
160: * @param type DRBG type to use
161: * @param strength security strength in bits
162: * @param entropy entropy source to be used (adopted)
163: * @param personalization_str optional personalization string
164: * @return drbg_t instance, NULL if not supported
165: */
166: drbg_t* (*create_drbg)(crypto_factory_t *this, drbg_type_t type,
167: uint32_t strength, rng_t *entropy,
168: chunk_t personalization_str);
169:
170: /**
171: * Create a source of randomness.
172: *
173: * @param quality required randomness quality
174: * @return rng_t instance, NULL if no RNG with such a quality
175: */
176: rng_t* (*create_rng)(crypto_factory_t *this, rng_quality_t quality);
177:
178: /**
179: * Create a nonce generator instance.
180: *
181: * @return nonce_gen_t instance, NULL if not supported
182: */
183: nonce_gen_t* (*create_nonce_gen)(crypto_factory_t *this);
184:
185: /**
186: * Create a diffie hellman instance.
187: *
188: * Additional arguments are passed to the DH constructor.
189: *
190: * @param group diffie hellman group
191: * @return diffie_hellman_t instance, NULL if not supported
192: */
193: diffie_hellman_t* (*create_dh)(crypto_factory_t *this,
194: diffie_hellman_group_t group, ...);
195:
196: /**
197: * Register a crypter constructor.
198: *
199: * @param algo algorithm to constructor
200: * @param key size key size to perform benchmarking for
201: * @param plugin_name plugin that registered this algorithm
202: * @param create constructor function for that algorithm
203: * @return TRUE if registered, FALSE if test vector failed
204: */
205: bool (*add_crypter)(crypto_factory_t *this, encryption_algorithm_t algo,
206: size_t key_size, const char *plugin_name,
207: crypter_constructor_t create);
208:
209: /**
210: * Unregister a crypter constructor.
211: *
212: * @param create constructor function to unregister
213: */
214: void (*remove_crypter)(crypto_factory_t *this, crypter_constructor_t create);
215:
216: /**
217: * Unregister a aead constructor.
218: *
219: * @param create constructor function to unregister
220: */
221: void (*remove_aead)(crypto_factory_t *this, aead_constructor_t create);
222:
223: /**
224: * Register a aead constructor.
225: *
226: * @param algo algorithm to constructor
227: * @param key size key size to perform benchmarking for
228: * @param plugin_name plugin that registered this algorithm
229: * @param create constructor function for that algorithm
230: * @return TRUE if registered, FALSE if test vector failed
231: */
232: bool (*add_aead)(crypto_factory_t *this, encryption_algorithm_t algo,
233: size_t key_size, const char *plugin_name,
234: aead_constructor_t create);
235:
236: /**
237: * Register a signer constructor.
238: *
239: * @param algo algorithm to constructor
240: * @param plugin_name plugin that registered this algorithm
241: * @param create constructor function for that algorithm
242: * @return TRUE if registered, FALSE if test vector failed
243: */
244: bool (*add_signer)(crypto_factory_t *this, integrity_algorithm_t algo,
245: const char *plugin_name, signer_constructor_t create);
246:
247: /**
248: * Unregister a signer constructor.
249: *
250: * @param create constructor function to unregister
251: */
252: void (*remove_signer)(crypto_factory_t *this, signer_constructor_t create);
253:
254: /**
255: * Register a hasher constructor.
256: *
257: * @param algo algorithm to constructor
258: * @param plugin_name plugin that registered this algorithm
259: * @param create constructor function for that algorithm
260: * @return TRUE if registered, FALSE if test vector failed
261: */
262: bool (*add_hasher)(crypto_factory_t *this, hash_algorithm_t algo,
263: const char *plugin_name, hasher_constructor_t create);
264:
265: /**
266: * Unregister a hasher constructor.
267: *
268: * @param create constructor function to unregister
269: */
270: void (*remove_hasher)(crypto_factory_t *this, hasher_constructor_t create);
271:
272: /**
273: * Register a prf constructor.
274: *
275: * @param algo algorithm to constructor
276: * @param plugin_name plugin that registered this algorithm
277: * @param create constructor function for that algorithm
278: * @return TRUE if registered, FALSE if test vector failed
279: */
280: bool (*add_prf)(crypto_factory_t *this, pseudo_random_function_t algo,
281: const char *plugin_name, prf_constructor_t create);
282:
283: /**
284: * Unregister a prf constructor.
285: *
286: * @param create constructor function to unregister
287: */
288: void (*remove_prf)(crypto_factory_t *this, prf_constructor_t create);
289:
290: /**
291: * Register an xof constructor.
292: *
293: * @param algo algorithm to constructor
294: * @param plugin_name plugin that registered this algorithm
295: * @param create constructor function for that algorithm
296: * @return TRUE if registered, FALSE if test vector failed
297: */
298: bool (*add_xof)(crypto_factory_t *this, ext_out_function_t algo,
299: const char *plugin_name, xof_constructor_t create);
300:
301: /**
302: * Unregister an xof constructor.
303: *
304: * @param create constructor function to unregister
305: */
306: void (*remove_xof)(crypto_factory_t *this, xof_constructor_t create);
307:
308: /**
309: * Register a drbg constructor.
310: *
311: * @param type type to constructor
312: * @param plugin_name plugin that registered this algorithm
313: * @param create constructor function for that algorithm
314: * @return TRUE if registered, FALSE if test vector failed
315: */
316: bool (*add_drbg)(crypto_factory_t *this, drbg_type_t type,
317: const char *plugin_name, drbg_constructor_t create);
318:
319: /**
320: * Unregister a drbg constructor.
321: *
322: * @param create constructor function to unregister
323: */
324: void (*remove_drbg)(crypto_factory_t *this, drbg_constructor_t create);
325:
326: /**
327: * Register a source of randomness.
328: *
329: * @param quality quality of randomness this RNG serves
330: * @param plugin_name plugin that registered this algorithm
331: * @param create constructor function for such a quality
332: * @return TRUE if registered, FALSE if test vector failed
333: */
334: bool (*add_rng)(crypto_factory_t *this, rng_quality_t quality,
335: const char *plugin_name, rng_constructor_t create);
336:
337: /**
338: * Unregister a source of randomness.
339: *
340: * @param create constructor function to unregister
341: */
342: void (*remove_rng)(crypto_factory_t *this, rng_constructor_t create);
343:
344: /**
345: * Register a nonce generator.
346: *
347: * @param plugin_name plugin that registered this algorithm
348: * @param create constructor function for that nonce generator
349: * @return TRUE if registered, FALSE if test vector failed
350: */
351: bool (*add_nonce_gen)(crypto_factory_t *this, const char *plugin_name,
352: nonce_gen_constructor_t create);
353:
354: /**
355: * Unregister a nonce generator.
356: *
357: * @param create constructor function to unregister
358: */
359: void (*remove_nonce_gen)(crypto_factory_t *this,
360: nonce_gen_constructor_t create);
361:
362: /**
363: * Register a diffie hellman constructor.
364: *
365: * @param group dh group to constructor
366: * @param plugin_name plugin that registered this algorithm
367: * @param create constructor function for that algorithm
368: * @return TRUE if registered, FALSE if test vector failed
369: */
370: bool (*add_dh)(crypto_factory_t *this, diffie_hellman_group_t group,
371: const char *plugin_name, dh_constructor_t create);
372:
373: /**
374: * Unregister a diffie hellman constructor.
375: *
376: * @param create constructor function to unregister
377: */
378: void (*remove_dh)(crypto_factory_t *this, dh_constructor_t create);
379:
380: /**
381: * Create an enumerator over all registered crypter algorithms.
382: *
383: * @return enumerator over encryption_algorithm_t, plugin
384: */
385: enumerator_t* (*create_crypter_enumerator)(crypto_factory_t *this);
386:
387: /**
388: * Create an enumerator over all registered aead algorithms.
389: *
390: * @return enumerator over encryption_algorithm_t, plugin
391: */
392: enumerator_t* (*create_aead_enumerator)(crypto_factory_t *this);
393:
394: /**
395: * Create an enumerator over all registered signer algorithms.
396: *
397: * @return enumerator over integrity_algorithm_t, plugin
398: */
399: enumerator_t* (*create_signer_enumerator)(crypto_factory_t *this);
400:
401: /**
402: * Create an enumerator over all registered hasher algorithms.
403: *
404: * @return enumerator over hash_algorithm_t, plugin
405: */
406: enumerator_t* (*create_hasher_enumerator)(crypto_factory_t *this);
407:
408: /**
409: * Create an enumerator over all registered PRFs.
410: *
411: * @return enumerator over pseudo_random_function_t, plugin
412: */
413: enumerator_t* (*create_prf_enumerator)(crypto_factory_t *this);
414:
415: /**
416: * Create an enumerator over all registered XOFs.
417: *
418: * @return enumerator over ext_out_function_t, plugin
419: */
420: enumerator_t* (*create_xof_enumerator)(crypto_factory_t *this);
421:
422: /**
423: * Create an enumerator over all registered DRBGs.
424: *
425: * @return enumerator over drbg_type_t, plugin
426: */
427: enumerator_t* (*create_drbg_enumerator)(crypto_factory_t *this);
428:
429: /**
430: * Create an enumerator over all registered diffie hellman groups.
431: *
432: * @return enumerator over diffie_hellman_group_t, plugin
433: */
434: enumerator_t* (*create_dh_enumerator)(crypto_factory_t *this);
435:
436: /**
437: * Create an enumerator over all registered random generators.
438: *
439: * @return enumerator over rng_quality_t, plugin
440: */
441: enumerator_t* (*create_rng_enumerator)(crypto_factory_t *this);
442:
443: /**
444: * Create an enumerator over all registered nonce generators.
445: *
446: * @return enumerator over plugin
447: */
448: enumerator_t* (*create_nonce_gen_enumerator)(crypto_factory_t *this);
449:
450: /**
451: * Add a test vector to the crypto factory.
452: *
453: * @param type type of the test vector
454: * @param vector pointer to a test vector, defined in crypto_tester.h
455: */
456: void (*add_test_vector)(crypto_factory_t *this, transform_type_t type,
457: void *vector);
458:
459: /**
460: * Create an enumerator verifying transforms using known test vectors.
461: *
462: * The resulting enumerator enumerates over an u_int with the type
463: * specific transform identifier, the plugin name providing the transform,
464: * and a boolean value indicating success/failure for the given transform.
465: *
466: * @param type transform type to test
467: * @return enumerator over (u_int, char*, bool)
468: */
469: enumerator_t* (*create_verify_enumerator)(crypto_factory_t *this,
470: transform_type_t type);
471:
472: /**
473: * Destroy a crypto_factory instance.
474: */
475: void (*destroy)(crypto_factory_t *this);
476: };
477:
478: /**
479: * Create a crypto_factory instance.
480: */
481: crypto_factory_t *crypto_factory_create();
482:
483: #endif /** CRYPTO_FACTORY_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>