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