1 #define TEST_NAME "sodium_utils"
2 #include "cmptest.h"
3 
4 int
main(void)5 main(void)
6 {
7     unsigned char  buf_add[1000];
8     unsigned char  buf1[1000];
9     unsigned char  buf2[1000];
10     unsigned char  buf1_rev[1000];
11     unsigned char  buf2_rev[1000];
12     unsigned char  nonce[24];
13     char           nonce_hex[49];
14     unsigned char *bin_padded;
15     size_t         bin_len, bin_len2;
16     size_t         bin_padded_len;
17     size_t         bin_padded_maxlen;
18     size_t         blocksize;
19     unsigned int   i;
20     unsigned int   j;
21 
22     randombytes_buf(buf1, sizeof buf1);
23     memcpy(buf2, buf1, sizeof buf2);
24     printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1));
25     sodium_memzero(buf1, 0U);
26     printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1));
27     sodium_memzero(buf1, sizeof buf1 / 2);
28     printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1));
29     printf("%d\n", sodium_memcmp(buf1, buf2, 0U));
30     sodium_memzero(buf2, sizeof buf2 / 2);
31     printf("%d\n", sodium_memcmp(buf1, buf2, sizeof buf1));
32     printf("%d\n", sodium_memcmp(buf1, guard_page, 0U));
33     printf("%d\n", sodium_memcmp(guard_page, buf2, 0U));
34     printf("%d\n", sodium_memcmp(guard_page, guard_page, 0U));
35     sodium_memzero(guard_page, 0U);
36 
37     memset(nonce, 0, sizeof nonce);
38     sodium_increment(nonce, sizeof nonce);
39     printf("%s\n",
40            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
41     memset(nonce, 255, sizeof nonce);
42     sodium_increment(nonce, sizeof nonce);
43     printf("%s\n",
44            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
45     nonce[1] = 1U;
46     sodium_increment(nonce, sizeof nonce);
47     printf("%s\n",
48            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
49     nonce[1] = 0U;
50     sodium_increment(nonce, sizeof nonce);
51     printf("%s\n",
52            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
53     nonce[0] = 255U;
54     nonce[2] = 255U;
55     sodium_increment(nonce, sizeof nonce);
56     printf("%s\n",
57            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
58     for (i = 0U; i < 1000U; i++) {
59         bin_len = (size_t) randombytes_uniform(sizeof buf1);
60         randombytes_buf(buf1, bin_len);
61         randombytes_buf(buf2, bin_len);
62         for (j = 0U; j < bin_len; j++) {
63             buf1_rev[bin_len - 1 - j] = buf1[j];
64             buf2_rev[bin_len - 1 - j] = buf2[j];
65         }
66         if (memcmp(buf1_rev, buf2_rev, bin_len) *
67             sodium_compare(buf1, buf2, bin_len) < 0) {
68             printf("sodium_compare() failure with length=%u\n",
69                    (unsigned int) bin_len);
70         }
71         memcpy(buf1, buf2, bin_len);
72         if (sodium_compare(buf1, buf2, bin_len)) {
73             printf("sodium_compare() equality failure with length=%u\n",
74                    (unsigned int) bin_len);
75         }
76     }
77     printf("%d\n", sodium_compare(buf1, NULL, 0U));
78     printf("%d\n", sodium_compare(NULL, buf1, 0U));
79     memset(buf1, 0, sizeof buf1);
80     if (sodium_is_zero(buf1, sizeof buf1) != 1) {
81         printf("sodium_is_zero() failed\n");
82     }
83     for (i = 0U; i < sizeof buf1; i++) {
84         buf1[i]++;
85         if (sodium_is_zero(buf1, sizeof buf1) != 0) {
86             printf("sodium_is_zero() failed\n");
87         }
88         buf1[i]--;
89     }
90     bin_len = randombytes_uniform(sizeof buf1);
91     randombytes_buf(buf1, bin_len);
92     memcpy(buf2, buf1, bin_len);
93     memset(buf_add, 0, bin_len);
94     j = randombytes_uniform(10000);
95     for (i = 0U; i < j; i++) {
96         sodium_increment(buf1, bin_len);
97         sodium_increment(buf_add, bin_len);
98     }
99     sodium_add(buf2, buf_add, bin_len);
100     if (sodium_compare(buf1, buf2, bin_len) != 0) {
101         printf("sodium_add() failed\n");
102     }
103     bin_len = randombytes_uniform(sizeof buf1);
104     randombytes_buf(buf1, bin_len);
105     memcpy(buf2, buf1, bin_len);
106     memset(buf_add, 0xff, bin_len);
107     sodium_increment(buf2, bin_len);
108     sodium_increment(buf2, 0U);
109     sodium_add(buf2, buf_add, bin_len);
110     sodium_add(buf2, buf_add, 0U);
111     if (sodium_compare(buf1, buf2, bin_len) != 0) {
112         printf("sodium_add() failed\n");
113     }
114     for (i = 0U; i < 1000U; i++) {
115         randombytes_buf(buf1, bin_len);
116         randombytes_buf(buf2, bin_len);
117         sodium_add(buf1, buf2, bin_len);
118         sodium_sub(buf1, buf2, bin_len);
119         sodium_sub(buf1, buf2, 0U);
120         if (sodium_is_zero(buf1, bin_len) &&
121             !sodium_is_zero(buf1, bin_len)) {
122             printf("sodium_sub() failed\n");
123         }
124         sodium_sub(buf1, buf1, bin_len);
125         if (!sodium_is_zero(buf1, bin_len)) {
126             printf("sodium_sub() failed\n");
127         }
128     }
129     assert(sizeof nonce >= 24U);
130     memset(nonce, 0xfe, 24U);
131     memset(nonce, 0xff, 6U);
132     sodium_increment(nonce, 8U);
133     printf("%s\n",
134            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
135     memset(nonce, 0xfe, 24U);
136     memset(nonce, 0xff, 10U);
137     sodium_increment(nonce, 12U);
138     printf("%s\n",
139            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
140     memset(nonce, 0xff, 22U);
141     sodium_increment(nonce, 24U);
142     printf("%s\n",
143            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
144 
145     assert(sizeof nonce >= 24U);
146     memset(nonce, 0xfe, 24U);
147     memset(nonce, 0xff, 6U);
148     sodium_add(nonce, nonce, 7U);
149     sodium_add(nonce, nonce, 8U);
150     printf("%s\n",
151            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
152     memset(nonce, 0xfe, 24U);
153     memset(nonce, 0xff, 10U);
154     sodium_add(nonce, nonce, 11U);
155     sodium_add(nonce, nonce, 12U);
156     printf("%s\n",
157            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
158     memset(nonce, 0xff, 22U);
159     sodium_add(nonce, nonce, 23U);
160     sodium_add(nonce, nonce, 24U);
161     printf("%s\n",
162            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
163     sodium_add(nonce, nonce, 0U);
164     printf("%s\n",
165            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
166     sodium_add(nonce, guard_page, 0U);
167     printf("%s\n",
168            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
169     sodium_add(guard_page, nonce, 0U);
170 
171     sodium_sub(nonce, nonce, 0U);
172     printf("%s\n",
173            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
174     sodium_sub(nonce, guard_page, 0U);
175     printf("%s\n",
176            sodium_bin2hex(nonce_hex, sizeof nonce_hex, nonce, sizeof nonce));
177     sodium_sub(guard_page, nonce, 0U);
178 
179     randombytes_buf(buf1, 64U);
180     randombytes_buf(buf2, 64U);
181     memset(buf_add, 0, 64U);
182     sodium_add(buf_add, buf1, 64U);
183     assert(!sodium_is_zero(buf_add, 64U));
184     sodium_add(buf_add, buf2, 64U);
185     assert(!sodium_is_zero(buf_add, 64U));
186     sodium_sub(buf_add, buf1, 64U);
187     assert(!sodium_is_zero(buf_add, 64U));
188     sodium_sub(buf_add, buf2, 64U);
189     assert(sodium_is_zero(buf_add, 64U));
190 
191     for (i = 0; i < 2000U; i++) {
192         bin_len = randombytes_uniform(200U);
193         blocksize = 1U + randombytes_uniform(500U);
194         bin_padded_maxlen = bin_len + (blocksize - bin_len % blocksize);
195         bin_padded = (unsigned char *) sodium_malloc(bin_padded_maxlen);
196         randombytes_buf(bin_padded, bin_padded_maxlen);
197 
198         assert(sodium_pad(&bin_padded_len, bin_padded, bin_len,
199                           blocksize, bin_padded_maxlen - 1U) == -1);
200         assert(sodium_pad(NULL, bin_padded, bin_len,
201                           blocksize, bin_padded_maxlen + 1U) == 0);
202         assert(sodium_pad(&bin_padded_len, bin_padded, bin_len,
203                           blocksize, bin_padded_maxlen + 1U) == 0);
204         assert(sodium_pad(&bin_padded_len, bin_padded, bin_len,
205                           0U, bin_padded_maxlen) == -1);
206         assert(sodium_pad(&bin_padded_len, bin_padded, bin_len,
207                           blocksize, bin_padded_maxlen) == 0);
208         assert(bin_padded_len == bin_padded_maxlen);
209 
210         assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len,
211                             bin_padded_len + 1U) == -1);
212         assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len,
213                             0U) == -1);
214         assert(sodium_unpad(&bin_len2, bin_padded, bin_padded_len,
215                             blocksize) == 0);
216         assert(bin_len2 == bin_len);
217 
218         sodium_free(bin_padded);
219     }
220 
221     sodium_stackzero(512);
222 
223     return 0;
224 }
225