2 * Copyright (C) 2009-2010 Martin Willi
3 * Hochschule fuer Technik Rapperswil
4 * Copyright (C) 2010 revosec AG
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>.
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
21 #include "crypto_tester.h"
23 #include <utils/debug.h>
24 #include <collections/linked_list.h>
26 typedef struct private_crypto_tester_t private_crypto_tester_t
;
29 * Private data of an crypto_tester_t object.
31 struct private_crypto_tester_t
{
34 * Public crypto_tester_t interface.
36 crypto_tester_t
public;
39 * List of crypter test vectors
41 linked_list_t
*crypter
;
44 * List of aead test vectors
49 * List of signer test vectors
51 linked_list_t
*signer
;
54 * List of hasher test vectors
56 linked_list_t
*hasher
;
59 * List of PRF test vectors
64 * List of RNG test vectors
69 * Is a test vector required to pass a test?
74 * should we run RNG_TRUE tests? Enough entropy?
79 * time we test each algorithm
84 * size of buffer we use for benchmarking
90 * Get the name of a test vector, if available
92 static const char* get_name(void *sym
)
97 if (dladdr(sym
, &dli
))
105 #ifdef CLOCK_THREAD_CPUTIME_ID
108 * Start a benchmark timer
110 static void start_timing(struct timespec
*start
)
112 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, start
);
116 * End a benchmark timer, return ms
118 static u_int
end_timing(struct timespec
*start
)
122 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, &end
);
123 return (end
.tv_nsec
- start
->tv_nsec
) / 1000000 +
124 (end
.tv_sec
- start
->tv_sec
) * 1000;
127 #else /* CLOCK_THREAD_CPUTIME_ID */
129 /* Make benchmarking a no-op if CLOCK_THREAD_CPUTIME_ID is not available */
130 #define start_timing(start) ((start)->tv_sec = 0, (start)->tv_nsec = 0)
131 #define end_timing(...) (this->bench_time)
133 #endif /* CLOCK_THREAD_CPUTIME_ID */
136 * Benchmark a crypter
138 static u_int
bench_crypter(private_crypto_tester_t
*this,
139 encryption_algorithm_t alg
, crypter_constructor_t create
)
143 crypter
= create(alg
, 0);
146 char iv
[crypter
->get_iv_size(crypter
)];
147 char key
[crypter
->get_key_size(crypter
)];
149 struct timespec start
;
152 memset(iv
, 0x56, sizeof(iv
));
153 memset(key
, 0x12, sizeof(key
));
154 if (!crypter
->set_key(crypter
, chunk_from_thing(key
)))
159 buf
= chunk_alloc(this->bench_size
);
160 memset(buf
.ptr
, 0x34, buf
.len
);
163 start_timing(&start
);
164 while (end_timing(&start
) < this->bench_time
)
166 if (crypter
->encrypt(crypter
, buf
, chunk_from_thing(iv
), NULL
))
170 if (crypter
->decrypt(crypter
, buf
, chunk_from_thing(iv
), NULL
))
176 crypter
->destroy(crypter
);
183 METHOD(crypto_tester_t
, test_crypter
, bool,
184 private_crypto_tester_t
*this, encryption_algorithm_t alg
, size_t key_size
,
185 crypter_constructor_t create
, u_int
*speed
, const char *plugin_name
)
187 enumerator_t
*enumerator
;
188 crypter_test_vector_t
*vector
;
192 enumerator
= this->crypter
->create_enumerator(this->crypter
);
193 while (enumerator
->enumerate(enumerator
, &vector
))
196 chunk_t key
, iv
, plain
= chunk_empty
, cipher
= chunk_empty
;
198 if (vector
->alg
!= alg
)
202 if (key_size
&& key_size
!= vector
->key_size
)
203 { /* test only vectors with a specific key size, if key size given */
207 crypter
= create(alg
, vector
->key_size
);
209 { /* key size not supported */
215 key
= chunk_create(vector
->key
, crypter
->get_key_size(crypter
));
216 if (!crypter
->set_key(crypter
, key
))
220 iv
= chunk_create(vector
->iv
, crypter
->get_iv_size(crypter
));
222 /* allocated encryption */
223 plain
= chunk_create(vector
->plain
, vector
->len
);
224 if (!crypter
->encrypt(crypter
, plain
, iv
, &cipher
))
228 if (!memeq(vector
->cipher
, cipher
.ptr
, cipher
.len
))
232 /* inline decryption */
233 if (!crypter
->decrypt(crypter
, cipher
, iv
, NULL
))
237 if (!memeq(vector
->plain
, cipher
.ptr
, cipher
.len
))
241 /* allocated decryption */
242 if (!crypter
->decrypt(crypter
,
243 chunk_create(vector
->cipher
, vector
->len
), iv
, &plain
))
247 if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
251 /* inline encryption */
252 if (!crypter
->encrypt(crypter
, plain
, iv
, NULL
))
256 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
))
263 crypter
->destroy(crypter
);
265 if (plain
.ptr
!= vector
->plain
)
271 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
272 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
276 enumerator
->destroy(enumerator
);
281 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
282 encryption_algorithm_names
, alg
, plugin_name
);
287 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
288 this->required ?
"disabled" : "enabled ",
289 encryption_algorithm_names
, alg
, plugin_name
);
290 return !this->required
;
297 *speed
= bench_crypter(this, alg
, create
);
298 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
299 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
303 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
304 encryption_algorithm_names
, alg
, plugin_name
, tested
);
311 * Benchmark an aead transform
313 static u_int
bench_aead(private_crypto_tester_t
*this,
314 encryption_algorithm_t alg
, aead_constructor_t create
)
318 aead
= create(alg
, 0);
321 char iv
[aead
->get_iv_size(aead
)];
322 char key
[aead
->get_key_size(aead
)];
325 struct timespec start
;
329 memset(iv
, 0x56, sizeof(iv
));
330 memset(key
, 0x12, sizeof(key
));
331 memset(assoc
, 0x78, sizeof(assoc
));
332 if (!aead
->set_key(aead
, chunk_from_thing(key
)))
336 icv
= aead
->get_icv_size(aead
);
338 buf
= chunk_alloc(this->bench_size
+ icv
);
339 memset(buf
.ptr
, 0x34, buf
.len
);
343 start_timing(&start
);
344 while (end_timing(&start
) < this->bench_time
)
346 if (aead
->encrypt(aead
, buf
, chunk_from_thing(assoc
),
347 chunk_from_thing(iv
), NULL
))
351 if (aead
->decrypt(aead
, chunk_create(buf
.ptr
, buf
.len
+ icv
),
352 chunk_from_thing(assoc
), chunk_from_thing(iv
), NULL
))
365 METHOD(crypto_tester_t
, test_aead
, bool,
366 private_crypto_tester_t
*this, encryption_algorithm_t alg
, size_t key_size
,
367 aead_constructor_t create
, u_int
*speed
, const char *plugin_name
)
369 enumerator_t
*enumerator
;
370 aead_test_vector_t
*vector
;
374 enumerator
= this->aead
->create_enumerator(this->aead
);
375 while (enumerator
->enumerate(enumerator
, &vector
))
378 chunk_t key
, iv
, assoc
, plain
= chunk_empty
, cipher
= chunk_empty
;
381 if (vector
->alg
!= alg
)
385 if (key_size
&& key_size
!= vector
->key_size
)
386 { /* test only vectors with a specific key size, if key size given */
392 aead
= create(alg
, vector
->key_size
);
395 DBG1(DBG_LIB
, "%N[%s]: %u bit key size not supported",
396 encryption_algorithm_names
, alg
, plugin_name
,
397 BITS_PER_BYTE
* vector
->key_size
);
401 key
= chunk_create(vector
->key
, aead
->get_key_size(aead
));
402 if (!aead
->set_key(aead
, key
))
406 iv
= chunk_create(vector
->iv
, aead
->get_iv_size(aead
));
407 assoc
= chunk_create(vector
->adata
, vector
->alen
);
408 icv
= aead
->get_icv_size(aead
);
410 /* allocated encryption */
411 plain
= chunk_create(vector
->plain
, vector
->len
);
412 if (!aead
->encrypt(aead
, plain
, assoc
, iv
, &cipher
))
416 if (!memeq(vector
->cipher
, cipher
.ptr
, cipher
.len
))
420 /* inline decryption */
421 if (!aead
->decrypt(aead
, cipher
, assoc
, iv
, NULL
))
425 if (!memeq(vector
->plain
, cipher
.ptr
, cipher
.len
- icv
))
429 /* allocated decryption */
430 if (!aead
->decrypt(aead
, chunk_create(vector
->cipher
, vector
->len
+ icv
),
435 if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
439 plain
.ptr
= realloc(plain
.ptr
, plain
.len
+ icv
);
440 /* inline encryption */
441 if (!aead
->encrypt(aead
, plain
, assoc
, iv
, NULL
))
445 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
+ icv
))
454 if (plain
.ptr
!= vector
->plain
)
460 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
461 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
465 enumerator
->destroy(enumerator
);
470 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
471 encryption_algorithm_names
, alg
, plugin_name
);
476 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
477 this->required ?
"disabled" : "enabled ",
478 encryption_algorithm_names
, alg
, plugin_name
);
479 return !this->required
;
486 *speed
= bench_aead(this, alg
, create
);
487 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
488 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
492 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
493 encryption_algorithm_names
, alg
, plugin_name
, tested
);
502 static u_int
bench_signer(private_crypto_tester_t
*this,
503 integrity_algorithm_t alg
, signer_constructor_t create
)
507 signer
= create(alg
);
510 char key
[signer
->get_key_size(signer
)];
511 char mac
[signer
->get_block_size(signer
)];
513 struct timespec start
;
516 memset(key
, 0x12, sizeof(key
));
517 if (!signer
->set_key(signer
, chunk_from_thing(key
)))
522 buf
= chunk_alloc(this->bench_size
);
523 memset(buf
.ptr
, 0x34, buf
.len
);
526 start_timing(&start
);
527 while (end_timing(&start
) < this->bench_time
)
529 if (signer
->get_signature(signer
, buf
, mac
))
533 if (signer
->verify_signature(signer
, buf
, chunk_from_thing(mac
)))
539 signer
->destroy(signer
);
546 METHOD(crypto_tester_t
, test_signer
, bool,
547 private_crypto_tester_t
*this, integrity_algorithm_t alg
,
548 signer_constructor_t create
, u_int
*speed
, const char *plugin_name
)
550 enumerator_t
*enumerator
;
551 signer_test_vector_t
*vector
;
555 enumerator
= this->signer
->create_enumerator(this->signer
);
556 while (enumerator
->enumerate(enumerator
, &vector
))
559 chunk_t key
, data
, mac
= chunk_empty
;
561 if (vector
->alg
!= alg
)
568 signer
= create(alg
);
571 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
572 integrity_algorithm_names
, alg
, plugin_name
);
576 key
= chunk_create(vector
->key
, signer
->get_key_size(signer
));
577 if (!signer
->set_key(signer
, key
))
581 /* allocated signature */
582 data
= chunk_create(vector
->data
, vector
->len
);
583 if (!signer
->allocate_signature(signer
, data
, &mac
))
587 if (mac
.len
!= signer
->get_block_size(signer
))
591 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
595 /* signature to existing buffer */
596 memset(mac
.ptr
, 0, mac
.len
);
597 if (!signer
->get_signature(signer
, data
, mac
.ptr
))
601 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
605 /* signature verification, good case */
606 if (!signer
->verify_signature(signer
, data
, mac
))
610 /* signature verification, bad case */
611 *(mac
.ptr
+ mac
.len
- 1) += 1;
612 if (signer
->verify_signature(signer
, data
, mac
))
616 /* signature to existing buffer, using append mode */
619 if (!signer
->allocate_signature(signer
,
620 chunk_create(data
.ptr
, 1), NULL
))
624 if (!signer
->get_signature(signer
,
625 chunk_create(data
.ptr
+ 1, 1), NULL
))
629 if (!signer
->verify_signature(signer
, chunk_skip(data
, 2),
630 chunk_create(vector
->mac
, mac
.len
)))
638 signer
->destroy(signer
);
642 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
643 integrity_algorithm_names
, alg
, plugin_name
, get_name(vector
));
647 enumerator
->destroy(enumerator
);
650 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
651 this->required ?
"disabled" : "enabled ",
652 integrity_algorithm_names
, alg
, plugin_name
);
653 return !this->required
;
659 *speed
= bench_signer(this, alg
, create
);
660 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
661 integrity_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
665 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
666 integrity_algorithm_names
, alg
, plugin_name
, tested
);
675 static u_int
bench_hasher(private_crypto_tester_t
*this,
676 hash_algorithm_t alg
, hasher_constructor_t create
)
680 hasher
= create(alg
);
683 char hash
[hasher
->get_hash_size(hasher
)];
685 struct timespec start
;
688 buf
= chunk_alloc(this->bench_size
);
689 memset(buf
.ptr
, 0x34, buf
.len
);
692 start_timing(&start
);
693 while (end_timing(&start
) < this->bench_time
)
695 if (hasher
->get_hash(hasher
, buf
, hash
))
701 hasher
->destroy(hasher
);
708 METHOD(crypto_tester_t
, test_hasher
, bool,
709 private_crypto_tester_t
*this, hash_algorithm_t alg
,
710 hasher_constructor_t create
, u_int
*speed
, const char *plugin_name
)
712 enumerator_t
*enumerator
;
713 hasher_test_vector_t
*vector
;
717 enumerator
= this->hasher
->create_enumerator(this->hasher
);
718 while (enumerator
->enumerate(enumerator
, &vector
))
723 if (vector
->alg
!= alg
)
730 hasher
= create(alg
);
733 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
734 hash_algorithm_names
, alg
, plugin_name
);
739 data
= chunk_create(vector
->data
, vector
->len
);
740 if (!hasher
->allocate_hash(hasher
, data
, &hash
))
744 if (hash
.len
!= hasher
->get_hash_size(hasher
))
748 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
752 /* hash to existing buffer, with a reset */
753 memset(hash
.ptr
, 0, hash
.len
);
754 if (!hasher
->get_hash(hasher
, data
, NULL
))
758 if (!hasher
->reset(hasher
))
762 if (!hasher
->get_hash(hasher
, data
, hash
.ptr
))
766 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
770 /* hasher to existing buffer, using append mode */
773 memset(hash
.ptr
, 0, hash
.len
);
774 if (!hasher
->allocate_hash(hasher
, chunk_create(data
.ptr
, 1), NULL
))
778 if (!hasher
->get_hash(hasher
, chunk_create(data
.ptr
+ 1, 1), NULL
))
782 if (!hasher
->get_hash(hasher
, chunk_skip(data
, 2), hash
.ptr
))
786 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
794 hasher
->destroy(hasher
);
798 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
799 hash_algorithm_names
, alg
, plugin_name
, get_name(vector
));
803 enumerator
->destroy(enumerator
);
806 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
807 this->required ?
"disabled" : "enabled ",
808 hash_algorithm_names
, alg
, plugin_name
);
809 return !this->required
;
815 *speed
= bench_hasher(this, alg
, create
);
816 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
817 hash_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
821 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
822 hash_algorithm_names
, alg
, plugin_name
, tested
);
831 static u_int
bench_prf(private_crypto_tester_t
*this,
832 pseudo_random_function_t alg
, prf_constructor_t create
)
839 char bytes
[prf
->get_block_size(prf
)], key
[prf
->get_block_size(prf
)];
841 struct timespec start
;
844 memset(key
, 0x56, prf
->get_block_size(prf
));
845 if (!prf
->set_key(prf
, chunk_create(key
, prf
->get_block_size(prf
))))
851 buf
= chunk_alloc(this->bench_size
);
852 memset(buf
.ptr
, 0x34, buf
.len
);
855 start_timing(&start
);
856 while (end_timing(&start
) < this->bench_time
)
858 if (prf
->get_bytes(prf
, buf
, bytes
))
871 METHOD(crypto_tester_t
, test_prf
, bool,
872 private_crypto_tester_t
*this, pseudo_random_function_t alg
,
873 prf_constructor_t create
, u_int
*speed
, const char *plugin_name
)
875 enumerator_t
*enumerator
;
876 prf_test_vector_t
*vector
;
880 enumerator
= this->prf
->create_enumerator(this->prf
);
881 while (enumerator
->enumerate(enumerator
, &vector
))
884 chunk_t key
, seed
, out
= chunk_empty
;
886 if (vector
->alg
!= alg
)
896 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
897 pseudo_random_function_names
, alg
, plugin_name
);
901 key
= chunk_create(vector
->key
, vector
->key_size
);
902 if (!prf
->set_key(prf
, key
))
906 /* allocated bytes */
907 seed
= chunk_create(vector
->seed
, vector
->len
);
908 if (!prf
->allocate_bytes(prf
, seed
, &out
))
912 if (out
.len
!= prf
->get_block_size(prf
))
916 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
920 /* bytes to existing buffer */
921 memset(out
.ptr
, 0, out
.len
);
922 if (vector
->stateful
)
924 if (!prf
->set_key(prf
, key
))
929 if (!prf
->get_bytes(prf
, seed
, out
.ptr
))
933 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
937 /* bytes to existing buffer, using append mode */
940 memset(out
.ptr
, 0, out
.len
);
941 if (vector
->stateful
)
943 if (!prf
->set_key(prf
, key
))
948 if (!prf
->allocate_bytes(prf
, chunk_create(seed
.ptr
, 1), NULL
))
952 if (!prf
->get_bytes(prf
, chunk_create(seed
.ptr
+ 1, 1), NULL
))
956 if (!prf
->get_bytes(prf
, chunk_skip(seed
, 2), out
.ptr
))
960 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
972 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
973 pseudo_random_function_names
, alg
, plugin_name
, get_name(vector
));
977 enumerator
->destroy(enumerator
);
980 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
981 this->required ?
"disabled" : "enabled ",
982 pseudo_random_function_names
, alg
, plugin_name
);
983 return !this->required
;
989 *speed
= bench_prf(this, alg
, create
);
990 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
991 pseudo_random_function_names
, alg
, plugin_name
, tested
, *speed
);
995 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
996 pseudo_random_function_names
, alg
, plugin_name
, tested
);
1005 static u_int
bench_rng(private_crypto_tester_t
*this,
1006 rng_quality_t quality
, rng_constructor_t create
)
1010 rng
= create(quality
);
1013 struct timespec start
;
1018 buf
= chunk_alloc(this->bench_size
);
1019 start_timing(&start
);
1020 while (end_timing(&start
) < this->bench_time
)
1022 if (!rng
->get_bytes(rng
, buf
.len
, buf
.ptr
))
1037 METHOD(crypto_tester_t
, test_rng
, bool,
1038 private_crypto_tester_t
*this, rng_quality_t quality
,
1039 rng_constructor_t create
, u_int
*speed
, const char *plugin_name
)
1041 enumerator_t
*enumerator
;
1042 rng_test_vector_t
*vector
;
1043 bool failed
= FALSE
;
1046 if (!this->rng_true
&& quality
== RNG_TRUE
)
1048 DBG1(DBG_LIB
, "enabled %N[%s]: skipping test (disabled by config)",
1049 rng_quality_names
, quality
, plugin_name
);
1053 enumerator
= this->rng
->create_enumerator(this->rng
);
1054 while (enumerator
->enumerate(enumerator
, &vector
))
1056 chunk_t data
= chunk_empty
;
1059 if (vector
->quality
!= quality
)
1066 rng
= create(quality
);
1069 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
1070 rng_quality_names
, quality
, plugin_name
);
1074 /* allocated bytes */
1075 if (!rng
->allocate_bytes(rng
, vector
->len
, &data
) ||
1076 data
.len
!= vector
->len
||
1077 !vector
->test(vector
->user
, data
))
1081 /* write bytes into existing buffer */
1082 memset(data
.ptr
, 0, data
.len
);
1083 if (!rng
->get_bytes(rng
, vector
->len
, data
.ptr
))
1087 if (!vector
->test(vector
->user
, data
))
1098 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
1099 rng_quality_names
, quality
, plugin_name
, get_name(vector
));
1103 enumerator
->destroy(enumerator
);
1106 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
1107 this->required ?
", disabled" : "enabled ",
1108 rng_quality_names
, quality
, plugin_name
);
1109 return !this->required
;
1115 *speed
= bench_rng(this, quality
, create
);
1116 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
1117 rng_quality_names
, quality
, plugin_name
, tested
, *speed
);
1121 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
1122 rng_quality_names
, quality
, plugin_name
, tested
);
1128 METHOD(crypto_tester_t
, add_crypter_vector
, void,
1129 private_crypto_tester_t
*this, crypter_test_vector_t
*vector
)
1131 this->crypter
->insert_last(this->crypter
, vector
);
1134 METHOD(crypto_tester_t
, add_aead_vector
, void,
1135 private_crypto_tester_t
*this, aead_test_vector_t
*vector
)
1137 this->aead
->insert_last(this->aead
, vector
);
1140 METHOD(crypto_tester_t
, add_signer_vector
, void,
1141 private_crypto_tester_t
*this, signer_test_vector_t
*vector
)
1143 this->signer
->insert_last(this->signer
, vector
);
1146 METHOD(crypto_tester_t
, add_hasher_vector
, void,
1147 private_crypto_tester_t
*this, hasher_test_vector_t
*vector
)
1149 this->hasher
->insert_last(this->hasher
, vector
);
1152 METHOD(crypto_tester_t
, add_prf_vector
, void,
1153 private_crypto_tester_t
*this, prf_test_vector_t
*vector
)
1155 this->prf
->insert_last(this->prf
, vector
);
1158 METHOD(crypto_tester_t
, add_rng_vector
, void,
1159 private_crypto_tester_t
*this, rng_test_vector_t
*vector
)
1161 this->rng
->insert_last(this->rng
, vector
);
1164 METHOD(crypto_tester_t
, destroy
, void,
1165 private_crypto_tester_t
*this)
1167 this->crypter
->destroy(this->crypter
);
1168 this->aead
->destroy(this->aead
);
1169 this->signer
->destroy(this->signer
);
1170 this->hasher
->destroy(this->hasher
);
1171 this->prf
->destroy(this->prf
);
1172 this->rng
->destroy(this->rng
);
1179 crypto_tester_t
*crypto_tester_create()
1181 private_crypto_tester_t
*this;
1185 .test_crypter
= _test_crypter
,
1186 .test_aead
= _test_aead
,
1187 .test_signer
= _test_signer
,
1188 .test_hasher
= _test_hasher
,
1189 .test_prf
= _test_prf
,
1190 .test_rng
= _test_rng
,
1191 .add_crypter_vector
= _add_crypter_vector
,
1192 .add_aead_vector
= _add_aead_vector
,
1193 .add_signer_vector
= _add_signer_vector
,
1194 .add_hasher_vector
= _add_hasher_vector
,
1195 .add_prf_vector
= _add_prf_vector
,
1196 .add_rng_vector
= _add_rng_vector
,
1197 .destroy
= _destroy
,
1199 .crypter
= linked_list_create(),
1200 .aead
= linked_list_create(),
1201 .signer
= linked_list_create(),
1202 .hasher
= linked_list_create(),
1203 .prf
= linked_list_create(),
1204 .rng
= linked_list_create(),
1206 .required
= lib
->settings
->get_bool(lib
->settings
,
1207 "%s.crypto_test.required", FALSE
, lib
->ns
),
1208 .rng_true
= lib
->settings
->get_bool(lib
->settings
,
1209 "%s.crypto_test.rng_true", FALSE
, lib
->ns
),
1210 .bench_time
= lib
->settings
->get_int(lib
->settings
,
1211 "%s.crypto_test.bench_time", 50, lib
->ns
),
1212 .bench_size
= lib
->settings
->get_int(lib
->settings
,
1213 "%s.crypto_test.bench_size", 1024, lib
->ns
),
1216 /* enforce a block size of 16, should be fine for all algorithms */
1217 this->bench_size
= this->bench_size
/ 16 * 16;
1219 return &this->public;