#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)
}
}
+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)
{
rspamd_sig_t mac;
struct rspamd_cryptobox_segment *seg;
double t1, t2;
+ gint i, cnt, ms;
map = create_mapping (mapping_size, &begin, &end);
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);
+ }
+ }
}