1
2#define TEST_NAME "verify1"
3#include "cmptest.h"
4
5int
6main(void)
7{
8    unsigned char *v16, *v16x;
9    unsigned char *v32, *v32x;
10    unsigned char *v64, *v64x;
11    uint32_t       r;
12    uint8_t        o;
13    int            i;
14
15    v16  = (unsigned char *) sodium_malloc(16);
16    v16x = (unsigned char *) sodium_malloc(16);
17    v32  = (unsigned char *) sodium_malloc(32);
18    v32x = (unsigned char *) sodium_malloc(32);
19    v64  = (unsigned char *) sodium_malloc(64);
20    v64x = (unsigned char *) sodium_malloc(64);
21    for (i = 0; i < 10000; i++) {
22        randombytes_buf(v16, 16);
23        randombytes_buf(v32, 32);
24        randombytes_buf(v64, 64);
25
26        memcpy(v16x, v16, 16);
27        memcpy(v32x, v32, 32);
28        memcpy(v64x, v64, 64);
29
30        if (crypto_verify_16(v16, v16x) != 0 ||
31            crypto_verify_32(v32, v32x) != 0 ||
32            crypto_verify_64(v64, v64x) != 0 ||
33            sodium_memcmp(v16, v16x, 16) != 0 ||
34            sodium_memcmp(v32, v32x, 32) != 0 ||
35            sodium_memcmp(v64, v64x, 64) != 0) {
36            printf("Failed\n");
37        }
38    }
39    printf("OK\n");
40
41    for (i = 0; i < 100000; i++) {
42        r = randombytes_random();
43        o = (uint8_t) randombytes_random();
44        if (o == 0) {
45            continue;
46        }
47        v16x[r & 15U] ^= o;
48        v32x[r & 31U] ^= o;
49        v64x[r & 63U] ^= o;
50        if (crypto_verify_16(v16, v16x) != -1 ||
51            crypto_verify_32(v32, v32x) != -1 ||
52            crypto_verify_64(v64, v64x) != -1 ||
53            sodium_memcmp(v16, v16x, 16) != -1 ||
54            sodium_memcmp(v32, v32x, 32) != -1 ||
55            sodium_memcmp(v64, v64x, 64) != -1) {
56            printf("Failed\n");
57        }
58        v16x[r & 15U] ^= o;
59        v32x[r & 31U] ^= o;
60        v64x[r & 63U] ^= o;
61    }
62    printf("OK\n");
63
64    assert(crypto_verify_16_bytes() == 16U);
65    assert(crypto_verify_32_bytes() == 32U);
66    assert(crypto_verify_64_bytes() == 64U);
67
68    sodium_free(v16);
69    sodium_free(v16x);
70    sodium_free(v32);
71    sodium_free(v32x);
72    sodium_free(v64);
73    sodium_free(v64x);
74
75    return 0;
76}
77