|
|
@@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |