2 * Copyright (C) 2008 Martin Willi
3 * Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 * @defgroup crypto_factory crypto_factory
21 #ifndef CRYPTO_FACTORY_H_
22 #define CRYPTO_FACTORY_H_
24 typedef struct crypto_factory_t crypto_factory_t
;
27 #include <crypto/crypters/crypter.h>
28 #include <crypto/signers/signer.h>
29 #include <crypto/hashers/hasher.h>
30 #include <crypto/prfs/prf.h>
31 #include <crypto/rngs/rng.h>
32 #include <crypto/diffie_hellman.h>
33 #include <crypto/transform.h>
36 * Constructor function for crypters
38 typedef crypter_t
* (*crypter_constructor_t
)(encryption_algorithm_t algo
,
41 * Constructor function for signers
43 typedef signer_t
* (*signer_constructor_t
)(integrity_algorithm_t algo
);
46 * Constructor function for hashers
48 typedef hasher_t
* (*hasher_constructor_t
)(hash_algorithm_t algo
);
51 * Constructor function for pseudo random functions
53 typedef prf_t
* (*prf_constructor_t
)(pseudo_random_function_t algo
);
56 * Constructor function for source of randomness
58 typedef rng_t
* (*rng_constructor_t
)(rng_quality_t quality
);
61 * Constructor function for diffie hellman
63 typedef diffie_hellman_t
* (*dh_constructor_t
)(diffie_hellman_group_t group
);
66 * Handles crypto modules and creates instances.
68 struct crypto_factory_t
{
71 * Create a crypter instance.
73 * @param algo encryption algorithm
74 * @param key_size length of the key in bytes
75 * @return crypter_t instance, NULL if not supported
77 crypter_t
* (*create_crypter
)(crypto_factory_t
*this,
78 encryption_algorithm_t algo
, size_t key_size
);
81 * Create a symmetric signer instance.
83 * @param algo MAC algorithm to use
84 * @return signer_t instance, NULL if not supported
86 signer_t
* (*create_signer
)(crypto_factory_t
*this,
87 integrity_algorithm_t algo
);
90 * Create a hasher instance.
92 * @param algo hash algorithm
93 * @return hasher_t instance, NULL if not supported
95 hasher_t
* (*create_hasher
)(crypto_factory_t
*this, hash_algorithm_t algo
);
98 * Create a pseudo random function instance.
100 * @param algo PRF algorithm to use
101 * @return prf_t instance, NULL if not supported
103 prf_t
* (*create_prf
)(crypto_factory_t
*this, pseudo_random_function_t algo
);
106 * Create a source of randomness.
108 * @param quality required randomness quality
109 * @return rng_t instance, NULL if no RNG with such a quality
111 rng_t
* (*create_rng
)(crypto_factory_t
*this, rng_quality_t quality
);
114 * Create a diffie hellman instance.
116 * @param group diffie hellman group
117 * @return diffie_hellman_t instance, NULL if not supported
119 diffie_hellman_t
* (*create_dh
)(crypto_factory_t
*this,
120 diffie_hellman_group_t group
);
123 * Register a crypter constructor.
125 * @param algo algorithm to constructor
126 * @param create constructor function for that algorithm
129 void (*add_crypter
)(crypto_factory_t
*this, encryption_algorithm_t algo
,
130 crypter_constructor_t create
);
133 * Unregister a crypter constructor.
135 * @param create constructor function to unregister
137 void (*remove_crypter
)(crypto_factory_t
*this, crypter_constructor_t create
);
140 * Register a signer constructor.
142 * @param algo algorithm to constructor
143 * @param create constructor function for that algorithm
146 void (*add_signer
)(crypto_factory_t
*this, integrity_algorithm_t algo
,
147 signer_constructor_t create
);
150 * Unregister a signer constructor.
152 * @param create constructor function to unregister
154 void (*remove_signer
)(crypto_factory_t
*this, signer_constructor_t create
);
157 * Register a hasher constructor.
159 * The first added hasher is the preferred hasher returned on
160 * create_hasher(HASH_PREFERRED).
162 * @param algo algorithm to constructor
163 * @param create constructor function for that algorithm
166 void (*add_hasher
)(crypto_factory_t
*this, hash_algorithm_t algo
,
167 hasher_constructor_t create
);
170 * Unregister a hasher constructor.
172 * @param create constructor function to unregister
174 void (*remove_hasher
)(crypto_factory_t
*this, hasher_constructor_t create
);
177 * Register a prf constructor.
179 * @param algo algorithm to constructor
180 * @param create constructor function for that algorithm
183 void (*add_prf
)(crypto_factory_t
*this, pseudo_random_function_t algo
,
184 prf_constructor_t create
);
187 * Unregister a prf constructor.
189 * @param create constructor function to unregister
191 void (*remove_prf
)(crypto_factory_t
*this, prf_constructor_t create
);
194 * Register a source of randomness.
196 * @param quality quality of randomness this RNG serves
197 * @param create constructor function for such a quality
199 void (*add_rng
)(crypto_factory_t
*this, rng_quality_t quality
, rng_constructor_t create
);
202 * Unregister a source of randomness.
204 * @param create constructor function to unregister
206 void (*remove_rng
)(crypto_factory_t
*this, rng_constructor_t create
);
209 * Register a diffie hellman constructor.
211 * @param group dh group to constructor
212 * @param create constructor function for that algorithm
215 void (*add_dh
)(crypto_factory_t
*this, diffie_hellman_group_t group
,
216 dh_constructor_t create
);
219 * Unregister a diffie hellman constructor.
221 * @param create constructor function to unregister
223 void (*remove_dh
)(crypto_factory_t
*this, dh_constructor_t create
);
226 * Create an enumerator over all registered crypter algorithms.
228 * @return enumerator over encryption_algorithm_t
230 enumerator_t
* (*create_crypter_enumerator
)(crypto_factory_t
*this);
233 * Create an enumerator over all registered signer algorithms.
235 * @return enumerator over integrity_algorithm_t
237 enumerator_t
* (*create_signer_enumerator
)(crypto_factory_t
*this);
240 * Create an enumerator over all registered hasher algorithms.
242 * @return enumerator over hash_algorithm_t
244 enumerator_t
* (*create_hasher_enumerator
)(crypto_factory_t
*this);
247 * Create an enumerator over all registered PRFs.
249 * @return enumerator over pseudo_random_function_t
251 enumerator_t
* (*create_prf_enumerator
)(crypto_factory_t
*this);
254 * Create an enumerator over all registered diffie hellman groups.
256 * @return enumerator over diffie_hellman_group_t
258 enumerator_t
* (*create_dh_enumerator
)(crypto_factory_t
*this);
261 * Add a test vector to the crypto factory.
263 * @param type type of the test vector
264 * @param ... pointer to a test vector, defined in crypto_tester.h
266 void (*add_test_vector
)(crypto_factory_t
*this, transform_type_t type
, ...);
269 * Destroy a crypto_factory instance.
271 void (*destroy
)(crypto_factory_t
*this);
275 * Create a crypto_factory instance.
277 crypto_factory_t
*crypto_factory_create();
279 #endif /** CRYPTO_FACTORY_H_ @}*/