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