xof: Defined Extended Output Functions

This commit is contained in:
Andreas Steffen
2016-07-29 12:36:14 +02:00
parent 7f65a8c271
commit 04208ac5d4
14 changed files with 539 additions and 5 deletions
+155
View File
@@ -62,6 +62,11 @@ struct private_crypto_tester_t {
*/
linked_list_t *prf;
/**
* List of XOF test vectors
*/
linked_list_t *xof;
/**
* List of RNG test vectors
*/
@@ -1034,6 +1039,146 @@ failure:
return !failed;
}
/**
* Benchmark an XOF
*/
static u_int bench_xof(private_crypto_tester_t *this,
ext_out_function_t alg, xof_constructor_t create)
{
xof_t *xof;
xof = create(alg);
if (xof)
{
char seed[xof->get_seed_size(xof)];
char bytes[xof->get_block_size(xof)];
struct timespec start;
u_int runs;
memset(seed, 0x56, xof->get_seed_size(xof));
if (!xof->set_seed(xof, chunk_create(seed, xof->get_seed_size(xof))))
{
xof->destroy(xof);
return 0;
}
runs = 0;
start_timing(&start);
while (end_timing(&start) < this->bench_time)
{
if (xof->get_bytes(xof, xof->get_block_size(xof), bytes))
{
runs++;
}
}
xof->destroy(xof);
return runs;
}
return 0;
}
METHOD(crypto_tester_t, test_xof, bool,
private_crypto_tester_t *this, ext_out_function_t alg,
xof_constructor_t create, u_int *speed, const char *plugin_name)
{
enumerator_t *enumerator;
xof_test_vector_t *vector;
bool failed = FALSE;
u_int tested = 0;
enumerator = this->xof->create_enumerator(this->xof);
while (enumerator->enumerate(enumerator, &vector))
{
xof_t *xof;
chunk_t seed, out = chunk_empty;
if (vector->alg != alg)
{
continue;
}
tested++;
failed = TRUE;
xof = create(alg);
if (!xof)
{
DBG1(DBG_LIB, "disabled %N[%s]: creating instance failed",
ext_out_function_names, alg, plugin_name);
break;
}
seed = chunk_create(vector->seed, vector->len);
if (!xof->set_seed(xof, seed))
{
goto failure;
}
/* allocated bytes */
if (!xof->allocate_bytes(xof, vector->out_len, &out))
{
goto failure;
}
if (out.len != vector->out_len)
{
goto failure;
}
if (!memeq(vector->out, out.ptr, out.len))
{
goto failure;
}
/* bytes to existing buffer */
memset(out.ptr, 0, out.len);
if (!xof->set_seed(xof, seed))
{
goto failure;
}
if (!xof->get_bytes(xof, vector->out_len, out.ptr))
{
goto failure;
}
if (!memeq(vector->out, out.ptr, vector->out_len))
{
goto failure;
}
/* bytes to existing buffer, using append mode */
/* TODO */
failed = FALSE;
failure:
xof->destroy(xof);
chunk_free(&out);
if (failed)
{
DBG1(DBG_LIB, "disabled %N[%s]: %s test vector failed",
ext_out_function_names, alg, plugin_name, get_name(vector));
break;
}
}
enumerator->destroy(enumerator);
if (!tested)
{
DBG1(DBG_LIB, "%s %N[%s]: no test vectors found",
this->required ? "disabled" : "enabled ",
ext_out_function_names, alg, plugin_name);
return !this->required;
}
if (!failed)
{
if (speed)
{
*speed = bench_xof(this, alg, create);
DBG1(DBG_LIB, "enabled %N[%s]: passed %u test vectors, %d points",
ext_out_function_names, alg, plugin_name, tested, *speed);
}
else
{
DBG1(DBG_LIB, "enabled %N[%s]: passed %u test vectors",
ext_out_function_names, alg, plugin_name, tested);
}
}
return !failed;
}
/**
* Benchmark a RNG
*/
@@ -1338,6 +1483,12 @@ METHOD(crypto_tester_t, add_prf_vector, void,
this->prf->insert_last(this->prf, vector);
}
METHOD(crypto_tester_t, add_xof_vector, void,
private_crypto_tester_t *this, xof_test_vector_t *vector)
{
this->xof->insert_last(this->xof, vector);
}
METHOD(crypto_tester_t, add_rng_vector, void,
private_crypto_tester_t *this, rng_test_vector_t *vector)
{
@@ -1358,6 +1509,7 @@ METHOD(crypto_tester_t, destroy, void,
this->signer->destroy(this->signer);
this->hasher->destroy(this->hasher);
this->prf->destroy(this->prf);
this->xof->destroy(this->xof);
this->rng->destroy(this->rng);
this->dh->destroy(this->dh);
free(this);
@@ -1377,6 +1529,7 @@ crypto_tester_t *crypto_tester_create()
.test_signer = _test_signer,
.test_hasher = _test_hasher,
.test_prf = _test_prf,
.test_xof = _test_xof,
.test_rng = _test_rng,
.test_dh = _test_dh,
.add_crypter_vector = _add_crypter_vector,
@@ -1384,6 +1537,7 @@ crypto_tester_t *crypto_tester_create()
.add_signer_vector = _add_signer_vector,
.add_hasher_vector = _add_hasher_vector,
.add_prf_vector = _add_prf_vector,
.add_xof_vector = _add_xof_vector,
.add_rng_vector = _add_rng_vector,
.add_dh_vector = _add_dh_vector,
.destroy = _destroy,
@@ -1393,6 +1547,7 @@ crypto_tester_t *crypto_tester_create()
.signer = linked_list_create(),
.hasher = linked_list_create(),
.prf = linked_list_create(),
.xof = linked_list_create(),
.rng = linked_list_create(),
.dh = linked_list_create(),