Browse Source

Add fuzz tests and other split cases.

tags/0.9.0
Vsevolod Stakhov 9 years ago
parent
commit
e5d365bdd4
1 changed files with 176 additions and 1 deletions
  1. 176
    1
      test/rspamd_cryptobox_test.c

+ 176
- 1
test/rspamd_cryptobox_test.c View File

@@ -31,7 +31,8 @@
#include "cryptobox.h"

static const int mapping_size = 64 * 8192 + 1;
static const int max_seg = 1024;
static const int max_seg = 32;
static const int random_fuzz_cnt = 10000;

static void *
create_mapping (int mapping_len, guchar **beg, guchar **end)
@@ -67,6 +68,69 @@ check_result (const rspamd_nm_t key, const rspamd_nonce_t nonce,
}
}

static int
create_random_split (struct rspamd_cryptobox_segment *seg, int mseg,
guchar *begin, guchar *end)
{
gsize remain = end - begin;
gint used = 0;

while (remain > 0 && used < mseg - 1) {
seg->data = begin;
seg->len = ottery_rand_range (remain - 1) + 1;

begin += seg->len;
remain -= seg->len;
used ++;
seg ++;
}

if (remain > 0) {
seg->data = begin;
seg->len = remain;
used ++;
}

return used;
}

static int
create_realistic_split (struct rspamd_cryptobox_segment *seg, int mseg,
guchar *begin, guchar *end)
{
gsize remain = end - begin;
gint used = 0;
static const int small_seg = 512, medium_seg = 2048;

while (remain > 0 && used < mseg - 1) {
seg->data = begin;

if (ottery_rand_uint32 () % 2 == 0) {
seg->len = ottery_rand_range (small_seg) + 1;
}
else {
seg->len = ottery_rand_range (medium_seg) +
small_seg;
}
if (seg->len > remain) {
seg->len = remain;
}

begin += seg->len;
remain -= seg->len;
used ++;
seg ++;
}

if (remain > 0) {
seg->data = begin;
seg->len = remain;
used ++;
}

return used;
}

void
rspamd_cryptobox_test_func (void)
{
@@ -77,6 +141,7 @@ rspamd_cryptobox_test_func (void)
rspamd_sig_t mac;
struct rspamd_cryptobox_segment *seg;
double t1, t2;
gint i, cnt, ms;

map = create_mapping (mapping_size, &begin, &end);

@@ -103,4 +168,114 @@ rspamd_cryptobox_test_func (void)
check_result (key, nonce, mac, begin, end);

msg_info ("bulk encryption: %.6f", t2 - t1);

/* Two chunks as vector */
seg[0].data = begin;
seg[0].len = (end - begin) / 2;
seg[1].data = begin + seg[0].len;
seg[1].len = (end - begin) - seg[0].len;
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, 2, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("2 equal chunks encryption: %.6f", t2 - t1);

seg[0].data = begin;
seg[0].len = 1;
seg[1].data = begin + seg[0].len;
seg[1].len = (end - begin) - seg[0].len;
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, 2, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("small and large chunks encryption: %.6f", t2 - t1);

seg[0].data = begin;
seg[0].len = (end - begin) - 3;
seg[1].data = begin + seg[0].len;
seg[1].len = (end - begin) - seg[0].len;
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, 2, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("large and small chunks encryption: %.6f", t2 - t1);

/* Random two chunks as vector */
seg[0].data = begin;
seg[0].len = ottery_rand_range (end - begin - 1) + 1;
seg[1].data = begin + seg[0].len;
seg[1].len = (end - begin) - seg[0].len;
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, 2, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("random 2 chunks encryption: %.6f", t2 - t1);

/* 3 specific chunks */
seg[0].data = begin;
seg[0].len = 2;
seg[1].data = begin + seg[0].len;
seg[1].len = 2049;
seg[2].data = begin + seg[0].len + seg[1].len;
seg[2].len = (end - begin) - seg[0].len - seg[1].len;
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, 3, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("small, medium and large chunks encryption: %.6f", t2 - t1);

cnt = create_random_split (seg, max_seg, begin, end);
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, cnt, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("random split of %d chunks encryption: %.6f", cnt, t2 - t1);

cnt = create_realistic_split (seg, max_seg, begin, end);
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, cnt, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

msg_info ("realistic split of %d chunks encryption: %.6f", cnt, t2 - t1);

for (i = 0; i < random_fuzz_cnt; i ++) {
ms = ottery_rand_range (i % max_seg * 2) + 1;
cnt = create_random_split (seg, ms, begin, end);
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, cnt, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

if (i % 1000 == 0) {
msg_info ("random fuzz iterations: %d", i);
}
}
for (i = 0; i < random_fuzz_cnt; i ++) {
ms = ottery_rand_range (i % max_seg * 2) + 1;
cnt = create_realistic_split (seg, ms, begin, end);
t1 = rspamd_get_ticks ();
rspamd_cryptobox_encryptv_nm_inplace (seg, cnt, nonce, key, mac);
t2 = rspamd_get_ticks ();

check_result (key, nonce, mac, begin, end);

if (i % 1000 == 0) {
msg_info ("realistic fuzz iterations: %d", i);
}
}
}

Loading…
Cancel
Save