1 
2 #define TEST_NAME "verify1"
3 #include "cmptest.h"
4 
5 int
6 main(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