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"
24 #include <utils/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
, plain
, cipher
, iv
;
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 */
206 crypter
= create(alg
, vector
->key_size
);
209 DBG1(DBG_LIB
, "%N[%s]: %u bit key size not supported",
210 encryption_algorithm_names
, alg
, plugin_name
,
211 BITS_PER_BYTE
* vector
->key_size
);
219 key
= chunk_create(vector
->key
, crypter
->get_key_size(crypter
));
220 if (!crypter
->set_key(crypter
, key
))
224 iv
= chunk_create(vector
->iv
, crypter
->get_iv_size(crypter
));
226 /* allocated encryption */
227 plain
= chunk_create(vector
->plain
, vector
->len
);
228 if (!crypter
->encrypt(crypter
, plain
, iv
, &cipher
))
232 if (!memeq(vector
->cipher
, cipher
.ptr
, cipher
.len
))
236 /* inline decryption */
237 if (!crypter
->decrypt(crypter
, cipher
, iv
, NULL
))
241 if (!memeq(vector
->plain
, cipher
.ptr
, cipher
.len
))
246 /* allocated decryption */
247 cipher
= chunk_create(vector
->cipher
, vector
->len
);
248 if (!crypter
->decrypt(crypter
, cipher
, iv
, &plain
))
252 if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
256 /* inline encryption */
257 if (!crypter
->encrypt(crypter
, plain
, iv
, NULL
))
261 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
))
267 crypter
->destroy(crypter
);
270 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
271 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
275 enumerator
->destroy(enumerator
);
280 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
281 encryption_algorithm_names
, alg
, plugin_name
);
286 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
287 this->required ?
"disabled" : "enabled ",
288 encryption_algorithm_names
, alg
, plugin_name
);
289 return !this->required
;
296 *speed
= bench_crypter(this, alg
, create
);
297 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
298 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
302 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
303 encryption_algorithm_names
, alg
, plugin_name
, tested
);
310 * Benchmark an aead transform
312 static u_int
bench_aead(private_crypto_tester_t
*this,
313 encryption_algorithm_t alg
, aead_constructor_t create
)
317 aead
= create(alg
, 0);
320 char iv
[aead
->get_iv_size(aead
)];
321 char key
[aead
->get_key_size(aead
)];
324 struct timespec start
;
328 memset(iv
, 0x56, sizeof(iv
));
329 memset(key
, 0x12, sizeof(key
));
330 memset(assoc
, 0x78, sizeof(assoc
));
331 if (!aead
->set_key(aead
, chunk_from_thing(key
)))
335 icv
= aead
->get_icv_size(aead
);
337 buf
= chunk_alloc(this->bench_size
+ icv
);
338 memset(buf
.ptr
, 0x34, buf
.len
);
342 start_timing(&start
);
343 while (end_timing(&start
) < this->bench_time
)
345 if (aead
->encrypt(aead
, buf
, chunk_from_thing(assoc
),
346 chunk_from_thing(iv
), NULL
))
350 if (aead
->decrypt(aead
, chunk_create(buf
.ptr
, buf
.len
+ icv
),
351 chunk_from_thing(assoc
), chunk_from_thing(iv
), NULL
))
364 METHOD(crypto_tester_t
, test_aead
, bool,
365 private_crypto_tester_t
*this, encryption_algorithm_t alg
, size_t key_size
,
366 aead_constructor_t create
, u_int
*speed
, const char *plugin_name
)
368 enumerator_t
*enumerator
;
369 aead_test_vector_t
*vector
;
373 enumerator
= this->aead
->create_enumerator(this->aead
);
374 while (enumerator
->enumerate(enumerator
, &vector
))
377 chunk_t key
, plain
, cipher
, iv
, assoc
;
380 if (vector
->alg
!= alg
)
384 if (key_size
&& key_size
!= vector
->key_size
)
385 { /* test only vectors with a specific key size, if key size given */
388 aead
= create(alg
, vector
->key_size
);
391 DBG1(DBG_LIB
, "%N[%s]: %u bit key size not supported",
392 encryption_algorithm_names
, alg
, plugin_name
,
393 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
))
430 /* allocated decryption */
431 cipher
= chunk_create(vector
->cipher
, vector
->len
+ icv
);
432 if (!aead
->decrypt(aead
, cipher
, assoc
, iv
, &plain
))
437 else if (!memeq(vector
->plain
, plain
.ptr
, plain
.len
))
441 plain
.ptr
= realloc(plain
.ptr
, plain
.len
+ icv
);
442 /* inline encryption */
443 if (!aead
->encrypt(aead
, plain
, assoc
, iv
, NULL
))
447 if (!memeq(vector
->cipher
, plain
.ptr
, plain
.len
+ icv
))
456 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
457 encryption_algorithm_names
, alg
, plugin_name
, get_name(vector
));
461 enumerator
->destroy(enumerator
);
466 DBG1(DBG_LIB
,"disable %N[%s]: no key size supported",
467 encryption_algorithm_names
, alg
, plugin_name
);
472 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
473 this->required ?
"disabled" : "enabled ",
474 encryption_algorithm_names
, alg
, plugin_name
);
475 return !this->required
;
482 *speed
= bench_aead(this, alg
, create
);
483 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
484 encryption_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
488 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
489 encryption_algorithm_names
, alg
, plugin_name
, tested
);
498 static u_int
bench_signer(private_crypto_tester_t
*this,
499 integrity_algorithm_t alg
, signer_constructor_t create
)
503 signer
= create(alg
);
506 char key
[signer
->get_key_size(signer
)];
507 char mac
[signer
->get_block_size(signer
)];
509 struct timespec start
;
512 memset(key
, 0x12, sizeof(key
));
513 if (!signer
->set_key(signer
, chunk_from_thing(key
)))
518 buf
= chunk_alloc(this->bench_size
);
519 memset(buf
.ptr
, 0x34, buf
.len
);
522 start_timing(&start
);
523 while (end_timing(&start
) < this->bench_time
)
525 if (signer
->get_signature(signer
, buf
, mac
))
529 if (signer
->verify_signature(signer
, buf
, chunk_from_thing(mac
)))
535 signer
->destroy(signer
);
542 METHOD(crypto_tester_t
, test_signer
, bool,
543 private_crypto_tester_t
*this, integrity_algorithm_t alg
,
544 signer_constructor_t create
, u_int
*speed
, const char *plugin_name
)
546 enumerator_t
*enumerator
;
547 signer_test_vector_t
*vector
;
551 enumerator
= this->signer
->create_enumerator(this->signer
);
552 while (enumerator
->enumerate(enumerator
, &vector
))
555 chunk_t key
, data
, mac
;
557 if (vector
->alg
!= alg
)
563 signer
= create(alg
);
566 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
567 integrity_algorithm_names
, alg
, plugin_name
);
574 key
= chunk_create(vector
->key
, signer
->get_key_size(signer
));
575 if (!signer
->set_key(signer
, key
))
579 /* allocated signature */
580 data
= chunk_create(vector
->data
, vector
->len
);
581 if (!signer
->allocate_signature(signer
, data
, &mac
))
585 if (mac
.len
!= signer
->get_block_size(signer
))
589 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
593 /* signature to existing buffer */
594 memset(mac
.ptr
, 0, mac
.len
);
595 if (!signer
->get_signature(signer
, data
, mac
.ptr
))
599 if (!memeq(vector
->mac
, mac
.ptr
, mac
.len
))
603 /* signature verification, good case */
604 if (!signer
->verify_signature(signer
, data
, mac
))
608 /* signature verification, bad case */
609 *(mac
.ptr
+ mac
.len
- 1) += 1;
610 if (signer
->verify_signature(signer
, data
, mac
))
614 /* signature to existing buffer, using append mode */
617 if (!signer
->allocate_signature(signer
,
618 chunk_create(data
.ptr
, 1), NULL
))
622 if (!signer
->get_signature(signer
,
623 chunk_create(data
.ptr
+ 1, 1), NULL
))
627 if (!signer
->verify_signature(signer
, chunk_skip(data
, 2),
628 chunk_create(vector
->mac
, mac
.len
)))
635 signer
->destroy(signer
);
638 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
639 integrity_algorithm_names
, alg
, plugin_name
, get_name(vector
));
643 enumerator
->destroy(enumerator
);
646 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
647 this->required ?
"disabled" : "enabled ",
648 integrity_algorithm_names
, alg
, plugin_name
);
649 return !this->required
;
655 *speed
= bench_signer(this, alg
, create
);
656 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
657 integrity_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
661 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
662 integrity_algorithm_names
, alg
, plugin_name
, tested
);
671 static u_int
bench_hasher(private_crypto_tester_t
*this,
672 hash_algorithm_t alg
, hasher_constructor_t create
)
676 hasher
= create(alg
);
679 char hash
[hasher
->get_hash_size(hasher
)];
681 struct timespec start
;
684 buf
= chunk_alloc(this->bench_size
);
685 memset(buf
.ptr
, 0x34, buf
.len
);
688 start_timing(&start
);
689 while (end_timing(&start
) < this->bench_time
)
691 if (hasher
->get_hash(hasher
, buf
, hash
))
697 hasher
->destroy(hasher
);
704 METHOD(crypto_tester_t
, test_hasher
, bool,
705 private_crypto_tester_t
*this, hash_algorithm_t alg
,
706 hasher_constructor_t create
, u_int
*speed
, const char *plugin_name
)
708 enumerator_t
*enumerator
;
709 hasher_test_vector_t
*vector
;
713 enumerator
= this->hasher
->create_enumerator(this->hasher
);
714 while (enumerator
->enumerate(enumerator
, &vector
))
719 if (vector
->alg
!= alg
)
725 hasher
= create(alg
);
728 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
729 hash_algorithm_names
, alg
, plugin_name
);
737 data
= chunk_create(vector
->data
, vector
->len
);
738 if (!hasher
->allocate_hash(hasher
, data
, &hash
))
742 if (hash
.len
!= hasher
->get_hash_size(hasher
))
746 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
750 /* hash to existing buffer */
751 memset(hash
.ptr
, 0, hash
.len
);
752 if (!hasher
->get_hash(hasher
, data
, hash
.ptr
))
756 if (!memeq(vector
->hash
, hash
.ptr
, hash
.len
))
760 /* hasher to existing buffer, using append mode */
763 memset(hash
.ptr
, 0, hash
.len
);
764 if (!hasher
->allocate_hash(hasher
, chunk_create(data
.ptr
, 1), NULL
) ||
765 !hasher
->get_hash(hasher
, chunk_create(data
.ptr
+ 1, 1), NULL
) ||
766 !hasher
->get_hash(hasher
, chunk_skip(data
, 2), hash
.ptr
) ||
767 !memeq(vector
->hash
, hash
.ptr
, hash
.len
))
774 hasher
->destroy(hasher
);
777 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
778 hash_algorithm_names
, alg
, plugin_name
, get_name(vector
));
782 enumerator
->destroy(enumerator
);
785 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
786 this->required ?
"disabled" : "enabled ",
787 hash_algorithm_names
, alg
, plugin_name
);
788 return !this->required
;
794 *speed
= bench_hasher(this, alg
, create
);
795 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
796 hash_algorithm_names
, alg
, plugin_name
, tested
, *speed
);
800 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
801 hash_algorithm_names
, alg
, plugin_name
, tested
);
810 static u_int
bench_prf(private_crypto_tester_t
*this,
811 pseudo_random_function_t alg
, prf_constructor_t create
)
818 char bytes
[prf
->get_block_size(prf
)], key
[prf
->get_block_size(prf
)];
820 struct timespec start
;
823 memset(key
, 0x56, prf
->get_block_size(prf
));
824 if (!prf
->set_key(prf
, chunk_create(key
, prf
->get_block_size(prf
))))
830 buf
= chunk_alloc(this->bench_size
);
831 memset(buf
.ptr
, 0x34, buf
.len
);
834 start_timing(&start
);
835 while (end_timing(&start
) < this->bench_time
)
837 if (prf
->get_bytes(prf
, buf
, bytes
))
850 METHOD(crypto_tester_t
, test_prf
, bool,
851 private_crypto_tester_t
*this, pseudo_random_function_t alg
,
852 prf_constructor_t create
, u_int
*speed
, const char *plugin_name
)
854 enumerator_t
*enumerator
;
855 prf_test_vector_t
*vector
;
859 enumerator
= this->prf
->create_enumerator(this->prf
);
860 while (enumerator
->enumerate(enumerator
, &vector
))
863 chunk_t key
, seed
, out
;
865 if (vector
->alg
!= alg
)
874 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
875 pseudo_random_function_names
, alg
, plugin_name
);
882 key
= chunk_create(vector
->key
, vector
->key_size
);
883 if (!prf
->set_key(prf
, key
))
888 /* allocated bytes */
889 seed
= chunk_create(vector
->seed
, vector
->len
);
890 if (!prf
->allocate_bytes(prf
, seed
, &out
))
894 if (out
.len
!= prf
->get_block_size(prf
))
898 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
902 /* bytes to existing buffer */
903 memset(out
.ptr
, 0, out
.len
);
904 if (vector
->stateful
)
906 if (!prf
->set_key(prf
, key
))
911 if (!prf
->get_bytes(prf
, seed
, out
.ptr
))
915 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
919 /* bytes to existing buffer, using append mode */
922 memset(out
.ptr
, 0, out
.len
);
923 if (vector
->stateful
)
925 if (!prf
->set_key(prf
, key
))
930 if (!prf
->allocate_bytes(prf
, chunk_create(seed
.ptr
, 1), NULL
) ||
931 !prf
->get_bytes(prf
, chunk_create(seed
.ptr
+ 1, 1), NULL
) ||
932 !prf
->get_bytes(prf
, chunk_skip(seed
, 2), out
.ptr
))
936 if (!memeq(vector
->out
, out
.ptr
, out
.len
))
946 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
947 pseudo_random_function_names
, alg
, plugin_name
, get_name(vector
));
951 enumerator
->destroy(enumerator
);
954 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
955 this->required ?
"disabled" : "enabled ",
956 pseudo_random_function_names
, alg
, plugin_name
);
957 return !this->required
;
963 *speed
= bench_prf(this, alg
, create
);
964 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
965 pseudo_random_function_names
, alg
, plugin_name
, tested
, *speed
);
969 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
970 pseudo_random_function_names
, alg
, plugin_name
, tested
);
979 static u_int
bench_rng(private_crypto_tester_t
*this,
980 rng_quality_t quality
, rng_constructor_t create
)
984 rng
= create(quality
);
987 struct timespec start
;
992 buf
= chunk_alloc(this->bench_size
);
993 start_timing(&start
);
994 while (end_timing(&start
) < this->bench_time
)
996 if (!rng
->get_bytes(rng
, buf
.len
, buf
.ptr
))
1011 METHOD(crypto_tester_t
, test_rng
, bool,
1012 private_crypto_tester_t
*this, rng_quality_t quality
,
1013 rng_constructor_t create
, u_int
*speed
, const char *plugin_name
)
1015 enumerator_t
*enumerator
;
1016 rng_test_vector_t
*vector
;
1017 bool failed
= FALSE
;
1020 if (!this->rng_true
&& quality
== RNG_TRUE
)
1022 DBG1(DBG_LIB
, "enabled %N[%s]: skipping test (disabled by config)",
1023 rng_quality_names
, quality
, plugin_name
);
1027 enumerator
= this->rng
->create_enumerator(this->rng
);
1028 while (enumerator
->enumerate(enumerator
, &vector
))
1030 chunk_t data
= chunk_empty
;
1033 if (vector
->quality
!= quality
)
1039 rng
= create(quality
);
1042 DBG1(DBG_LIB
, "disabled %N[%s]: creating instance failed",
1043 rng_quality_names
, quality
, plugin_name
);
1050 /* allocated bytes */
1051 if (!rng
->allocate_bytes(rng
, vector
->len
, &data
) ||
1052 data
.len
!= vector
->len
||
1053 !vector
->test(vector
->user
, data
))
1058 { /* write bytes into existing buffer */
1059 memset(data
.ptr
, 0, data
.len
);
1060 if (!rng
->get_bytes(rng
, vector
->len
, data
.ptr
) ||
1061 !vector
->test(vector
->user
, data
))
1070 DBG1(DBG_LIB
, "disabled %N[%s]: %s test vector failed",
1071 rng_quality_names
, quality
, plugin_name
, get_name(vector
));
1075 enumerator
->destroy(enumerator
);
1078 DBG1(DBG_LIB
, "%s %N[%s]: no test vectors found",
1079 this->required ?
", disabled" : "enabled ",
1080 rng_quality_names
, quality
, plugin_name
);
1081 return !this->required
;
1087 *speed
= bench_rng(this, quality
, create
);
1088 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors, %d points",
1089 rng_quality_names
, quality
, plugin_name
, tested
, *speed
);
1093 DBG1(DBG_LIB
, "enabled %N[%s]: passed %u test vectors",
1094 rng_quality_names
, quality
, plugin_name
, tested
);
1100 METHOD(crypto_tester_t
, add_crypter_vector
, void,
1101 private_crypto_tester_t
*this, crypter_test_vector_t
*vector
)
1103 this->crypter
->insert_last(this->crypter
, vector
);
1106 METHOD(crypto_tester_t
, add_aead_vector
, void,
1107 private_crypto_tester_t
*this, aead_test_vector_t
*vector
)
1109 this->aead
->insert_last(this->aead
, vector
);
1112 METHOD(crypto_tester_t
, add_signer_vector
, void,
1113 private_crypto_tester_t
*this, signer_test_vector_t
*vector
)
1115 this->signer
->insert_last(this->signer
, vector
);
1118 METHOD(crypto_tester_t
, add_hasher_vector
, void,
1119 private_crypto_tester_t
*this, hasher_test_vector_t
*vector
)
1121 this->hasher
->insert_last(this->hasher
, vector
);
1124 METHOD(crypto_tester_t
, add_prf_vector
, void,
1125 private_crypto_tester_t
*this, prf_test_vector_t
*vector
)
1127 this->prf
->insert_last(this->prf
, vector
);
1130 METHOD(crypto_tester_t
, add_rng_vector
, void,
1131 private_crypto_tester_t
*this, rng_test_vector_t
*vector
)
1133 this->rng
->insert_last(this->rng
, vector
);
1136 METHOD(crypto_tester_t
, destroy
, void,
1137 private_crypto_tester_t
*this)
1139 this->crypter
->destroy(this->crypter
);
1140 this->aead
->destroy(this->aead
);
1141 this->signer
->destroy(this->signer
);
1142 this->hasher
->destroy(this->hasher
);
1143 this->prf
->destroy(this->prf
);
1144 this->rng
->destroy(this->rng
);
1151 crypto_tester_t
*crypto_tester_create()
1153 private_crypto_tester_t
*this;
1157 .test_crypter
= _test_crypter
,
1158 .test_aead
= _test_aead
,
1159 .test_signer
= _test_signer
,
1160 .test_hasher
= _test_hasher
,
1161 .test_prf
= _test_prf
,
1162 .test_rng
= _test_rng
,
1163 .add_crypter_vector
= _add_crypter_vector
,
1164 .add_aead_vector
= _add_aead_vector
,
1165 .add_signer_vector
= _add_signer_vector
,
1166 .add_hasher_vector
= _add_hasher_vector
,
1167 .add_prf_vector
= _add_prf_vector
,
1168 .add_rng_vector
= _add_rng_vector
,
1169 .destroy
= _destroy
,
1171 .crypter
= linked_list_create(),
1172 .aead
= linked_list_create(),
1173 .signer
= linked_list_create(),
1174 .hasher
= linked_list_create(),
1175 .prf
= linked_list_create(),
1176 .rng
= linked_list_create(),
1178 .required
= lib
->settings
->get_bool(lib
->settings
,
1179 "libstrongswan.crypto_test.required", FALSE
),
1180 .rng_true
= lib
->settings
->get_bool(lib
->settings
,
1181 "libstrongswan.crypto_test.rng_true", FALSE
),
1182 .bench_time
= lib
->settings
->get_int(lib
->settings
,
1183 "libstrongswan.crypto_test.bench_time", 50),
1184 .bench_size
= lib
->settings
->get_int(lib
->settings
,
1185 "libstrongswan.crypto_test.bench_size", 1024),
1188 /* enforce a block size of 16, should be fine for all algorithms */
1189 this->bench_size
= this->bench_size
/ 16 * 16;
1191 return &this->public;