From e5d365bdd49b939fa6f5b1a92694f63eb95bad4b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 7 May 2015 15:28:39 +0100 Subject: [PATCH] Add fuzz tests and other split cases. --- test/rspamd_cryptobox_test.c | 177 ++++++++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 1 deletion(-) diff --git a/test/rspamd_cryptobox_test.c b/test/rspamd_cryptobox_test.c index 54f154d38..c624a6bf6 100644 --- a/test/rspamd_cryptobox_test.c +++ b/test/rspamd_cryptobox_test.c @@ -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); + } + } } -- 2.39.5