1 /*      $OpenBSD: chachapoly_test.c,v 1.3 2021/12/14 06:27:48 deraadt Exp $  */
2 
3 /*
4  * Copyright (c) 2010,2015 Mike Belopuhov <mikeb@openbsd.org>
5  * Copyright (c) 2005 Markus Friedl <markus@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/types.h>
21 #include <crypto/chachapoly.h>
22 #include <err.h>
23 #include <errno.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <stdio.h>
27 
28 #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
29 
30 int debug = 0;
31 
32 enum { TST_KEY, TST_IV, TST_AAD, TST_PLAIN, TST_CIPHER, TST_TAG, TST_NUM };
33 
34 struct {
35 	char	*data[TST_NUM];
36 } tests[] = {
37 	/* Chacha20, counter=1 test vectors */
38 
39 	/* Test vector from RFC7539 2.4.2 */
40 	{
41 		/* key + salt */
42 		"00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f "
43 		"10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f "
44 		"00 00 00 00",
45 		/* iv */
46 		"00 00 00 4a 00 00 00 00",
47 		/* aad */
48 		NULL,
49 		/* plaintext */
50 		"4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c "
51 		"65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 "
52 		"73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 "
53 		"6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f "
54 		"6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 "
55 		"74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 "
56 		"63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 "
57 		"74 2e",
58 		/* ciphertext */
59 		"6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81 "
60 		"e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b "
61 		"f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57 "
62 		"16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8 "
63 		"07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e "
64 		"52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36 "
65 		"5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42 "
66 		"87 4d",
67 		/* tag */
68 		NULL
69 	},
70 
71 	/* Test vector#2 from RFC7539 A.2 */
72 	{
73 		/* key + salt */
74 		"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "
75 		"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 "
76 		"00 00 00 00",
77 		/* iv */
78 		"00 00 00 00 00 00 00 02",
79 		/* aad */
80 		NULL,
81 		/* plaintext */
82 		"41 6e 79 20 73 75 62 6d 69 73 73 69 6f 6e 20 74 "
83 		"6f 20 74 68 65 20 49 45 54 46 20 69 6e 74 65 6e "
84 		"64 65 64 20 62 79 20 74 68 65 20 43 6f 6e 74 72 "
85 		"69 62 75 74 6f 72 20 66 6f 72 20 70 75 62 6c 69 "
86 		"63 61 74 69 6f 6e 20 61 73 20 61 6c 6c 20 6f 72 "
87 		"20 70 61 72 74 20 6f 66 20 61 6e 20 49 45 54 46 "
88 		"20 49 6e 74 65 72 6e 65 74 2d 44 72 61 66 74 20 "
89 		"6f 72 20 52 46 43 20 61 6e 64 20 61 6e 79 20 73 "
90 		"74 61 74 65 6d 65 6e 74 20 6d 61 64 65 20 77 69 "
91 		"74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 "
92 		"20 6f 66 20 61 6e 20 49 45 54 46 20 61 63 74 69 "
93 		"76 69 74 79 20 69 73 20 63 6f 6e 73 69 64 65 72 "
94 		"65 64 20 61 6e 20 22 49 45 54 46 20 43 6f 6e 74 "
95 		"72 69 62 75 74 69 6f 6e 22 2e 20 53 75 63 68 20 "
96 		"73 74 61 74 65 6d 65 6e 74 73 20 69 6e 63 6c 75 "
97 		"64 65 20 6f 72 61 6c 20 73 74 61 74 65 6d 65 6e "
98 		"74 73 20 69 6e 20 49 45 54 46 20 73 65 73 73 69 "
99 		"6f 6e 73 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 "
100 		"77 72 69 74 74 65 6e 20 61 6e 64 20 65 6c 65 63 "
101 		"74 72 6f 6e 69 63 20 63 6f 6d 6d 75 6e 69 63 61 "
102 		"74 69 6f 6e 73 20 6d 61 64 65 20 61 74 20 61 6e "
103 		"79 20 74 69 6d 65 20 6f 72 20 70 6c 61 63 65 2c "
104 		"20 77 68 69 63 68 20 61 72 65 20 61 64 64 72 65 "
105 		"73 73 65 64 20 74 6f",
106 		/* ciphertext */
107 		"a3 fb f0 7d f3 fa 2f de 4f 37 6c a2 3e 82 73 70 "
108 		"41 60 5d 9f 4f 4f 57 bd 8c ff 2c 1d 4b 79 55 ec "
109 		"2a 97 94 8b d3 72 29 15 c8 f3 d3 37 f7 d3 70 05 "
110 		"0e 9e 96 d6 47 b7 c3 9f 56 e0 31 ca 5e b6 25 0d "
111 		"40 42 e0 27 85 ec ec fa 4b 4b b5 e8 ea d0 44 0e "
112 		"20 b6 e8 db 09 d8 81 a7 c6 13 2f 42 0e 52 79 50 "
113 		"42 bd fa 77 73 d8 a9 05 14 47 b3 29 1c e1 41 1c "
114 		"68 04 65 55 2a a6 c4 05 b7 76 4d 5e 87 be a8 5a "
115 		"d0 0f 84 49 ed 8f 72 d0 d6 62 ab 05 26 91 ca 66 "
116 		"42 4b c8 6d 2d f8 0e a4 1f 43 ab f9 37 d3 25 9d "
117 		"c4 b2 d0 df b4 8a 6c 91 39 dd d7 f7 69 66 e9 28 "
118 		"e6 35 55 3b a7 6c 5c 87 9d 7b 35 d4 9e b2 e6 2b "
119 		"08 71 cd ac 63 89 39 e2 5e 8a 1e 0e f9 d5 28 0f "
120 		"a8 ca 32 8b 35 1c 3c 76 59 89 cb cf 3d aa 8b 6c "
121 		"cc 3a af 9f 39 79 c9 2b 37 20 fc 88 dc 95 ed 84 "
122 		"a1 be 05 9c 64 99 b9 fd a2 36 e7 e8 18 b0 4b 0b "
123 		"c3 9c 1e 87 6b 19 3b fe 55 69 75 3f 88 12 8c c0 "
124 		"8a aa 9b 63 d1 a1 6f 80 ef 25 54 d7 18 9c 41 1f "
125 		"58 69 ca 52 c5 b8 3f a3 6f f2 16 b9 c1 d3 00 62 "
126 		"be bc fd 2d c5 bc e0 91 19 34 fd a7 9a 86 f6 e6 "
127 		"98 ce d7 59 c3 ff 9b 64 77 33 8f 3d a4 f9 cd 85 "
128 		"14 ea 99 82 cc af b3 41 b2 38 4d d9 02 f3 d1 ab "
129 		"7a c6 1d d2 9c 6f 21 ba 5b 86 2f 37 30 e3 7c fd "
130 		"c4 fd 80 6c 22 f2 21",
131 		/* tag */
132 		NULL
133 	},
134 
135 	/* Poly1305 test vectors */
136 
137 	/* Test vector from RFC7539 2.8.2 */
138 	{
139 		/* key + salt */
140 		"80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f "
141 		"90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f "
142 		"07 00 00 00",
143 		/* iv */
144 		"40 41 42 43 44 45 46 47",
145 		/* aad */
146 		"50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7",
147 		/* plaintext */
148 		"4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c "
149 		"65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 "
150 		"73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 "
151 		"6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f "
152 		"6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 "
153 		"74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 "
154 		"63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 "
155 		"74 2e",
156 		/* ciphertext */
157 		"d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 "
158 		"a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 "
159 		"3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b "
160 		"1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36 "
161 		"92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58 "
162 		"fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc "
163 		"3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b "
164 		"61 16",
165 		/* tag */
166 		"1a e1 0b 59 4f 09 e2 6a 7e 90 2e cb d0 60 06 91"
167 	},
168 
169 	/* Test vector from RFC7539 Appendix A.5 */
170 	{
171 		/* key + salt */
172 		"1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0 "
173 		"47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0 "
174 		"00 00 00 00",
175 		/* iv */
176 		"01 02 03 04 05 06 07 08",
177 		/* aad */
178 		"f3 33 88 86 00 00 00 00 00 00 4e 91",
179 		/* plaintext */
180 		"49 6e 74 65 72 6e 65 74 2d 44 72 61 66 74 73 20 "
181 		"61 72 65 20 64 72 61 66 74 20 64 6f 63 75 6d 65 "
182 		"6e 74 73 20 76 61 6c 69 64 20 66 6f 72 20 61 20 "
183 		"6d 61 78 69 6d 75 6d 20 6f 66 20 73 69 78 20 6d "
184 		"6f 6e 74 68 73 20 61 6e 64 20 6d 61 79 20 62 65 "
185 		"20 75 70 64 61 74 65 64 2c 20 72 65 70 6c 61 63 "
186 		"65 64 2c 20 6f 72 20 6f 62 73 6f 6c 65 74 65 64 "
187 		"20 62 79 20 6f 74 68 65 72 20 64 6f 63 75 6d 65 "
188 		"6e 74 73 20 61 74 20 61 6e 79 20 74 69 6d 65 2e "
189 		"20 49 74 20 69 73 20 69 6e 61 70 70 72 6f 70 72 "
190 		"69 61 74 65 20 74 6f 20 75 73 65 20 49 6e 74 65 "
191 		"72 6e 65 74 2d 44 72 61 66 74 73 20 61 73 20 72 "
192 		"65 66 65 72 65 6e 63 65 20 6d 61 74 65 72 69 61 "
193 		"6c 20 6f 72 20 74 6f 20 63 69 74 65 20 74 68 65 "
194 		"6d 20 6f 74 68 65 72 20 74 68 61 6e 20 61 73 20 "
195 		"2f e2 80 9c 77 6f 72 6b 20 69 6e 20 70 72 6f 67 "
196 		"72 65 73 73 2e 2f e2 80 9d",
197 		/* ciphertext */
198 		"64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd "
199 		"5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2 "
200 		"4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0 "
201 		"bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf "
202 		"33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81 "
203 		"14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55 "
204 		"97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38 "
205 		"36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4 "
206 		"b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9 "
207 		"90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e "
208 		"af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a "
209 		"0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a "
210 		"0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e "
211 		"ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10 "
212 		"49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30 "
213 		"30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29 "
214 		"a6 ad 5c b4 02 2b 02 70 9b",
215 		/* tag */
216 		"ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38"
217 	},
218 
219 	/* Test vector from RFC7634 Appendix A */
220 	{
221 		/* key + salt */
222 		"80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f "
223 		"90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f "
224 		"a0 a1 a2 a3",
225 		/* iv */
226 		"10 11 12 13 14 15 16 17",
227 		/* aad */
228 		"01 02 03 04 00 00 00 05",
229 		/* plaintext */
230 		"45 00 00 54 a6 f2 00 00 40 01 e7 78 c6 33 64 05 "
231 		"c0 00 02 05 08 00 5b 7a 3a 08 00 00 55 3b ec 10 "
232 		"00 07 36 27 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 "
233 		"14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 "
234 		"24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 "
235 		"34 35 36 37 01 02 02 04",
236 		/* ciphertext */
237 		"24 03 94 28 b9 7f 41 7e 3c 13 75 3a 4f 05 08 7b "
238 		"67 c3 52 e6 a7 fa b1 b9 82 d4 66 ef 40 7a e5 c6 "
239 		"14 ee 80 99 d5 28 44 eb 61 aa 95 df ab 4c 02 f7 "
240 		"2a a7 1e 7c 4c 4f 64 c9 be fe 2f ac c6 38 e8 f3 "
241 		"cb ec 16 3f ac 46 9b 50 27 73 f6 fb 94 e6 64 da "
242 		"91 65 b8 28 29 f6 41 e0",
243 		/* tag */
244 		"76 aa a8 26 6b 7f b0 f7 b1 1b 36 99 07 e1 ad 43"
245 	},
246 
247 	/* Test vector from RFC7634 Appendix B */
248 	{
249 		/* key + salt */
250 		"80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f "
251 		"90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f "
252 		"a0 a1 a2 a3",
253 		/* iv */
254 		"10 11 12 13 14 15 16 17",
255 		/* aad */
256 		"c0 c1 c2 c3 c4 c5 c6 c7 d0 d1 d2 d3 d4 d5 d6 d7 "
257 		"2e 20 25 00 00 00 00 09 00 00 00 45 29 00 00 29",
258 		/* plaintext */
259 		"00 00 00 0c 00 00 40 01 00 00 00 0a 00",
260 		/* ciphertext */
261 		"61 03 94 70 1f 8d 01 7f 7c 12 92 48 89",
262 		/* tag */
263 		"6b 71 bf e2 52 36 ef d7 cd c6 70 66 90 63 15 b2"
264 	},
265 
266 	/* Chacha20 test cases from the libcrypto aeadtests.txt */
267 	{
268 		/* key + salt */
269 		"42 90 bc b1 54 17 35 31 f3 14 af 57 f3 be 3b 50 "
270 		"06 da 37 1e ce 27 2a fa 1b 5d bd d1 10 0a 10 07 "
271 		"00 00 00 00",
272 		/* iv */
273 		"cd 7c f6 7b e3 9c 79 4a",
274 		/* aad */
275 		NULL,
276 		/* plaintext */
277 		"86 d0 99 74 84 0b de d2 a5 ca",
278 		/* ciphertext */
279 		"e3 e4 46 f7 ed e9 a1 9b 62 a4",
280 		/* tag */
281 		NULL
282 	}
283 };
284 
285 static void
dochacha(unsigned char * key,size_t klen,unsigned char * iv,size_t ivlen,unsigned char * plain,size_t plen)286 dochacha(unsigned char *key, size_t klen, unsigned char *iv,
287     size_t ivlen, unsigned char *plain, size_t plen)
288 {
289 	struct chacha20_ctx ctx;
290 	uint8_t blk[CHACHA20_BLOCK_LEN];
291 	int i;
292 
293 	memset(&ctx, 0, sizeof ctx);
294 
295 	if (chacha20_setkey(&ctx, key, CHACHA20_KEYSIZE + CHACHA20_SALT))
296 		errx(1, "chacha20_setkey");
297 	chacha20_reinit((caddr_t)&ctx, iv);
298 
299 	while (plen >= CHACHA20_BLOCK_LEN) {
300 		chacha20_crypt((caddr_t)&ctx, plain);
301 		plain += CHACHA20_BLOCK_LEN;
302 		plen -= CHACHA20_BLOCK_LEN;
303 	}
304 	if (plen > 0) {
305 		for (i = 0; i < plen; i++)
306 			blk[i] = plain[i];
307 		for (; i < CHACHA20_BLOCK_LEN; i++)
308 			blk[i] = 0;
309 		chacha20_crypt((caddr_t)&ctx, blk);
310 		memcpy(plain, blk, plen);
311 	}
312 }
313 
314 static void
dopoly(const unsigned char * key,size_t klen,const unsigned char * iv,size_t ivlen,const unsigned char * aad,size_t aadlen,const unsigned char * in,unsigned char * out,size_t len)315 dopoly(const unsigned char *key, size_t klen,
316     const unsigned char *iv, size_t ivlen,
317     const unsigned char *aad, size_t aadlen,
318     const unsigned char *in, unsigned char *out, size_t len)
319 {
320 	CHACHA20_POLY1305_CTX ctx;
321 	uint8_t blk[CHACHA20_BLOCK_LEN];
322 	uint32_t *p;
323 	int i;
324 
325 	Chacha20_Poly1305_Init(&ctx);
326 
327 	Chacha20_Poly1305_Setkey(&ctx, key, klen);
328 
329 	Chacha20_Poly1305_Reinit(&ctx, iv, ivlen);
330 
331 	for (i = 0; i < aadlen; i += POLY1305_BLOCK_LEN) {
332 		memset(blk, 0, POLY1305_BLOCK_LEN);
333 		memcpy(blk, aad + i, MINIMUM(aadlen - i, POLY1305_BLOCK_LEN));
334 		Chacha20_Poly1305_Update(&ctx, blk, POLY1305_BLOCK_LEN);
335 	}
336 
337 	for (i = 0; i < len; i += CHACHA20_BLOCK_LEN) {
338 		int dlen = MINIMUM(len - i, CHACHA20_BLOCK_LEN);
339 		Chacha20_Poly1305_Update(&ctx, in + i, dlen);
340 	}
341 
342 	bzero(blk, sizeof blk);
343 	p = (uint32_t *)blk;
344 	*p = htole32(aadlen);
345 	p = (uint32_t *)blk + 2;
346 	*p = htole32(len);
347 	Chacha20_Poly1305_Update(&ctx, blk, POLY1305_BLOCK_LEN);
348 
349 	Chacha20_Poly1305_Final(out, &ctx);
350 }
351 
352 static int
match(unsigned char * a,unsigned char * b,size_t len)353 match(unsigned char *a, unsigned char *b, size_t len)
354 {
355 	int i;
356 
357 	if (memcmp(a, b, len) == 0)
358 		return (1);
359 
360 	warnx("mismatch");
361 
362 	for (i = 0; i < len; i++)
363 		printf("%2.2x", a[i]);
364 	printf("\n");
365 	for (i = 0; i < len; i++)
366 		printf("%2.2x", b[i]);
367 	printf("\n");
368 
369 	return (0);
370 }
371 
372 static int
run(int num)373 run(int num)
374 {
375 	int i, fail = 1, len, j, length[TST_NUM];
376 	u_long val;
377 	char *ep, *from;
378 	u_char *p, *data[TST_NUM], tag[POLY1305_TAGLEN];
379 	u_char *ciphertext;
380 
381 	for (i = 0; i < TST_NUM; i++)
382 		data[i] = NULL;
383 	for (i = 0; i < TST_NUM; i++) {
384 		from = tests[num].data[i];
385 		if (debug)
386 			printf("%s\n", from);
387 		if (!from) {
388 			length[i] = 0;
389 			data[i] = NULL;
390 			continue;
391 		}
392 		len = strlen(from);
393 		if ((p = malloc(len)) == NULL) {
394 			warn("malloc");
395 			goto done;
396 		}
397 		errno = 0;
398 		for (j = 0; j < len; j++) {
399 			val = strtoul(&from[j*3], &ep, 16);
400 			p[j] = (u_char)val;
401 			if (*ep == '\0' || errno)
402 				break;
403 		}
404 		length[i] = j+1;
405 		data[i] = p;
406 	}
407 
408 	if (length[TST_PLAIN] != 0) {
409 		dochacha(data[TST_KEY], length[TST_KEY], data[TST_IV],
410 		    length[TST_IV], data[TST_PLAIN], length[TST_PLAIN]);
411 		fail = !match(data[TST_CIPHER], data[TST_PLAIN],
412 		    length[TST_PLAIN]);
413 		printf("%s test vector %d (Chacha20)\n",
414 		    fail ? "FAILED" : "OK", num);
415 	}
416 	if (length[TST_AAD] != 0) {
417 		dopoly(data[TST_KEY], length[TST_KEY], data[TST_IV],
418 		    length[TST_IV], data[TST_AAD], length[TST_AAD],
419 		    data[TST_CIPHER], tag, length[TST_CIPHER]);
420 		fail = !match(data[TST_TAG], tag, POLY1305_TAGLEN);
421 		printf("%s test vector %d (Poly1305)\n",
422 		    fail ? "FAILED" : "OK", num);
423 	}
424 
425  done:
426 	for (i = 0; i < TST_NUM; i++)
427 		free(data[i]);
428 	return (fail);
429 }
430 
431 int
main(void)432 main(void)
433 {
434 	int i, fail = 0;
435 
436 	for (i = 0; i < (sizeof(tests) / sizeof(tests[0])); i++)
437 		fail += run(i);
438 
439 	return (fail > 0 ? 1 : 0);
440 }
441