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
23 #include "crypto_tester.h"
25 #include <utils/debug.h>
26 #include <collections/linked_list.h>
28 typedef struct private_crypto_tester_t private_crypto_tester_t
;
31 * Private data of an crypto_tester_t object.
33 struct private_crypto_tester_t
{
36 * Public crypto_tester_t interface.
38 crypto_tester_t
public;
41 * List of crypter test vectors
43 linked_list_t
*crypter
;
46 * List of aead test vectors
51 * List of signer test vectors
53 linked_list_t
*signer
;
56 * List of hasher test vectors
58 linked_list_t
*hasher
;
61 * List of PRF test vectors
66 * List of RNG test vectors
71 * Is a test vector required to pass a test?
76 * should we run RNG_TRUE tests? Enough entropy?
81 * time we test each algorithm
86 * size of buffer we use for benchmarking
92 * Get the name of a test vector, if available
94 static const char* get_name(void *sym
)
99 if (dladdr(sym
, &dli
))
101 return dli
.dli_sname
;
107 #if defined(CLOCK_THREAD_CPUTIME_ID) && defined(HAVE_CLOCK_GETTIME)
110 * Start a benchmark timer
112 static void start_timing(struct timespec
*start
)
114 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, start
);
118 * End a benchmark timer, return ms
120 static u_int
end_timing(struct timespec
*start
)
124 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, &end
);
125 return (end
.tv_nsec
- start
->tv_nsec
) / 1000000 +
126 (end
.tv_sec
- start
->tv_sec
) * 1000;
129 #else /* CLOCK_THREAD_CPUTIME_ID */
131 /* Make benchmarking a no-op if CLOCK_THREAD_CPUTIME_ID is not available */
132 #define start_timing(start) ((start)->tv_sec = 0, (start)->tv_nsec = 0)
133 #define end_timing(...) (this->bench_time)
135 #endif /* CLOCK_THREAD_CPUTIME_ID */
138 * Benchmark a crypter
140 static u_int
bench_crypter(private_crypto_tester_t
*this,
141 encryption_algorithm_t alg
, crypter_constructor_t create
)
145 crypter
= create(alg
, 0);
148 char iv
[crypter
->get_iv_size(crypter
)];
149 char key
[crypter
->get_key_size(crypter
)];
151 struct timespec start
;
154 memset(iv
, 0x56, sizeof(iv
));
155 memset(key
, 0x12, sizeof(key
));
156 if (!crypter
->set_key(crypter
, chunk_from_thing(key
)))
161 buf
= chunk_alloc(this->bench_size
);
162 memset(buf
.ptr
, 0x34, buf
.len
);
165 start_timing(&start
);
166 while (end_timing(&start
) < this->bench_time
)
168 if (crypter
->encrypt(crypter
, buf
, chunk_from_thing(iv
), NULL
))
172 if (crypter
->decrypt(crypter
, buf
, chunk_from_thing(iv
), NULL
))
178 crypter
->destroy(crypter
);
185 METHOD(crypto_tester_t
, test_crypter
, bool,
186 private_crypto_tester_t
*this, encryption_algorithm_t alg
, size_t key_size
,
187 crypter_constructor_t create
, u_int
*speed
, const char *plugin_name
)
189 enumerator_t
*enumerator
;
190 crypter_test_vector_t
*vector
;
194 enumerator
= this->crypter
->create_enumerator(this->crypter
);
195 while (enumerator
->enumerate(enumerator
, &vector
))
198 chunk_t key
, iv
, plain
= chunk_empty
, cipher
= chunk_empty
;
200 if (vector
->alg
!= alg
)
204 if (key_size
&& key_size
!= vector
->key_size
)
205 { /* test only vectors with a specific key size, if key size given */
209 crypter
= create(alg
, vector
->key_size
);
211 { /* key size not supported */
217 key
= chunk_create(vector
->key
, crypter
->get_key_size(crypter
));
218 if (!crypter
->set_key(crypter
, key
))
222 iv
= chunk_create(vector
->iv
, crypter
->get_iv_size(crypter
));
224 /* allocated encryption */
225 plain
= chunk_create(vector
->plain
, vector
->len
);
226 if (!crypter
->encrypt(crypter
, plain
, iv
, &cipher
))
230 if (!memeq(vector
->cipher
, cipher
.ptr
, cipher
.len
))
234 /* inline decryption */
235 if (!crypter
->decrypt(crypter
, cipher
, iv
, NULL
))
239 if (!memeq(vector
->plain
, cipher
.ptr
, cipher
.len
))
243 /* allocated decryption */
244 if (!crypter
->decrypt(crypter
,
245 chunk_create(vector
->cipher
, vector
->len
), iv
, &plain
))
249 if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
253 /* inline encryption */
254 if (!crypter
->encrypt(crypter
, plain
, iv
, NULL
))
258 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
))
265 crypter
->destroy(crypter
);
267 if (plain
.ptr
!= vector
->plain
)
273 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
274 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
278 enumerator
->destroy(enumerator
);
283 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
284 encryption_algorithm_names
, alg
, plugin_name
);
289 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
290 this->required ?
"disabled" : "enabled ",
291 encryption_algorithm_names
, alg
, plugin_name
);
292 return !this->required
;
299 *speed
= bench_crypter(this, alg
, create
);
300 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
301 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
305 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
306 encryption_algorithm_names
, alg
, plugin_name
, tested
);
313 * Benchmark an aead transform
315 static u_int
bench_aead(private_crypto_tester_t
*this,
316 encryption_algorithm_t alg
, aead_constructor_t create
)
320 aead
= create(alg
, 0, 0);
323 char iv
[aead
->get_iv_size(aead
)];
324 char key
[aead
->get_key_size(aead
)];
327 struct timespec start
;
331 memset(iv
, 0x56, sizeof(iv
));
332 memset(key
, 0x12, sizeof(key
));
333 memset(assoc
, 0x78, sizeof(assoc
));
334 if (!aead
->set_key(aead
, chunk_from_thing(key
)))
338 icv
= aead
->get_icv_size(aead
);
340 buf
= chunk_alloc(this->bench_size
+ icv
);
341 memset(buf
.ptr
, 0x34, buf
.len
);
345 start_timing(&start
);
346 while (end_timing(&start
) < this->bench_time
)
348 if (aead
->encrypt(aead
, buf
, chunk_from_thing(assoc
),
349 chunk_from_thing(iv
), NULL
))
353 if (aead
->decrypt(aead
, chunk_create(buf
.ptr
, buf
.len
+ icv
),
354 chunk_from_thing(assoc
), chunk_from_thing(iv
), NULL
))
367 METHOD(crypto_tester_t
, test_aead
, bool,
368 private_crypto_tester_t
*this, encryption_algorithm_t alg
, size_t key_size
,
369 size_t salt_size
, aead_constructor_t create
,
370 u_int
*speed
, const char *plugin_name
)
372 enumerator_t
*enumerator
;
373 aead_test_vector_t
*vector
;
377 enumerator
= this->aead
->create_enumerator(this->aead
);
378 while (enumerator
->enumerate(enumerator
, &vector
))
381 chunk_t key
, iv
, assoc
, plain
= chunk_empty
, cipher
= chunk_empty
;
384 if (vector
->alg
!= alg
)
388 if (key_size
&& key_size
!= vector
->key_size
)
389 { /* test only vectors with a specific key size, if key size given */
392 if (salt_size
&& salt_size
!= vector
->salt_size
)
399 aead
= create(alg
, vector
->key_size
, vector
->salt_size
);
402 DBG1(DBG_LIB
, "%N[%s]: %u bit key size not supported",
403 encryption_algorithm_names
, alg
, plugin_name
,
404 BITS_PER_BYTE
* vector
->key_size
);
408 key
= chunk_create(vector
->key
, aead
->get_key_size(aead
));
409 if (!aead
->set_key(aead
, key
))
413 iv
= chunk_create(vector
->iv
, aead
->get_iv_size(aead
));
414 assoc
= chunk_create(vector
->adata
, vector
->alen
);
415 icv
= aead
->get_icv_size(aead
);
417 /* allocated encryption */
418 plain
= chunk_create(vector
->plain
, vector
->len
);
419 if (!aead
->encrypt(aead
, plain
, assoc
, iv
, &cipher
))
423 if (!memeq(vector
->cipher
, cipher
.ptr
, cipher
.len
))
427 /* inline decryption */
428 if (!aead
->decrypt(aead
, cipher
, assoc
, iv
, NULL
))
432 if (!memeq(vector
->plain
, cipher
.ptr
, cipher
.len
- icv
))
436 /* allocated decryption */
437 if (!aead
->decrypt(aead
, chunk_create(vector
->cipher
, vector
->len
+ icv
),
442 if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
446 plain
.ptr
= realloc(plain
.ptr
, plain
.len
+ icv
);
447 /* inline encryption */
448 if (!aead
->encrypt(aead
, plain
, assoc
, iv
, NULL
))
452 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
+ icv
))
461 if (plain
.ptr
!= vector
->plain
)
467 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
468 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
472 enumerator
->destroy(enumerator
);
477 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
478 encryption_algorithm_names
, alg
, plugin_name
);
483 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
484 this->required ?
"disabled" : "enabled ",
485 encryption_algorithm_names
, alg
, plugin_name
);
486 return !this->required
;
493 *speed
= bench_aead(this, alg
, create
);
494 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
495 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
499 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
500 encryption_algorithm_names
, alg
, plugin_name
, tested
);
509 static u_int
bench_signer(private_crypto_tester_t
*this,
510 integrity_algorithm_t alg
, signer_constructor_t create
)
514 signer
= create(alg
);
517 char key
[signer
->get_key_size(signer
)];
518 char mac
[signer
->get_block_size(signer
)];
520 struct timespec start
;
523 memset(key
, 0x12, sizeof(key
));
524 if (!signer
->set_key(signer
, chunk_from_thing(key
)))
529 buf
= chunk_alloc(this->bench_size
);
530 memset(buf
.ptr
, 0x34, buf
.len
);
533 start_timing(&start
);
534 while (end_timing(&start
) < this->bench_time
)
536 if (signer
->get_signature(signer
, buf
, mac
))
540 if (signer
->verify_signature(signer
, buf
, chunk_from_thing(mac
)))
546 signer
->destroy(signer
);
553 METHOD(crypto_tester_t
, test_signer
, bool,
554 private_crypto_tester_t
*this, integrity_algorithm_t alg
,
555 signer_constructor_t create
, u_int
*speed
, const char *plugin_name
)
557 enumerator_t
*enumerator
;
558 signer_test_vector_t
*vector
;
562 enumerator
= this->signer
->create_enumerator(this->signer
);
563 while (enumerator
->enumerate(enumerator
, &vector
))
566 chunk_t key
, data
, mac
= chunk_empty
;
568 if (vector
->alg
!= alg
)
575 signer
= create(alg
);
578 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
579 integrity_algorithm_names
, alg
, plugin_name
);
583 data
= chunk_create(vector
->data
, vector
->len
);
584 key
= chunk_create(vector
->key
, signer
->get_key_size(signer
));
585 if (!signer
->set_key(signer
, key
))
589 /* do partial append mode and check if key gets set correctly */
590 if (!signer
->get_signature(signer
, data
, NULL
))
594 if (!signer
->set_key(signer
, key
))
598 /* allocated signature */
599 if (!signer
->allocate_signature(signer
, data
, &mac
))
603 if (mac
.len
!= signer
->get_block_size(signer
))
607 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
611 /* signature to existing buffer */
612 memset(mac
.ptr
, 0, mac
.len
);
613 if (!signer
->get_signature(signer
, data
, mac
.ptr
))
617 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
621 /* signature verification, good case */
622 if (!signer
->verify_signature(signer
, data
, mac
))
626 /* signature verification, bad case */
627 *(mac
.ptr
+ mac
.len
- 1) += 1;
628 if (signer
->verify_signature(signer
, data
, mac
))
632 /* signature to existing buffer, using append mode */
635 if (!signer
->allocate_signature(signer
,
636 chunk_create(data
.ptr
, 1), NULL
))
640 if (!signer
->get_signature(signer
,
641 chunk_create(data
.ptr
+ 1, 1), NULL
))
645 if (!signer
->verify_signature(signer
, chunk_skip(data
, 2),
646 chunk_create(vector
->mac
, mac
.len
)))
654 signer
->destroy(signer
);
658 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
659 integrity_algorithm_names
, alg
, plugin_name
, get_name(vector
));
663 enumerator
->destroy(enumerator
);
666 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
667 this->required ?
"disabled" : "enabled ",
668 integrity_algorithm_names
, alg
, plugin_name
);
669 return !this->required
;
675 *speed
= bench_signer(this, alg
, create
);
676 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
677 integrity_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
681 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
682 integrity_algorithm_names
, alg
, plugin_name
, tested
);
691 static u_int
bench_hasher(private_crypto_tester_t
*this,
692 hash_algorithm_t alg
, hasher_constructor_t create
)
696 hasher
= create(alg
);
699 char hash
[hasher
->get_hash_size(hasher
)];
701 struct timespec start
;
704 buf
= chunk_alloc(this->bench_size
);
705 memset(buf
.ptr
, 0x34, buf
.len
);
708 start_timing(&start
);
709 while (end_timing(&start
) < this->bench_time
)
711 if (hasher
->get_hash(hasher
, buf
, hash
))
717 hasher
->destroy(hasher
);
724 METHOD(crypto_tester_t
, test_hasher
, bool,
725 private_crypto_tester_t
*this, hash_algorithm_t alg
,
726 hasher_constructor_t create
, u_int
*speed
, const char *plugin_name
)
728 enumerator_t
*enumerator
;
729 hasher_test_vector_t
*vector
;
733 enumerator
= this->hasher
->create_enumerator(this->hasher
);
734 while (enumerator
->enumerate(enumerator
, &vector
))
739 if (vector
->alg
!= alg
)
746 hasher
= create(alg
);
749 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
750 hash_algorithm_names
, alg
, plugin_name
);
755 data
= chunk_create(vector
->data
, vector
->len
);
756 if (!hasher
->allocate_hash(hasher
, data
, &hash
))
760 if (hash
.len
!= hasher
->get_hash_size(hasher
))
764 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
768 /* hash to existing buffer, with a reset */
769 memset(hash
.ptr
, 0, hash
.len
);
770 if (!hasher
->get_hash(hasher
, data
, NULL
))
774 if (!hasher
->reset(hasher
))
778 if (!hasher
->get_hash(hasher
, data
, hash
.ptr
))
782 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
786 /* hasher to existing buffer, using append mode */
789 memset(hash
.ptr
, 0, hash
.len
);
790 if (!hasher
->allocate_hash(hasher
, chunk_create(data
.ptr
, 1), NULL
))
794 if (!hasher
->get_hash(hasher
, chunk_create(data
.ptr
+ 1, 1), NULL
))
798 if (!hasher
->get_hash(hasher
, chunk_skip(data
, 2), hash
.ptr
))
802 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
810 hasher
->destroy(hasher
);
814 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
815 hash_algorithm_names
, alg
, plugin_name
, get_name(vector
));
819 enumerator
->destroy(enumerator
);
822 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
823 this->required ?
"disabled" : "enabled ",
824 hash_algorithm_names
, alg
, plugin_name
);
825 return !this->required
;
831 *speed
= bench_hasher(this, alg
, create
);
832 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
833 hash_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
837 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
838 hash_algorithm_names
, alg
, plugin_name
, tested
);
847 static u_int
bench_prf(private_crypto_tester_t
*this,
848 pseudo_random_function_t alg
, prf_constructor_t create
)
855 char bytes
[prf
->get_block_size(prf
)], key
[prf
->get_block_size(prf
)];
857 struct timespec start
;
860 memset(key
, 0x56, prf
->get_block_size(prf
));
861 if (!prf
->set_key(prf
, chunk_create(key
, prf
->get_block_size(prf
))))
867 buf
= chunk_alloc(this->bench_size
);
868 memset(buf
.ptr
, 0x34, buf
.len
);
871 start_timing(&start
);
872 while (end_timing(&start
) < this->bench_time
)
874 if (prf
->get_bytes(prf
, buf
, bytes
))
887 METHOD(crypto_tester_t
, test_prf
, bool,
888 private_crypto_tester_t
*this, pseudo_random_function_t alg
,
889 prf_constructor_t create
, u_int
*speed
, const char *plugin_name
)
891 enumerator_t
*enumerator
;
892 prf_test_vector_t
*vector
;
896 enumerator
= this->prf
->create_enumerator(this->prf
);
897 while (enumerator
->enumerate(enumerator
, &vector
))
900 chunk_t key
, seed
, out
= chunk_empty
;
902 if (vector
->alg
!= alg
)
912 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
913 pseudo_random_function_names
, alg
, plugin_name
);
917 seed
= chunk_create(vector
->seed
, vector
->len
);
918 key
= chunk_create(vector
->key
, vector
->key_size
);
919 if (!prf
->set_key(prf
, key
))
923 if (alg
!= PRF_FIPS_SHA1_160
)
925 /* do partial append mode and check if key gets set correctly */
926 if (!prf
->get_bytes(prf
, seed
, NULL
))
930 if (!prf
->set_key(prf
, key
))
935 /* allocated bytes */
936 if (!prf
->allocate_bytes(prf
, seed
, &out
))
940 if (out
.len
!= prf
->get_block_size(prf
))
944 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
948 /* bytes to existing buffer */
949 memset(out
.ptr
, 0, out
.len
);
950 if (vector
->stateful
)
952 if (!prf
->set_key(prf
, key
))
957 if (!prf
->get_bytes(prf
, seed
, out
.ptr
))
961 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
965 /* bytes to existing buffer, using append mode */
966 if (alg
!= PRF_FIPS_SHA1_160
&& seed
.len
> 2)
968 memset(out
.ptr
, 0, out
.len
);
969 if (vector
->stateful
)
971 if (!prf
->set_key(prf
, key
))
976 if (!prf
->allocate_bytes(prf
, chunk_create(seed
.ptr
, 1), NULL
))
980 if (!prf
->get_bytes(prf
, chunk_create(seed
.ptr
+ 1, 1), NULL
))
984 if (!prf
->get_bytes(prf
, chunk_skip(seed
, 2), out
.ptr
))
988 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
1000 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
1001 pseudo_random_function_names
, alg
, plugin_name
, get_name(vector
));
1005 enumerator
->destroy(enumerator
);
1008 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
1009 this->required ?
"disabled" : "enabled ",
1010 pseudo_random_function_names
, alg
, plugin_name
);
1011 return !this->required
;
1017 *speed
= bench_prf(this, alg
, create
);
1018 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
1019 pseudo_random_function_names
, alg
, plugin_name
, tested
, *speed
);
1023 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
1024 pseudo_random_function_names
, alg
, plugin_name
, tested
);
1033 static u_int
bench_rng(private_crypto_tester_t
*this,
1034 rng_quality_t quality
, rng_constructor_t create
)
1038 rng
= create(quality
);
1041 struct timespec start
;
1046 buf
= chunk_alloc(this->bench_size
);
1047 start_timing(&start
);
1048 while (end_timing(&start
) < this->bench_time
)
1050 if (!rng
->get_bytes(rng
, buf
.len
, buf
.ptr
))
1065 METHOD(crypto_tester_t
, test_rng
, bool,
1066 private_crypto_tester_t
*this, rng_quality_t quality
,
1067 rng_constructor_t create
, u_int
*speed
, const char *plugin_name
)
1069 enumerator_t
*enumerator
;
1070 rng_test_vector_t
*vector
;
1071 bool failed
= FALSE
;
1074 if (!this->rng_true
&& quality
== RNG_TRUE
)
1076 DBG1(DBG_LIB
, "enabled %N[%s]: skipping test (disabled by config)",
1077 rng_quality_names
, quality
, plugin_name
);
1081 enumerator
= this->rng
->create_enumerator(this->rng
);
1082 while (enumerator
->enumerate(enumerator
, &vector
))
1084 chunk_t data
= chunk_empty
;
1087 if (vector
->quality
!= quality
)
1094 rng
= create(quality
);
1097 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
1098 rng_quality_names
, quality
, plugin_name
);
1102 /* allocated bytes */
1103 if (!rng
->allocate_bytes(rng
, vector
->len
, &data
) ||
1104 data
.len
!= vector
->len
||
1105 !vector
->test(vector
->user
, data
))
1109 /* write bytes into existing buffer */
1110 memset(data
.ptr
, 0, data
.len
);
1111 if (!rng
->get_bytes(rng
, vector
->len
, data
.ptr
))
1115 if (!vector
->test(vector
->user
, data
))
1126 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
1127 rng_quality_names
, quality
, plugin_name
, get_name(vector
));
1131 enumerator
->destroy(enumerator
);
1134 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
1135 this->required ?
", disabled" : "enabled ",
1136 rng_quality_names
, quality
, plugin_name
);
1137 return !this->required
;
1143 *speed
= bench_rng(this, quality
, create
);
1144 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
1145 rng_quality_names
, quality
, plugin_name
, tested
, *speed
);
1149 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
1150 rng_quality_names
, quality
, plugin_name
, tested
);
1156 METHOD(crypto_tester_t
, add_crypter_vector
, void,
1157 private_crypto_tester_t
*this, crypter_test_vector_t
*vector
)
1159 this->crypter
->insert_last(this->crypter
, vector
);
1162 METHOD(crypto_tester_t
, add_aead_vector
, void,
1163 private_crypto_tester_t
*this, aead_test_vector_t
*vector
)
1165 this->aead
->insert_last(this->aead
, vector
);
1168 METHOD(crypto_tester_t
, add_signer_vector
, void,
1169 private_crypto_tester_t
*this, signer_test_vector_t
*vector
)
1171 this->signer
->insert_last(this->signer
, vector
);
1174 METHOD(crypto_tester_t
, add_hasher_vector
, void,
1175 private_crypto_tester_t
*this, hasher_test_vector_t
*vector
)
1177 this->hasher
->insert_last(this->hasher
, vector
);
1180 METHOD(crypto_tester_t
, add_prf_vector
, void,
1181 private_crypto_tester_t
*this, prf_test_vector_t
*vector
)
1183 this->prf
->insert_last(this->prf
, vector
);
1186 METHOD(crypto_tester_t
, add_rng_vector
, void,
1187 private_crypto_tester_t
*this, rng_test_vector_t
*vector
)
1189 this->rng
->insert_last(this->rng
, vector
);
1192 METHOD(crypto_tester_t
, destroy
, void,
1193 private_crypto_tester_t
*this)
1195 this->crypter
->destroy(this->crypter
);
1196 this->aead
->destroy(this->aead
);
1197 this->signer
->destroy(this->signer
);
1198 this->hasher
->destroy(this->hasher
);
1199 this->prf
->destroy(this->prf
);
1200 this->rng
->destroy(this->rng
);
1207 crypto_tester_t
*crypto_tester_create()
1209 private_crypto_tester_t
*this;
1213 .test_crypter
= _test_crypter
,
1214 .test_aead
= _test_aead
,
1215 .test_signer
= _test_signer
,
1216 .test_hasher
= _test_hasher
,
1217 .test_prf
= _test_prf
,
1218 .test_rng
= _test_rng
,
1219 .add_crypter_vector
= _add_crypter_vector
,
1220 .add_aead_vector
= _add_aead_vector
,
1221 .add_signer_vector
= _add_signer_vector
,
1222 .add_hasher_vector
= _add_hasher_vector
,
1223 .add_prf_vector
= _add_prf_vector
,
1224 .add_rng_vector
= _add_rng_vector
,
1225 .destroy
= _destroy
,
1227 .crypter
= linked_list_create(),
1228 .aead
= linked_list_create(),
1229 .signer
= linked_list_create(),
1230 .hasher
= linked_list_create(),
1231 .prf
= linked_list_create(),
1232 .rng
= linked_list_create(),
1234 .required
= lib
->settings
->get_bool(lib
->settings
,
1235 "%s.crypto_test.required", FALSE
, lib
->ns
),
1236 .rng_true
= lib
->settings
->get_bool(lib
->settings
,
1237 "%s.crypto_test.rng_true", FALSE
, lib
->ns
),
1238 .bench_time
= lib
->settings
->get_int(lib
->settings
,
1239 "%s.crypto_test.bench_time", 50, lib
->ns
),
1240 .bench_size
= lib
->settings
->get_int(lib
->settings
,
1241 "%s.crypto_test.bench_size", 1024, lib
->ns
),
1244 /* enforce a block size of 16, should be fine for all algorithms */
1245 this->bench_size
= this->bench_size
/ 16 * 16;
1247 return &this->public;