Annotation of embedaddon/strongswan/src/libstrongswan/crypto/crypto_tester.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2009 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_tester crypto_tester
19: * @{ @ingroup crypto
20: */
21:
22: #ifndef CRYPTO_TESTER_H_
23: #define CRYPTO_TESTER_H_
24:
25: typedef struct crypto_tester_t crypto_tester_t;
26:
27: #include <crypto/crypto_factory.h>
28:
29: typedef struct crypter_test_vector_t crypter_test_vector_t;
30: typedef struct aead_test_vector_t aead_test_vector_t;
31: typedef struct signer_test_vector_t signer_test_vector_t;
32: typedef struct hasher_test_vector_t hasher_test_vector_t;
33: typedef struct prf_test_vector_t prf_test_vector_t;
34: typedef struct xof_test_vector_t xof_test_vector_t;
35: typedef struct drbg_test_vector_t drbg_test_vector_t;
36: typedef struct rng_test_vector_t rng_test_vector_t;
37: typedef struct dh_test_vector_t dh_test_vector_t;
38:
39: struct crypter_test_vector_t {
40: /** encryption algorithm this vector tests */
41: encryption_algorithm_t alg;
42: /** key length to use, in bytes */
43: size_t key_size;
44: /** encryption key of test vector */
45: u_char *key;
46: /** initialization vector, using crypters blocksize bytes */
47: u_char *iv;
48: /** length of plain and cipher text */
49: size_t len;
50: /** plain text */
51: u_char *plain;
52: /** cipher text */
53: u_char *cipher;
54: };
55:
56: struct aead_test_vector_t {
57: /** encryption algorithm this vector tests */
58: encryption_algorithm_t alg;
59: /** key length to use, in bytes */
60: size_t key_size;
61: /** salt length to use, in bytes */
62: size_t salt_size;
63: /** encryption key of test vector */
64: u_char *key;
65: /** initialization vector, using crypters blocksize bytes */
66: u_char *iv;
67: /** length of associated data */
68: size_t alen;
69: /** associated data */
70: u_char *adata;
71: /** length of plain text */
72: size_t len;
73: /** plain text */
74: u_char *plain;
75: /** cipher text */
76: u_char *cipher;
77: };
78:
79: struct signer_test_vector_t {
80: /** signer algorithm this test vector tests */
81: integrity_algorithm_t alg;
82: /** key to use, with a length the algorithm expects */
83: u_char *key;
84: /** size of the input data */
85: size_t len;
86: /** input data */
87: u_char *data;
88: /** expected output, with output size of the tested algorithm */
89: u_char *mac;
90: };
91:
92: struct hasher_test_vector_t {
93: /** hash algorithm this test vector tests */
94: hash_algorithm_t alg;
95: /** length of the input data */
96: size_t len;
97: /** input data */
98: u_char *data;
99: /** expected hash, with hash size of the tested algorithm */
100: u_char *hash;
101: };
102:
103: struct prf_test_vector_t {
104: /** prf algorithm this test vector tests */
105: pseudo_random_function_t alg;
106: /** is this PRF stateful? */
107: bool stateful;
108: /** key length to use, in bytes */
109: size_t key_size;
110: /** key to use */
111: u_char *key;
112: /** size of the seed data */
113: size_t len;
114: /** seed data */
115: u_char *seed;
116: /** expected output, with block size of the tested algorithm */
117: u_char *out;
118: };
119:
120: struct xof_test_vector_t {
121: /** xof algorithm this test vector tests */
122: ext_out_function_t alg;
123: /** size of the seed data */
124: size_t len;
125: /** seed data */
126: u_char *seed;
127: /** size of the output */
128: size_t out_len;
129: /** expected output of size*/
130: u_char *out;
131: };
132:
133: struct drbg_test_vector_t {
134: /** drbg type this test vector tests */
135: drbg_type_t type;
136: /** security strength in bits */
137: uint32_t strength;
138: /** optional personalization string */
139: chunk_t personalization_str;
140: /** entropy_input | nonce | entropy_input_reseed */
141: chunk_t entropy;
142: /** returned output bits */
143: chunk_t out;
144: };
145:
146: /**
147: * Test vector for a RNG.
148: *
149: * Contains a callback function to analyze the output of a RNG,
150: */
151: struct rng_test_vector_t {
152: /** quality of random data this test vector tests */
153: rng_quality_t quality;
154: /** callback function to test RNG output, returns TRUE if data ok */
155: bool (*test)(void *user, chunk_t data);
156: /** number of bytes the function requests */
157: size_t len;
158: /** user data passed back to the test() function on invocation */
159: void *user;
160: };
161:
162: struct dh_test_vector_t {
163: /** diffie hellman group to test */
164: diffie_hellman_group_t group;
165: /** private value of alice */
166: u_char *priv_a;
167: /** private value of bob */
168: u_char *priv_b;
169: /** length of private values */
170: size_t priv_len;
171: /** expected public value of alice */
172: u_char *pub_a;
173: /** expected public value of bob */
174: u_char *pub_b;
175: /** size of public values */
176: size_t pub_len;
177: /** expected shared secret */
178: u_char *shared;
179: /** size of shared secret */
180: size_t shared_len;
181: };
182:
183: /**
184: * Cryptographic primitive testing framework.
185: */
186: struct crypto_tester_t {
187:
188: /**
189: * Test a crypter algorithm, optionally using a specified key size.
190: *
191: * @param alg algorithm to test
192: * @param key_size key size to test, 0 for default
193: * @param create constructor function for the crypter
194: * @param speed speed test result, NULL to omit
195: * @return TRUE if test passed
196: */
197: bool (*test_crypter)(crypto_tester_t *this, encryption_algorithm_t alg,
198: size_t key_size, crypter_constructor_t create,
199: u_int *speed, const char *plugin_name);
200:
201: /**
202: * Test an aead algorithm, optionally using a specified key size.
203: *
204: * @param alg algorithm to test
205: * @param key_size key size to test, 0 for default
206: * @param salt_size salt length to test, 0 for default
207: * @param create constructor function for the aead transform
208: * @param speed speed test result, NULL to omit
209: * @return TRUE if test passed
210: */
211: bool (*test_aead)(crypto_tester_t *this, encryption_algorithm_t alg,
212: size_t key_size, size_t salt_size,
213: aead_constructor_t create,
214: u_int *speed, const char *plugin_name);
215: /**
216: * Test a signer algorithm.
217: *
218: * @param alg algorithm to test
219: * @param create constructor function for the signer
220: * @param speed speed test result, NULL to omit
221: * @return TRUE if test passed
222: */
223: bool (*test_signer)(crypto_tester_t *this, integrity_algorithm_t alg,
224: signer_constructor_t create,
225: u_int *speed, const char *plugin_name);
226: /**
227: * Test a hasher algorithm.
228: *
229: * @param alg algorithm to test
230: * @param create constructor function for the hasher
231: * @param speed speed test result, NULL to omit
232: * @return TRUE if test passed
233: */
234: bool (*test_hasher)(crypto_tester_t *this, hash_algorithm_t alg,
235: hasher_constructor_t create,
236: u_int *speed, const char *plugin_name);
237: /**
238: * Test a PRF algorithm.
239: *
240: * @param alg algorithm to test
241: * @param create constructor function for the PRF
242: * @param speed speed test result, NULL to omit
243: * @return TRUE if test passed
244: */
245: bool (*test_prf)(crypto_tester_t *this, pseudo_random_function_t alg,
246: prf_constructor_t create,
247: u_int *speed, const char *plugin_name);
248: /**
249: * Test an XOF algorithm.
250: *
251: * @param alg algorithm to test
252: * @param create constructor function for the XOF
253: * @param speed speed test result, NULL to omit
254: * @return TRUE if test passed
255: */
256: bool (*test_xof)(crypto_tester_t *this, ext_out_function_t alg,
257: xof_constructor_t create,
258: u_int *speed, const char *plugin_name);
259: /**
260: * Test a DRBG type.
261: *
262: * @param type DRBG type to test
263: * @param create constructor function for the DRBG
264: * @param speed speed test result, NULL to omit
265: * @return TRUE if test passed
266: */
267: bool (*test_drbg)(crypto_tester_t *this, drbg_type_t type,
268: drbg_constructor_t create,
269: u_int *speed, const char *plugin_name);
270: /**
271: * Test a RNG implementation.
272: *
273: * @param alg algorithm to test
274: * @param create constructor function for the RNG
275: * @param speed speed test result, NULL to omit
276: * @return TRUE if test passed
277: */
278: bool (*test_rng)(crypto_tester_t *this, rng_quality_t quality,
279: rng_constructor_t create,
280: u_int *speed, const char *plugin_name);
281: /**
282: * Test a Diffie-Hellman implementation.
283: *
284: * @param group group to test
285: * @param create constructor function for the DH backend
286: * @param speed speed test result, NULL to omit
287: * @return TRUE if test passed
288: */
289: bool (*test_dh)(crypto_tester_t *this, diffie_hellman_group_t group,
290: dh_constructor_t create,
291: u_int *speed, const char *plugin_name);
292:
293: /**
294: * Add a test vector to test a crypter.
295: *
296: * @param vector pointer to test vector
297: */
298: void (*add_crypter_vector)(crypto_tester_t *this,
299: crypter_test_vector_t *vector);
300: /**
301: * Add a test vector to test an aead transform.
302: *
303: * @param vector pointer to test vector
304: */
305: void (*add_aead_vector)(crypto_tester_t *this,
306: aead_test_vector_t *vector);
307: /**
308: * Add a test vector to test a signer.
309: *
310: * @param vector pointer to test vector
311: */
312: void (*add_signer_vector)(crypto_tester_t *this,
313: signer_test_vector_t *vector);
314: /**
315: * Add a test vector to test a hasher.
316: *
317: * @param vector pointer to test vector
318: */
319: void (*add_hasher_vector)(crypto_tester_t *this,
320: hasher_test_vector_t *vector);
321: /**
322: * Add a test vector to test a PRF.
323: *
324: * @param vector pointer to test vector
325: */
326: void (*add_prf_vector)(crypto_tester_t *this, prf_test_vector_t *vector);
327:
328: /**
329: * Add a test vector to test an XOF.
330: *
331: * @param vector pointer to test vector
332: */
333: void (*add_xof_vector)(crypto_tester_t *this, xof_test_vector_t *vector);
334:
335: /**
336: * Add a test vector to test a DRBG.
337: *
338: * @param vector pointer to test vector
339: */
340: void (*add_drbg_vector)(crypto_tester_t *this, drbg_test_vector_t *vector);
341:
342: /**
343: * Add a test vector to test a RNG.
344: *
345: * @param vector pointer to test vector
346: */
347: void (*add_rng_vector)(crypto_tester_t *this, rng_test_vector_t *vector);
348:
349: /**
350: * Add a test vector to test a Diffie-Hellman backend.
351: *
352: * @param vector pointer to test vector
353: */
354: void (*add_dh_vector)(crypto_tester_t *this, dh_test_vector_t *vector);
355:
356: /**
357: * Destroy a crypto_tester_t.
358: */
359: void (*destroy)(crypto_tester_t *this);
360: };
361:
362: /**
363: * Create a crypto_tester instance.
364: */
365: crypto_tester_t *crypto_tester_create();
366:
367: #endif /** CRYPTO_TESTER_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>