xref: /freebsd-src/sys/contrib/libsodium/test/default/secretstream.c (revision 3611ec604864a7d4dcc9a3ea898c80eb35eef8a0)
1*0ac341f1SConrad Meyer 
2*0ac341f1SConrad Meyer #define TEST_NAME "secretstream"
3*0ac341f1SConrad Meyer #include "cmptest.h"
4*0ac341f1SConrad Meyer 
5*0ac341f1SConrad Meyer int
main(void)6*0ac341f1SConrad Meyer main(void)
7*0ac341f1SConrad Meyer {
8*0ac341f1SConrad Meyer     crypto_secretstream_xchacha20poly1305_state *state, *statesave;
9*0ac341f1SConrad Meyer     crypto_secretstream_xchacha20poly1305_state state_copy;
10*0ac341f1SConrad Meyer     unsigned char      *ad;
11*0ac341f1SConrad Meyer     unsigned char      *header;
12*0ac341f1SConrad Meyer     unsigned char      *k;
13*0ac341f1SConrad Meyer     unsigned char      *c1, *c2, *c3, *csave;
14*0ac341f1SConrad Meyer     unsigned char      *m1, *m2, *m3;
15*0ac341f1SConrad Meyer     unsigned char      *m1_, *m2_, *m3_;
16*0ac341f1SConrad Meyer     unsigned long long  res_len;
17*0ac341f1SConrad Meyer     size_t              ad_len;
18*0ac341f1SConrad Meyer     size_t              m1_len, m2_len, m3_len;
19*0ac341f1SConrad Meyer     int                 ret;
20*0ac341f1SConrad Meyer     unsigned char       tag;
21*0ac341f1SConrad Meyer 
22*0ac341f1SConrad Meyer     state = (crypto_secretstream_xchacha20poly1305_state *)
23*0ac341f1SConrad Meyer         sodium_malloc(crypto_secretstream_xchacha20poly1305_statebytes());
24*0ac341f1SConrad Meyer     statesave = (crypto_secretstream_xchacha20poly1305_state *)
25*0ac341f1SConrad Meyer         sodium_malloc(crypto_secretstream_xchacha20poly1305_statebytes());
26*0ac341f1SConrad Meyer     header = (unsigned char *)
27*0ac341f1SConrad Meyer         sodium_malloc(crypto_secretstream_xchacha20poly1305_HEADERBYTES);
28*0ac341f1SConrad Meyer 
29*0ac341f1SConrad Meyer     ad_len = randombytes_uniform(100);
30*0ac341f1SConrad Meyer     m1_len = randombytes_uniform(1000);
31*0ac341f1SConrad Meyer     m2_len = randombytes_uniform(1000);
32*0ac341f1SConrad Meyer     m3_len = randombytes_uniform(1000);
33*0ac341f1SConrad Meyer 
34*0ac341f1SConrad Meyer     c1 = (unsigned char *)
35*0ac341f1SConrad Meyer         sodium_malloc(m1_len + crypto_secretstream_xchacha20poly1305_ABYTES);
36*0ac341f1SConrad Meyer     c2 = (unsigned char *)
37*0ac341f1SConrad Meyer         sodium_malloc(m2_len + crypto_secretstream_xchacha20poly1305_ABYTES);
38*0ac341f1SConrad Meyer     c3 = (unsigned char *)
39*0ac341f1SConrad Meyer         sodium_malloc(m3_len + crypto_secretstream_xchacha20poly1305_ABYTES);
40*0ac341f1SConrad Meyer     csave = (unsigned char *)
41*0ac341f1SConrad Meyer         sodium_malloc((m1_len | m2_len | m3_len) + crypto_secretstream_xchacha20poly1305_ABYTES);
42*0ac341f1SConrad Meyer 
43*0ac341f1SConrad Meyer     ad  = (unsigned char *) sodium_malloc(ad_len);
44*0ac341f1SConrad Meyer     m1  = (unsigned char *) sodium_malloc(m1_len);
45*0ac341f1SConrad Meyer     m2  = (unsigned char *) sodium_malloc(m2_len);
46*0ac341f1SConrad Meyer     m3  = (unsigned char *) sodium_malloc(m3_len);
47*0ac341f1SConrad Meyer     m1_ = (unsigned char *) sodium_malloc(m1_len);
48*0ac341f1SConrad Meyer     m2_ = (unsigned char *) sodium_malloc(m2_len);
49*0ac341f1SConrad Meyer     m3_ = (unsigned char *) sodium_malloc(m3_len);
50*0ac341f1SConrad Meyer 
51*0ac341f1SConrad Meyer     randombytes_buf(ad, ad_len);
52*0ac341f1SConrad Meyer 
53*0ac341f1SConrad Meyer     randombytes_buf(m1, m1_len);
54*0ac341f1SConrad Meyer     memcpy(m1_, m1, m1_len);
55*0ac341f1SConrad Meyer     randombytes_buf(m2, m2_len);
56*0ac341f1SConrad Meyer     memcpy(m2_, m2, m2_len);
57*0ac341f1SConrad Meyer     randombytes_buf(m3, m3_len);
58*0ac341f1SConrad Meyer     memcpy(m3_, m3, m3_len);
59*0ac341f1SConrad Meyer 
60*0ac341f1SConrad Meyer     k = (unsigned char *)
61*0ac341f1SConrad Meyer         sodium_malloc(crypto_secretstream_xchacha20poly1305_KEYBYTES);
62*0ac341f1SConrad Meyer     crypto_secretstream_xchacha20poly1305_keygen(k);
63*0ac341f1SConrad Meyer 
64*0ac341f1SConrad Meyer     /* push */
65*0ac341f1SConrad Meyer 
66*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_push(state, header, k);
67*0ac341f1SConrad Meyer     assert(ret == 0);
68*0ac341f1SConrad Meyer 
69*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
70*0ac341f1SConrad Meyer         (state, c1, &res_len, m1, m1_len, NULL, 0, 0);
71*0ac341f1SConrad Meyer     assert(ret == 0);
72*0ac341f1SConrad Meyer     assert(res_len == m1_len + crypto_secretstream_xchacha20poly1305_ABYTES);
73*0ac341f1SConrad Meyer 
74*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
75*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, ad, 0, 0);
76*0ac341f1SConrad Meyer     assert(ret == 0);
77*0ac341f1SConrad Meyer 
78*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
79*0ac341f1SConrad Meyer         (state, c3, NULL, m3, m3_len, ad, ad_len,
80*0ac341f1SConrad Meyer          crypto_secretstream_xchacha20poly1305_TAG_FINAL);
81*0ac341f1SConrad Meyer     assert(ret == 0);
82*0ac341f1SConrad Meyer 
83*0ac341f1SConrad Meyer     /* pull */
84*0ac341f1SConrad Meyer 
85*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_pull(state, header, k);
86*0ac341f1SConrad Meyer     assert(ret == 0);
87*0ac341f1SConrad Meyer 
88*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
89*0ac341f1SConrad Meyer         (state, m1, &res_len, &tag,
90*0ac341f1SConrad Meyer          c1, m1_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
91*0ac341f1SConrad Meyer     assert(ret == 0);
92*0ac341f1SConrad Meyer     assert(tag == 0);
93*0ac341f1SConrad Meyer     assert(memcmp(m1, m1_, m1_len) == 0);
94*0ac341f1SConrad Meyer     assert(res_len == m1_len);
95*0ac341f1SConrad Meyer 
96*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
97*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
98*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
99*0ac341f1SConrad Meyer     assert(ret == 0);
100*0ac341f1SConrad Meyer     assert(tag == 0);
101*0ac341f1SConrad Meyer     assert(memcmp(m2, m2_, m2_len) == 0);
102*0ac341f1SConrad Meyer 
103*0ac341f1SConrad Meyer     if (ad_len > 0) {
104*0ac341f1SConrad Meyer         ret = crypto_secretstream_xchacha20poly1305_pull
105*0ac341f1SConrad Meyer             (state, m3, NULL, &tag,
106*0ac341f1SConrad Meyer              c3, m3_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
107*0ac341f1SConrad Meyer         assert(ret == -1);
108*0ac341f1SConrad Meyer     }
109*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
110*0ac341f1SConrad Meyer         (state, m3, NULL, &tag,
111*0ac341f1SConrad Meyer          c3, m3_len + crypto_secretstream_xchacha20poly1305_ABYTES, ad, ad_len);
112*0ac341f1SConrad Meyer     assert(ret == 0);
113*0ac341f1SConrad Meyer     assert(tag == crypto_secretstream_xchacha20poly1305_TAG_FINAL);
114*0ac341f1SConrad Meyer     assert(memcmp(m3, m3_, m3_len) == 0);
115*0ac341f1SConrad Meyer 
116*0ac341f1SConrad Meyer     /* previous with FINAL tag */
117*0ac341f1SConrad Meyer 
118*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
119*0ac341f1SConrad Meyer         (state, m3, NULL, &tag,
120*0ac341f1SConrad Meyer          c3, m3_len + crypto_secretstream_xchacha20poly1305_ABYTES, ad, ad_len);
121*0ac341f1SConrad Meyer     assert(ret == -1);
122*0ac341f1SConrad Meyer 
123*0ac341f1SConrad Meyer     /* previous without a tag */
124*0ac341f1SConrad Meyer 
125*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
126*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
127*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
128*0ac341f1SConrad Meyer     assert(ret == -1);
129*0ac341f1SConrad Meyer 
130*0ac341f1SConrad Meyer     /* short ciphertext */
131*0ac341f1SConrad Meyer 
132*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
133*0ac341f1SConrad Meyer         (state, m2, NULL, &tag, c2,
134*0ac341f1SConrad Meyer          randombytes_uniform(crypto_secretstream_xchacha20poly1305_ABYTES),
135*0ac341f1SConrad Meyer          NULL, 0);
136*0ac341f1SConrad Meyer     assert(ret == -1);
137*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
138*0ac341f1SConrad Meyer         (state, m2, NULL, &tag, c2, 0, NULL, 0);
139*0ac341f1SConrad Meyer     assert(ret == -1);
140*0ac341f1SConrad Meyer 
141*0ac341f1SConrad Meyer     /* empty ciphertext */
142*0ac341f1SConrad Meyer 
143*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
144*0ac341f1SConrad Meyer         (state, m2, NULL, &tag, c2,
145*0ac341f1SConrad Meyer          crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
146*0ac341f1SConrad Meyer     assert(ret == -1);
147*0ac341f1SConrad Meyer 
148*0ac341f1SConrad Meyer     /* without explicit rekeying */
149*0ac341f1SConrad Meyer 
150*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_push(state, header, k);
151*0ac341f1SConrad Meyer     assert(ret == 0);
152*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
153*0ac341f1SConrad Meyer         (state, c1, NULL, m1, m1_len, NULL, 0, 0);
154*0ac341f1SConrad Meyer     assert(ret == 0);
155*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
156*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, NULL, 0, 0);
157*0ac341f1SConrad Meyer     assert(ret == 0);
158*0ac341f1SConrad Meyer 
159*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_pull(state, header, k);
160*0ac341f1SConrad Meyer     assert(ret == 0);
161*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
162*0ac341f1SConrad Meyer         (state, m1, NULL, &tag,
163*0ac341f1SConrad Meyer          c1, m1_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
164*0ac341f1SConrad Meyer     assert(ret == 0);
165*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
166*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
167*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
168*0ac341f1SConrad Meyer     assert(ret == 0);
169*0ac341f1SConrad Meyer 
170*0ac341f1SConrad Meyer     /* with explicit rekeying */
171*0ac341f1SConrad Meyer 
172*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_push(state, header, k);
173*0ac341f1SConrad Meyer     assert(ret == 0);
174*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
175*0ac341f1SConrad Meyer         (state, c1, NULL, m1, m1_len, NULL, 0, 0);
176*0ac341f1SConrad Meyer     assert(ret == 0);
177*0ac341f1SConrad Meyer 
178*0ac341f1SConrad Meyer     crypto_secretstream_xchacha20poly1305_rekey(state);
179*0ac341f1SConrad Meyer 
180*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
181*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, NULL, 0, 0);
182*0ac341f1SConrad Meyer     assert(ret == 0);
183*0ac341f1SConrad Meyer 
184*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_pull(state, header, k);
185*0ac341f1SConrad Meyer     assert(ret == 0);
186*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
187*0ac341f1SConrad Meyer         (state, m1, NULL, &tag,
188*0ac341f1SConrad Meyer          c1, m1_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
189*0ac341f1SConrad Meyer     assert(ret == 0);
190*0ac341f1SConrad Meyer 
191*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
192*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
193*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
194*0ac341f1SConrad Meyer     assert(ret == -1);
195*0ac341f1SConrad Meyer 
196*0ac341f1SConrad Meyer     crypto_secretstream_xchacha20poly1305_rekey(state);
197*0ac341f1SConrad Meyer 
198*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
199*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
200*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
201*0ac341f1SConrad Meyer     assert(ret == 0);
202*0ac341f1SConrad Meyer 
203*0ac341f1SConrad Meyer     /* with explicit rekeying using TAG_REKEY */
204*0ac341f1SConrad Meyer 
205*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_push(state, header, k);
206*0ac341f1SConrad Meyer     assert(ret == 0);
207*0ac341f1SConrad Meyer 
208*0ac341f1SConrad Meyer     memcpy(statesave, state, sizeof *state);
209*0ac341f1SConrad Meyer 
210*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
211*0ac341f1SConrad Meyer         (state, c1, NULL, m1, m1_len, NULL, 0, crypto_secretstream_xchacha20poly1305_TAG_REKEY);
212*0ac341f1SConrad Meyer     assert(ret == 0);
213*0ac341f1SConrad Meyer 
214*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
215*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, NULL, 0, 0);
216*0ac341f1SConrad Meyer     assert(ret == 0);
217*0ac341f1SConrad Meyer 
218*0ac341f1SConrad Meyer     memcpy(csave, c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES);
219*0ac341f1SConrad Meyer 
220*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_pull(state, header, k);
221*0ac341f1SConrad Meyer     assert(ret == 0);
222*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
223*0ac341f1SConrad Meyer         (state, m1, NULL, &tag,
224*0ac341f1SConrad Meyer          c1, m1_len + crypto_secretstream_xchacha20poly1305_ABYTES, &tag, 0);
225*0ac341f1SConrad Meyer     assert(ret == 0);
226*0ac341f1SConrad Meyer     assert(tag == crypto_secretstream_xchacha20poly1305_TAG_REKEY);
227*0ac341f1SConrad Meyer 
228*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
229*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
230*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, &tag, 0);
231*0ac341f1SConrad Meyer     assert(ret == 0);
232*0ac341f1SConrad Meyer     assert(tag == 0);
233*0ac341f1SConrad Meyer 
234*0ac341f1SConrad Meyer     memcpy(state, statesave, sizeof *state);
235*0ac341f1SConrad Meyer 
236*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
237*0ac341f1SConrad Meyer         (state, c1, NULL, m1, m1_len, NULL, 0, 0);
238*0ac341f1SConrad Meyer     assert(ret == 0);
239*0ac341f1SConrad Meyer 
240*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
241*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, NULL, 0, 0);
242*0ac341f1SConrad Meyer     assert(ret == 0);
243*0ac341f1SConrad Meyer 
244*0ac341f1SConrad Meyer     assert(memcmp(csave, c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES) != 0);
245*0ac341f1SConrad Meyer 
246*0ac341f1SConrad Meyer     /* New stream */
247*0ac341f1SConrad Meyer 
248*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_push(state, header, k);
249*0ac341f1SConrad Meyer     assert(ret == 0);
250*0ac341f1SConrad Meyer 
251*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
252*0ac341f1SConrad Meyer         (state, c1, &res_len, m1, m1_len, NULL, 0,
253*0ac341f1SConrad Meyer          crypto_secretstream_xchacha20poly1305_TAG_PUSH);
254*0ac341f1SConrad Meyer     assert(ret == 0);
255*0ac341f1SConrad Meyer     assert(res_len == m1_len + crypto_secretstream_xchacha20poly1305_ABYTES);
256*0ac341f1SConrad Meyer 
257*0ac341f1SConrad Meyer     /* Force a counter overflow, check that the key has been updated
258*0ac341f1SConrad Meyer      * even though the tag was not changed to REKEY */
259*0ac341f1SConrad Meyer 
260*0ac341f1SConrad Meyer     memset(state->nonce, 0xff, 4U);
261*0ac341f1SConrad Meyer     state_copy = *state;
262*0ac341f1SConrad Meyer 
263*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_push
264*0ac341f1SConrad Meyer         (state, c2, NULL, m2, m2_len, ad, 0, 0);
265*0ac341f1SConrad Meyer     assert(ret == 0);
266*0ac341f1SConrad Meyer 
267*0ac341f1SConrad Meyer     assert(memcmp(state_copy.k, state->k, sizeof state->k) != 0);
268*0ac341f1SConrad Meyer     assert(memcmp(state_copy.nonce, state->nonce, sizeof state->nonce) != 0);
269*0ac341f1SConrad Meyer     assert(state->nonce[0] == 1U);
270*0ac341f1SConrad Meyer     assert(sodium_is_zero(state->nonce + 1, 3U));
271*0ac341f1SConrad Meyer 
272*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_init_pull(state, header, k);
273*0ac341f1SConrad Meyer     assert(ret == 0);
274*0ac341f1SConrad Meyer 
275*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
276*0ac341f1SConrad Meyer         (state, m1, &res_len, &tag,
277*0ac341f1SConrad Meyer          c1, m1_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
278*0ac341f1SConrad Meyer     assert(ret == 0);
279*0ac341f1SConrad Meyer     assert(tag == crypto_secretstream_xchacha20poly1305_TAG_PUSH);
280*0ac341f1SConrad Meyer     assert(memcmp(m1, m1_, m1_len) == 0);
281*0ac341f1SConrad Meyer     assert(res_len == m1_len);
282*0ac341f1SConrad Meyer 
283*0ac341f1SConrad Meyer     memset(state->nonce, 0xff, 4U);
284*0ac341f1SConrad Meyer 
285*0ac341f1SConrad Meyer     ret = crypto_secretstream_xchacha20poly1305_pull
286*0ac341f1SConrad Meyer         (state, m2, NULL, &tag,
287*0ac341f1SConrad Meyer          c2, m2_len + crypto_secretstream_xchacha20poly1305_ABYTES, NULL, 0);
288*0ac341f1SConrad Meyer     assert(ret == 0);
289*0ac341f1SConrad Meyer     assert(tag == 0);
290*0ac341f1SConrad Meyer     assert(memcmp(m2, m2_, m2_len) == 0);
291*0ac341f1SConrad Meyer 
292*0ac341f1SConrad Meyer     sodium_free(m3_);
293*0ac341f1SConrad Meyer     sodium_free(m2_);
294*0ac341f1SConrad Meyer     sodium_free(m1_);
295*0ac341f1SConrad Meyer     sodium_free(m3);
296*0ac341f1SConrad Meyer     sodium_free(m2);
297*0ac341f1SConrad Meyer     sodium_free(m1);
298*0ac341f1SConrad Meyer     sodium_free(ad);
299*0ac341f1SConrad Meyer     sodium_free(csave);
300*0ac341f1SConrad Meyer     sodium_free(c3);
301*0ac341f1SConrad Meyer     sodium_free(c2);
302*0ac341f1SConrad Meyer     sodium_free(c1);
303*0ac341f1SConrad Meyer     sodium_free(k);
304*0ac341f1SConrad Meyer     sodium_free(header);
305*0ac341f1SConrad Meyer     sodium_free(statesave);
306*0ac341f1SConrad Meyer     sodium_free(state);
307*0ac341f1SConrad Meyer 
308*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_abytes() ==
309*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_ABYTES);
310*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_headerbytes() ==
311*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_HEADERBYTES);
312*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_keybytes() ==
313*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_KEYBYTES);
314*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_messagebytes_max() ==
315*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX);
316*0ac341f1SConrad Meyer 
317*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_tag_message() ==
318*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_TAG_MESSAGE);
319*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_tag_push() ==
320*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_TAG_PUSH);
321*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_tag_rekey() ==
322*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_TAG_REKEY);
323*0ac341f1SConrad Meyer     assert(crypto_secretstream_xchacha20poly1305_tag_final() ==
324*0ac341f1SConrad Meyer            crypto_secretstream_xchacha20poly1305_TAG_FINAL);
325*0ac341f1SConrad Meyer 
326*0ac341f1SConrad Meyer     printf("OK\n");
327*0ac341f1SConrad Meyer 
328*0ac341f1SConrad Meyer     return 0;
329*0ac341f1SConrad Meyer }
330