]> source.dussan.org Git - rspamd.git/commitdiff
Add fuzz tests and other split cases.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 May 2015 14:28:39 +0000 (15:28 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 7 May 2015 14:28:39 +0000 (15:28 +0100)
test/rspamd_cryptobox_test.c

index 54f154d385311ebd0ba11e8652deda2fa75493fc..c624a6bf694047c19d7e282dad73f3d78a82b880 100644 (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);
+               }
+       }
 }