added RNG test vectors
This commit is contained in:
@@ -10,6 +10,7 @@ libstrongswan_test_vectors_la_SOURCES = \
|
||||
test_vectors/blowfish.c \
|
||||
test_vectors/aes_cbc.c \
|
||||
test_vectors/aes_xcbc.c \
|
||||
test_vectors/md5.c
|
||||
test_vectors/md5.c \
|
||||
test_vectors/rng.c
|
||||
libstrongswan_test_vectors_la_LDFLAGS = -module
|
||||
|
||||
|
||||
@@ -40,3 +40,14 @@ TEST_VECTOR_PRF(aes_xcbc_p4)
|
||||
TEST_VECTOR_PRF(aes_xcbc_p5)
|
||||
TEST_VECTOR_PRF(aes_xcbc_p6)
|
||||
TEST_VECTOR_PRF(aes_xcbc_p7)
|
||||
|
||||
TEST_VECTOR_RNG(rng_monobit_1)
|
||||
TEST_VECTOR_RNG(rng_monobit_2)
|
||||
TEST_VECTOR_RNG(rng_monobit_3)
|
||||
TEST_VECTOR_RNG(rng_poker_1)
|
||||
TEST_VECTOR_RNG(rng_poker_2)
|
||||
TEST_VECTOR_RNG(rng_poker_3)
|
||||
TEST_VECTOR_RNG(rng_runs_1)
|
||||
TEST_VECTOR_RNG(rng_runs_2)
|
||||
TEST_VECTOR_RNG(rng_runs_3)
|
||||
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
/*
|
||||
* Copyright (C) 2009 Martin Willi
|
||||
* Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the Licenseor (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* This program is distributed in the hope that it will be usefulbut
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <crypto/crypto_tester.h>
|
||||
|
||||
#include <debug.h>
|
||||
|
||||
/**
|
||||
* Monobit test
|
||||
*/
|
||||
typedef struct {
|
||||
int lower;
|
||||
int upper;
|
||||
} monobit_t;
|
||||
|
||||
monobit_t monobit_all = {
|
||||
.lower = 9654,
|
||||
.upper = 10346
|
||||
};
|
||||
|
||||
static bool test_monobit(monobit_t *param, chunk_t data)
|
||||
{
|
||||
int i, j, bits = 0;
|
||||
|
||||
for (i = 0; i < data.len; i++)
|
||||
{
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
if (data.ptr[i] & (1<<j))
|
||||
{
|
||||
bits++;
|
||||
}
|
||||
}
|
||||
}
|
||||
DBG2(" Monobit: %d/%d bits set", bits, data.len * 8);
|
||||
if (bits > param->lower && bits < param->upper)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
rng_test_vector_t rng_monobit_1 = {
|
||||
RNG_WEAK, .len = 2500,
|
||||
.test = (void*)test_monobit,
|
||||
.user = &monobit_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_monobit_2 = {
|
||||
RNG_STRONG, .len = 2500,
|
||||
.test = (void*)test_monobit,
|
||||
.user = &monobit_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_monobit_3 = {
|
||||
RNG_TRUE, .len = 2500,
|
||||
.test = (void*)test_monobit,
|
||||
.user = &monobit_all
|
||||
};
|
||||
|
||||
/**
|
||||
* Poker test
|
||||
*/
|
||||
typedef struct {
|
||||
double lower;
|
||||
double upper;
|
||||
} poker_t;
|
||||
|
||||
poker_t poker_all = {
|
||||
.lower = 1.03,
|
||||
.upper = 57.4
|
||||
};
|
||||
|
||||
static bool test_poker(poker_t *param, chunk_t data)
|
||||
{
|
||||
int i, counter[16];
|
||||
double sum = 0.0;
|
||||
|
||||
memset(counter, 0, sizeof(counter));
|
||||
|
||||
for (i = 0; i < data.len; i++)
|
||||
{
|
||||
counter[data.ptr[i] & 0x0F]++;
|
||||
counter[(data.ptr[i] & 0xF0) >> 4]++;
|
||||
}
|
||||
|
||||
for (i = 0; i < countof(counter); i++)
|
||||
{
|
||||
sum += (counter[i] * counter[i]) / 5000.0 * 16.0;
|
||||
}
|
||||
sum -= 5000.0;
|
||||
DBG2(" Poker: %f", sum);
|
||||
if (sum > param->lower && sum < param->upper)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
rng_test_vector_t rng_poker_1 = {
|
||||
RNG_WEAK, .len = 2500,
|
||||
.test = (void*)test_poker,
|
||||
.user = &poker_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_poker_2 = {
|
||||
RNG_STRONG, .len = 2500,
|
||||
.test = (void*)test_poker,
|
||||
.user = &poker_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_poker_3 = {
|
||||
RNG_TRUE, .len = 2500,
|
||||
.test = (void*)test_poker,
|
||||
.user = &poker_all
|
||||
};
|
||||
|
||||
/**
|
||||
* Runs test
|
||||
*/
|
||||
typedef struct {
|
||||
int longrun;
|
||||
int lower[7];
|
||||
int upper[7];
|
||||
} runs_t;
|
||||
|
||||
runs_t runs_all = {
|
||||
.longrun = 34,
|
||||
.lower = {-1, 2267, 1079, 502, 223, 90, 90},
|
||||
.upper = {-1, 2733, 1421, 748, 402, 223, 223},
|
||||
};
|
||||
|
||||
static bool test_runs(runs_t *param, chunk_t data)
|
||||
{
|
||||
int i, j, zero_runs[7], one_runs[7], zero = 0, one = 0, longrun = 0;
|
||||
|
||||
memset(one_runs, 0, sizeof(zero_runs));
|
||||
memset(zero_runs, 0, sizeof(one_runs));
|
||||
|
||||
for (i = 0; i < data.len; i++)
|
||||
{
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
if (data.ptr[i] & (1<<j))
|
||||
{
|
||||
if (one)
|
||||
{
|
||||
if (++one >= param->longrun)
|
||||
{
|
||||
longrun++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
zero_runs[min(6, zero)]++;
|
||||
zero = 0;
|
||||
one = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (zero)
|
||||
{
|
||||
if (++zero >= param->longrun)
|
||||
{
|
||||
longrun++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
one_runs[min(6, one)]++;
|
||||
one = 0;
|
||||
zero = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DBG2(" Runs: zero: %d/%d/%d/%d/%d/%d, one: %d/%d/%d/%d/%d/%d, "
|
||||
"longruns: %d",
|
||||
zero_runs[1], zero_runs[2], zero_runs[3],
|
||||
zero_runs[4], zero_runs[5], zero_runs[6],
|
||||
one_runs[1], one_runs[2], one_runs[3],
|
||||
one_runs[4], one_runs[5], one_runs[6],
|
||||
longrun);
|
||||
|
||||
if (longrun)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 1; i < countof(zero_runs); i++)
|
||||
{
|
||||
if (zero_runs[i] <= param->lower[i] ||
|
||||
zero_runs[i] >= param->upper[i] ||
|
||||
one_runs[i] <= param->lower[i] ||
|
||||
one_runs[i] >= param->upper[i])
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
rng_test_vector_t rng_runs_1 = {
|
||||
RNG_WEAK, .len = 2500,
|
||||
.test = (void*)test_runs,
|
||||
.user = &runs_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_runs_2 = {
|
||||
RNG_STRONG, .len = 2500,
|
||||
.test = (void*)test_runs,
|
||||
.user = &runs_all
|
||||
};
|
||||
|
||||
rng_test_vector_t rng_runs_3 = {
|
||||
RNG_TRUE, .len = 2500,
|
||||
.test = (void*)test_runs,
|
||||
.user = &runs_all
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user