summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiadlo <polsha3@gmail.com>2016-12-27 00:00:26 +0300
committerDiadlo <polsha3@gmail.com>2017-01-04 01:34:20 +0300
commitb99e99f5d9547cb7af6c3eb83f792c7cdbb7bd6d (patch)
tree54a311a04a92f2b132b812fadbd6466178189593
parent06a68f0f5f7fd305e1179d3fd02b4399a2cbc4b8 (diff)
Add tests to secure memcmp and memzero functions.
-rw-r--r--auto_tests/crypto_test.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/auto_tests/crypto_test.c b/auto_tests/crypto_test.c
index c1003f80..7c32b43a 100644
--- a/auto_tests/crypto_test.c
+++ b/auto_tests/crypto_test.c
@@ -2,7 +2,9 @@
2#include "config.h" 2#include "config.h"
3#endif 3#endif
4 4
5#include "../toxcore/misc_tools.h"
5#include "../toxcore/net_crypto.h" 6#include "../toxcore/net_crypto.h"
7
6#include <check.h> 8#include <check.h>
7#include <stdint.h> 9#include <stdint.h>
8#include <stdlib.h> 10#include <stdlib.h>
@@ -323,6 +325,89 @@ START_TEST(test_increment_nonce)
323} 325}
324END_TEST 326END_TEST
325 327
328START_TEST(test_memzero)
329{
330 uint8_t src[sizeof(test_c)];
331 memcpy(src, test_c, sizeof(test_c));
332
333 crypto_memzero(src, sizeof(src));
334 size_t i;
335
336 for (i = 0; i < sizeof(src); i++) {
337 ck_assert_msg(src[i] == 0, "Memory is not zeroed");
338 }
339}
340END_TEST
341
342#define CRYPTO_TEST_MEMCMP_SIZE 1024*32
343#define CRYPTO_TEST_MEMCMP_COUNT 500
344#define CRYPTO_TEST_MEMCMP_EPS 10
345
346static make_quick_sort(clock_t)
347
348static int cmp(clock_t a, clock_t b)
349{
350 if (a < b) {
351 return -1;
352 }
353
354 if (a > b) {
355 return 1;
356 }
357
358 return 0;
359}
360
361static clock_t memcmp_time(void *a, void *b, size_t len)
362{
363 clock_t start = clock();
364 crypto_memcmp(a, b, len);
365 return clock() - start;
366}
367
368static clock_t memcmp_median(void *a, void *b, size_t len)
369{
370 size_t i;
371 clock_t results[CRYPTO_TEST_MEMCMP_COUNT];
372
373 for (i = 0; i < CRYPTO_TEST_MEMCMP_COUNT; i++) {
374 results[i] = memcmp_time(a, b, len);
375 }
376
377 clock_t_quick_sort(results, CRYPTO_TEST_MEMCMP_COUNT, cmp);
378 return results[CRYPTO_TEST_MEMCMP_COUNT / 2];
379}
380
381START_TEST(test_memcmp)
382{
383 uint8_t src[CRYPTO_TEST_MEMCMP_SIZE];
384 rand_bytes(src, sizeof(src));
385
386 uint8_t same[sizeof(src)];
387 memcpy(same, src, sizeof(src));
388
389 uint8_t not_same[sizeof(src)];
390 rand_bytes(not_same, sizeof(not_same));
391
392 clock_t same_median = memcmp_median(src, same, sizeof(src));
393 clock_t not_same_median = memcmp_median(src, not_same, sizeof(src));
394
395 clock_t delta;
396
397 if (same_median > not_same_median) {
398 delta = same_median - not_same_median;
399 } else {
400 delta = not_same_median - same_median;
401 }
402
403 ck_assert_msg(delta < CRYPTO_TEST_MEMCMP_EPS,
404 "Delta time is too long (%d >= %d)\n"
405 "Time of the same data comparation: %d\n"
406 "Time of the different data comparation: %d",
407 delta, CRYPTO_TEST_MEMCMP_EPS, same_median, not_same_median);
408}
409END_TEST
410
326static Suite *crypto_suite(void) 411static Suite *crypto_suite(void)
327{ 412{
328 Suite *s = suite_create("Crypto"); 413 Suite *s = suite_create("Crypto");
@@ -333,6 +418,8 @@ static Suite *crypto_suite(void)
333 DEFTESTCASE(large_data); 418 DEFTESTCASE(large_data);
334 DEFTESTCASE(large_data_symmetric); 419 DEFTESTCASE(large_data_symmetric);
335 DEFTESTCASE_SLOW(increment_nonce, 20); 420 DEFTESTCASE_SLOW(increment_nonce, 20);
421 DEFTESTCASE(memzero);
422 DEFTESTCASE(memcmp);
336 423
337 return s; 424 return s;
338} 425}