xref: /openbsd-src/regress/lib/libcrypto/chacha/chachatest.c (revision 64bf23976d44f1dec50f86a3ac43a0945d6605be)
1*64bf2397Sdlg /*	$OpenBSD: chachatest.c,v 1.6 2019/01/22 00:59:21 dlg Exp $	*/
293d23226Sjsing /*
393d23226Sjsing  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
493d23226Sjsing  *
593d23226Sjsing  * Permission to use, copy, modify, and distribute this software for any
693d23226Sjsing  * purpose with or without fee is hereby granted, provided that the above
793d23226Sjsing  * copyright notice and this permission notice appear in all copies.
893d23226Sjsing  *
993d23226Sjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1093d23226Sjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1193d23226Sjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1293d23226Sjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1393d23226Sjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1493d23226Sjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1593d23226Sjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1693d23226Sjsing  */
1793d23226Sjsing 
1893d23226Sjsing #include <err.h>
1993d23226Sjsing #include <stdio.h>
2093d23226Sjsing #include <stdlib.h>
2193d23226Sjsing #include <string.h>
2293d23226Sjsing 
2393d23226Sjsing #include <openssl/chacha.h>
2493d23226Sjsing 
2593d23226Sjsing struct chacha_tv {
2693d23226Sjsing 	const char *desc;
2793d23226Sjsing 	const unsigned char key[32];
2893d23226Sjsing 	const unsigned char iv[8];
2993d23226Sjsing 	const size_t len;
3093d23226Sjsing 	const unsigned char out[512];
3193d23226Sjsing };
3293d23226Sjsing 
3393d23226Sjsing /*
3493d23226Sjsing  * Test vectors from:
3593d23226Sjsing  *   http://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-01
3693d23226Sjsing  */
3793d23226Sjsing struct chacha_tv chacha_test_vectors[] = {
3893d23226Sjsing 	{
3993d23226Sjsing 		"TC1: All zero key and IV",
4093d23226Sjsing 		{
4193d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4293d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4393d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4493d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4593d23226Sjsing 		},
4693d23226Sjsing 		{
4793d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4893d23226Sjsing 		},
4993d23226Sjsing 		64,
5093d23226Sjsing 		{
5193d23226Sjsing 			0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90,
5293d23226Sjsing 			0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28,
5393d23226Sjsing 			0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a,
5493d23226Sjsing 			0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7,
5593d23226Sjsing 			0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d,
5693d23226Sjsing 			0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37,
5793d23226Sjsing 			0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c,
5893d23226Sjsing 			0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86,
5993d23226Sjsing 		},
6093d23226Sjsing 	},
6193d23226Sjsing 	{
6293d23226Sjsing 		"TC2: Single bit in key set, all zero IV",
6393d23226Sjsing 		{
6493d23226Sjsing 			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6593d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6693d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6793d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6893d23226Sjsing 		},
6993d23226Sjsing 		{
7093d23226Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7193d23226Sjsing 		},
7293d23226Sjsing 		64,
7393d23226Sjsing 		{
7493d23226Sjsing 			0xc5, 0xd3, 0x0a, 0x7c, 0xe1, 0xec, 0x11, 0x93,
7593d23226Sjsing 			0x78, 0xc8, 0x4f, 0x48, 0x7d, 0x77, 0x5a, 0x85,
7693d23226Sjsing 			0x42, 0xf1, 0x3e, 0xce, 0x23, 0x8a, 0x94, 0x55,
7793d23226Sjsing 			0xe8, 0x22, 0x9e, 0x88, 0x8d, 0xe8, 0x5b, 0xbd,
7893d23226Sjsing 			0x29, 0xeb, 0x63, 0xd0, 0xa1, 0x7a, 0x5b, 0x99,
7993d23226Sjsing 			0x9b, 0x52, 0xda, 0x22, 0xbe, 0x40, 0x23, 0xeb,
8093d23226Sjsing 			0x07, 0x62, 0x0a, 0x54, 0xf6, 0xfa, 0x6a, 0xd8,
8193d23226Sjsing 			0x73, 0x7b, 0x71, 0xeb, 0x04, 0x64, 0xda, 0xc0,
8293d23226Sjsing 		},
8393d23226Sjsing 	},
8493d23226Sjsing 	{
8593d23226Sjsing 		"TC3: Single bit in IV set, all zero key",
8693d23226Sjsing 		{
87c44d47c0Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88c44d47c0Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89c44d47c0Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90c44d47c0Sjsing 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91c44d47c0Sjsing 		},
92c44d47c0Sjsing 		{
93c44d47c0Sjsing 			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94c44d47c0Sjsing 		},
95c44d47c0Sjsing 		64,
96c44d47c0Sjsing 		{
97c44d47c0Sjsing 			0xef, 0x3f, 0xdf, 0xd6, 0xc6, 0x15, 0x78, 0xfb,
98c44d47c0Sjsing 			0xf5, 0xcf, 0x35, 0xbd, 0x3d, 0xd3, 0x3b, 0x80,
99c44d47c0Sjsing 			0x09, 0x63, 0x16, 0x34, 0xd2, 0x1e, 0x42, 0xac,
100c44d47c0Sjsing 			0x33, 0x96, 0x0b, 0xd1, 0x38, 0xe5, 0x0d, 0x32,
101c44d47c0Sjsing 			0x11, 0x1e, 0x4c, 0xaf, 0x23, 0x7e, 0xe5, 0x3c,
102c44d47c0Sjsing 			0xa8, 0xad, 0x64, 0x26, 0x19, 0x4a, 0x88, 0x54,
103c44d47c0Sjsing 			0x5d, 0xdc, 0x49, 0x7a, 0x0b, 0x46, 0x6e, 0x7d,
104c44d47c0Sjsing 			0x6b, 0xbd, 0xb0, 0x04, 0x1b, 0x2f, 0x58, 0x6b
105c44d47c0Sjsing 		},
106c44d47c0Sjsing 	},
107c44d47c0Sjsing 	{
108c44d47c0Sjsing 		"TC4: All bits in key and IV are set",
109c44d47c0Sjsing 		{
11093d23226Sjsing 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11193d23226Sjsing 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11293d23226Sjsing 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11393d23226Sjsing 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11493d23226Sjsing 		},
11593d23226Sjsing 		{
11693d23226Sjsing 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11793d23226Sjsing 		},
11893d23226Sjsing 		64,
11993d23226Sjsing 		{
12093d23226Sjsing 			0xd9, 0xbf, 0x3f, 0x6b, 0xce, 0x6e, 0xd0, 0xb5,
12193d23226Sjsing 			0x42, 0x54, 0x55, 0x77, 0x67, 0xfb, 0x57, 0x44,
12293d23226Sjsing 			0x3d, 0xd4, 0x77, 0x89, 0x11, 0xb6, 0x06, 0x05,
12393d23226Sjsing 			0x5c, 0x39, 0xcc, 0x25, 0xe6, 0x74, 0xb8, 0x36,
12493d23226Sjsing 			0x3f, 0xea, 0xbc, 0x57, 0xfd, 0xe5, 0x4f, 0x79,
12593d23226Sjsing 			0x0c, 0x52, 0xc8, 0xae, 0x43, 0x24, 0x0b, 0x79,
12693d23226Sjsing 			0xd4, 0x90, 0x42, 0xb7, 0x77, 0xbf, 0xd6, 0xcb,
12793d23226Sjsing 			0x80, 0xe9, 0x31, 0x27, 0x0b, 0x7f, 0x50, 0xeb,
12893d23226Sjsing 		},
12993d23226Sjsing 	},
13093d23226Sjsing 	{
13193d23226Sjsing 		"TC5: Every even bit set in key and IV",
13293d23226Sjsing 		{
13393d23226Sjsing 			0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
13493d23226Sjsing 			0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
13593d23226Sjsing 			0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
13693d23226Sjsing 			0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
13793d23226Sjsing 		},
13893d23226Sjsing 		{
13993d23226Sjsing 			0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
14093d23226Sjsing 		},
14193d23226Sjsing 		64,
14293d23226Sjsing 		{
14393d23226Sjsing 			0xbe, 0xa9, 0x41, 0x1a, 0xa4, 0x53, 0xc5, 0x43,
14493d23226Sjsing 			0x4a, 0x5a, 0xe8, 0xc9, 0x28, 0x62, 0xf5, 0x64,
14593d23226Sjsing 			0x39, 0x68, 0x55, 0xa9, 0xea, 0x6e, 0x22, 0xd6,
14693d23226Sjsing 			0xd3, 0xb5, 0x0a, 0xe1, 0xb3, 0x66, 0x33, 0x11,
14793d23226Sjsing 			0xa4, 0xa3, 0x60, 0x6c, 0x67, 0x1d, 0x60, 0x5c,
14893d23226Sjsing 			0xe1, 0x6c, 0x3a, 0xec, 0xe8, 0xe6, 0x1e, 0xa1,
14993d23226Sjsing 			0x45, 0xc5, 0x97, 0x75, 0x01, 0x7b, 0xee, 0x2f,
15093d23226Sjsing 			0xa6, 0xf8, 0x8a, 0xfc, 0x75, 0x80, 0x69, 0xf7,
15193d23226Sjsing 		},
15293d23226Sjsing 	},
15393d23226Sjsing 	{
15493d23226Sjsing 		"TC6: Every odd bit set in key and IV",
15593d23226Sjsing 		{
15693d23226Sjsing 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
15793d23226Sjsing 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
15893d23226Sjsing 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
15993d23226Sjsing 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
16093d23226Sjsing 		},
16193d23226Sjsing 		{
16293d23226Sjsing 			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
16393d23226Sjsing 		},
16493d23226Sjsing 		64,
16593d23226Sjsing 		{
16693d23226Sjsing 			0x9a, 0xa2, 0xa9, 0xf6, 0x56, 0xef, 0xde, 0x5a,
16793d23226Sjsing 			0xa7, 0x59, 0x1c, 0x5f, 0xed, 0x4b, 0x35, 0xae,
16893d23226Sjsing 			0xa2, 0x89, 0x5d, 0xec, 0x7c, 0xb4, 0x54, 0x3b,
16993d23226Sjsing 			0x9e, 0x9f, 0x21, 0xf5, 0xe7, 0xbc, 0xbc, 0xf3,
17093d23226Sjsing 			0xc4, 0x3c, 0x74, 0x8a, 0x97, 0x08, 0x88, 0xf8,
17193d23226Sjsing 			0x24, 0x83, 0x93, 0xa0, 0x9d, 0x43, 0xe0, 0xb7,
17293d23226Sjsing 			0xe1, 0x64, 0xbc, 0x4d, 0x0b, 0x0f, 0xb2, 0x40,
17393d23226Sjsing 			0xa2, 0xd7, 0x21, 0x15, 0xc4, 0x80, 0x89, 0x06,
17493d23226Sjsing 		},
17593d23226Sjsing 	},
17693d23226Sjsing 	{
17793d23226Sjsing 		"TC7: Sequence patterns in key and IV",
17893d23226Sjsing 		{
17993d23226Sjsing 			0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
18093d23226Sjsing 			0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
18193d23226Sjsing 			0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
18293d23226Sjsing 			0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
18393d23226Sjsing 		},
18493d23226Sjsing 		{
18593d23226Sjsing 			0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78,
18693d23226Sjsing 		},
18793d23226Sjsing 		64,
18893d23226Sjsing 		{
18993d23226Sjsing 			0x9f, 0xad, 0xf4, 0x09, 0xc0, 0x08, 0x11, 0xd0,
19093d23226Sjsing 			0x04, 0x31, 0xd6, 0x7e, 0xfb, 0xd8, 0x8f, 0xba,
19193d23226Sjsing 			0x59, 0x21, 0x8d, 0x5d, 0x67, 0x08, 0xb1, 0xd6,
19293d23226Sjsing 			0x85, 0x86, 0x3f, 0xab, 0xbb, 0x0e, 0x96, 0x1e,
19393d23226Sjsing 			0xea, 0x48, 0x0f, 0xd6, 0xfb, 0x53, 0x2b, 0xfd,
19493d23226Sjsing 			0x49, 0x4b, 0x21, 0x51, 0x01, 0x50, 0x57, 0x42,
19593d23226Sjsing 			0x3a, 0xb6, 0x0a, 0x63, 0xfe, 0x4f, 0x55, 0xf7,
19693d23226Sjsing 			0xa2, 0x12, 0xe2, 0x16, 0x7c, 0xca, 0xb9, 0x31,
19793d23226Sjsing 		},
19893d23226Sjsing 	},
19993d23226Sjsing 	{
20093d23226Sjsing 		"TC8: key: 'All your base are belong to us!, IV: 'IETF2013'",
20193d23226Sjsing 		{
20293d23226Sjsing 			0xc4, 0x6e, 0xc1, 0xb1, 0x8c, 0xe8, 0xa8, 0x78,
20393d23226Sjsing 			0x72, 0x5a, 0x37, 0xe7, 0x80, 0xdf, 0xb7, 0x35,
20493d23226Sjsing 			0x1f, 0x68, 0xed, 0x2e, 0x19, 0x4c, 0x79, 0xfb,
20593d23226Sjsing 			0xc6, 0xae, 0xbe, 0xe1, 0xa6, 0x67, 0x97, 0x5d,
20693d23226Sjsing 		},
20793d23226Sjsing 		{
20893d23226Sjsing 			0x1a, 0xda, 0x31, 0xd5, 0xcf, 0x68, 0x82, 0x21,
20993d23226Sjsing 		},
21093d23226Sjsing 		64,
21193d23226Sjsing 		{
21293d23226Sjsing 			0xf6, 0x3a, 0x89, 0xb7, 0x5c, 0x22, 0x71, 0xf9,
21393d23226Sjsing 			0x36, 0x88, 0x16, 0x54, 0x2b, 0xa5, 0x2f, 0x06,
21493d23226Sjsing 			0xed, 0x49, 0x24, 0x17, 0x92, 0x30, 0x2b, 0x00,
21593d23226Sjsing 			0xb5, 0xe8, 0xf8, 0x0a, 0xe9, 0xa4, 0x73, 0xaf,
21693d23226Sjsing 			0xc2, 0x5b, 0x21, 0x8f, 0x51, 0x9a, 0xf0, 0xfd,
21793d23226Sjsing 			0xd4, 0x06, 0x36, 0x2e, 0x8d, 0x69, 0xde, 0x7f,
21893d23226Sjsing 			0x54, 0xc6, 0x04, 0xa6, 0xe0, 0x0f, 0x35, 0x3f,
21993d23226Sjsing 			0x11, 0x0f, 0x77, 0x1b, 0xdc, 0xa8, 0xab, 0x92,
22093d23226Sjsing 		},
22193d23226Sjsing 	},
22293d23226Sjsing };
22393d23226Sjsing 
22493d23226Sjsing #define N_VECTORS (sizeof(chacha_test_vectors) / sizeof(*chacha_test_vectors))
22593d23226Sjsing 
22678825ca7Sjsing /* Single-shot ChaCha20 using CRYPTO_chacha_20 interface. */
22778825ca7Sjsing static void
crypto_chacha_20_test(struct chacha_tv * tv,unsigned char * out,unsigned char * in)22878825ca7Sjsing crypto_chacha_20_test(struct chacha_tv *tv, unsigned char *out,
22978825ca7Sjsing     unsigned char *in)
23078825ca7Sjsing {
23178825ca7Sjsing 	CRYPTO_chacha_20(out, in, tv->len, tv->key, tv->iv, 0);
23278825ca7Sjsing }
23378825ca7Sjsing 
23478825ca7Sjsing /* Single-shot ChaCha20 using the ChaCha interface. */
23578825ca7Sjsing static void
chacha_ctx_full_test(struct chacha_tv * tv,unsigned char * out,unsigned char * in)23678825ca7Sjsing chacha_ctx_full_test(struct chacha_tv *tv, unsigned char *out,
23778825ca7Sjsing     unsigned char *in)
23878825ca7Sjsing {
23978825ca7Sjsing 	ChaCha_ctx ctx;
24078825ca7Sjsing 
24178825ca7Sjsing 	ChaCha_set_key(&ctx, tv->key, 256);
24278825ca7Sjsing 	ChaCha_set_iv(&ctx, tv->iv, NULL);
24378825ca7Sjsing 	ChaCha(&ctx, out, in, tv->len);
24478825ca7Sjsing }
24578825ca7Sjsing 
24678825ca7Sjsing /* ChaCha20 with partial writes using the Chacha interface. */
24778825ca7Sjsing static void
chacha_ctx_partial_test(struct chacha_tv * tv,unsigned char * out,unsigned char * in)24878825ca7Sjsing chacha_ctx_partial_test(struct chacha_tv *tv, unsigned char *out,
24978825ca7Sjsing     unsigned char *in)
25078825ca7Sjsing {
25178825ca7Sjsing 	ChaCha_ctx ctx;
25278825ca7Sjsing 	int len, size = 0;
25378825ca7Sjsing 
25478825ca7Sjsing 	ChaCha_set_key(&ctx, tv->key, 256);
25578825ca7Sjsing 	ChaCha_set_iv(&ctx, tv->iv, NULL);
25678825ca7Sjsing 	len = tv->len - 1;
25778825ca7Sjsing 	while (len > 1) {
25878825ca7Sjsing 		size = len / 2;
25978825ca7Sjsing 		ChaCha(&ctx, out, in, size);
26078825ca7Sjsing 		in += size;
26178825ca7Sjsing 		out += size;
26278825ca7Sjsing 		len -= size;
26378825ca7Sjsing 	}
26478825ca7Sjsing 	ChaCha(&ctx, out, in, len + 1);
26578825ca7Sjsing }
26678825ca7Sjsing 
26778825ca7Sjsing /* ChaCha20 with single byte writes using the Chacha interface. */
26878825ca7Sjsing static void
chacha_ctx_single_test(struct chacha_tv * tv,unsigned char * out,unsigned char * in)26978825ca7Sjsing chacha_ctx_single_test(struct chacha_tv *tv, unsigned char *out,
27078825ca7Sjsing     unsigned char *in)
27178825ca7Sjsing {
27278825ca7Sjsing 	ChaCha_ctx ctx;
27378825ca7Sjsing 	size_t i;
27478825ca7Sjsing 
27578825ca7Sjsing 	ChaCha_set_key(&ctx, tv->key, 256);
27678825ca7Sjsing 	ChaCha_set_iv(&ctx, tv->iv, NULL);
27778825ca7Sjsing 	for (i = 0; i < tv->len; i++)
27878825ca7Sjsing 		ChaCha(&ctx, out + i, in + i, 1);
27978825ca7Sjsing }
28078825ca7Sjsing 
28178825ca7Sjsing struct chacha_test_function {
28278825ca7Sjsing 	char *name;
28378825ca7Sjsing 	void (*func)(struct chacha_tv *, unsigned char *, unsigned char *);
28478825ca7Sjsing };
28578825ca7Sjsing 
28678825ca7Sjsing struct chacha_test_function chacha_test_functions[] = {
28778825ca7Sjsing 	{"crypto_chacha_20_test", crypto_chacha_20_test},
28878825ca7Sjsing 	{"chacha_ctx_full_test", chacha_ctx_full_test},
28978825ca7Sjsing 	{"chacha_ctx_partial_test", chacha_ctx_partial_test},
29078825ca7Sjsing 	{"chacha_ctx_single_test", chacha_ctx_single_test},
29178825ca7Sjsing };
29278825ca7Sjsing 
29378825ca7Sjsing #define N_FUNCS (sizeof(chacha_test_functions) / sizeof(*chacha_test_functions))
29478825ca7Sjsing 
295*64bf2397Sdlg /* draft-arciszewski-xchacha-02 test vectors */
296*64bf2397Sdlg static int
crypto_hchacha_20_test(void)297*64bf2397Sdlg crypto_hchacha_20_test(void)
298*64bf2397Sdlg {
299*64bf2397Sdlg 	static const unsigned char key[32] = {
300*64bf2397Sdlg 		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
301*64bf2397Sdlg 		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
302*64bf2397Sdlg 		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
303*64bf2397Sdlg 		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
304*64bf2397Sdlg 	};
305*64bf2397Sdlg 	static const unsigned char nonce[16] = {
306*64bf2397Sdlg 		0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4a,
307*64bf2397Sdlg 		0x00, 0x00, 0x00, 0x00, 0x31, 0x41, 0x59, 0x27,
308*64bf2397Sdlg 	};
309*64bf2397Sdlg 	static const unsigned char result[32] = {
310*64bf2397Sdlg 		0x82, 0x41, 0x3b, 0x42, 0x27, 0xb2, 0x7b, 0xfe,
311*64bf2397Sdlg 		0xd3, 0x0e, 0x42, 0x50, 0x8a, 0x87, 0x7d, 0x73,
312*64bf2397Sdlg 		0xa0, 0xf9, 0xe4, 0xd5, 0x8a, 0x74, 0xa8, 0x53,
313*64bf2397Sdlg 		0xc1, 0x2e, 0xc4, 0x13, 0x26, 0xd3, 0xec, 0xdc,
314*64bf2397Sdlg 	};
315*64bf2397Sdlg 	unsigned char out[32];
316*64bf2397Sdlg 	int failed = 0;
317*64bf2397Sdlg 	size_t k;
318*64bf2397Sdlg 
319*64bf2397Sdlg 	CRYPTO_hchacha_20(out, key, nonce);
320*64bf2397Sdlg 
321*64bf2397Sdlg 	if (memcmp(out, result, sizeof(out)) != 0) {
322*64bf2397Sdlg 		printf("HChaCha20 failed!\n");
323*64bf2397Sdlg 
324*64bf2397Sdlg 		printf("Got:\t");
325*64bf2397Sdlg 		for (k = 0; k < sizeof(out); k++)
326*64bf2397Sdlg 			printf("%2.2x", out[k]);
327*64bf2397Sdlg 		printf("\n");
328*64bf2397Sdlg 
329*64bf2397Sdlg 		printf("Want:\t");
330*64bf2397Sdlg 		for (k = 0; k < sizeof(result); k++)
331*64bf2397Sdlg 			printf("%2.2x", result[k]);
332*64bf2397Sdlg 		printf("\n");
333*64bf2397Sdlg 
334*64bf2397Sdlg 		failed = 1;
335*64bf2397Sdlg 	}
336*64bf2397Sdlg 
337*64bf2397Sdlg 	return (failed);
338*64bf2397Sdlg }
339*64bf2397Sdlg 
340*64bf2397Sdlg static int
crypto_xchacha_20_test(void)341*64bf2397Sdlg crypto_xchacha_20_test(void)
342*64bf2397Sdlg {
343*64bf2397Sdlg 	static const unsigned char key[32] = {
344*64bf2397Sdlg 		0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
345*64bf2397Sdlg 		0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
346*64bf2397Sdlg 		0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
347*64bf2397Sdlg 		0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
348*64bf2397Sdlg 	};
349*64bf2397Sdlg 	static const unsigned char iv[24] = {
350*64bf2397Sdlg 		0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
351*64bf2397Sdlg 		0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
352*64bf2397Sdlg 		0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x58
353*64bf2397Sdlg 	};
354*64bf2397Sdlg 	static const unsigned char plain[] = {
355*64bf2397Sdlg 		0x54, 0x68, 0x65, 0x20, 0x64, 0x68, 0x6f, 0x6c,
356*64bf2397Sdlg 		0x65, 0x20, 0x28, 0x70, 0x72, 0x6f, 0x6e, 0x6f,
357*64bf2397Sdlg 		0x75, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x22, 0x64,
358*64bf2397Sdlg 		0x6f, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x69, 0x73,
359*64bf2397Sdlg 		0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6b, 0x6e,
360*64bf2397Sdlg 		0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74,
361*64bf2397Sdlg 		0x68, 0x65, 0x20, 0x41, 0x73, 0x69, 0x61, 0x74,
362*64bf2397Sdlg 		0x69, 0x63, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x20,
363*64bf2397Sdlg 		0x64, 0x6f, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x64,
364*64bf2397Sdlg 		0x20, 0x64, 0x6f, 0x67, 0x2c, 0x20, 0x61, 0x6e,
365*64bf2397Sdlg 		0x64, 0x20, 0x77, 0x68, 0x69, 0x73, 0x74, 0x6c,
366*64bf2397Sdlg 		0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x67, 0x2e,
367*64bf2397Sdlg 		0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61,
368*64bf2397Sdlg 		0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65,
369*64bf2397Sdlg 		0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66,
370*64bf2397Sdlg 		0x20, 0x61, 0x20, 0x47, 0x65, 0x72, 0x6d, 0x61,
371*64bf2397Sdlg 		0x6e, 0x20, 0x73, 0x68, 0x65, 0x70, 0x68, 0x65,
372*64bf2397Sdlg 		0x72, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6c,
373*64bf2397Sdlg 		0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x6d, 0x6f, 0x72,
374*64bf2397Sdlg 		0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x61,
375*64bf2397Sdlg 		0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x6c, 0x65,
376*64bf2397Sdlg 		0x67, 0x67, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x78,
377*64bf2397Sdlg 		0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x68,
378*64bf2397Sdlg 		0x69, 0x67, 0x68, 0x6c, 0x79, 0x20, 0x65, 0x6c,
379*64bf2397Sdlg 		0x75, 0x73, 0x69, 0x76, 0x65, 0x20, 0x61, 0x6e,
380*64bf2397Sdlg 		0x64, 0x20, 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x65,
381*64bf2397Sdlg 		0x64, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x65, 0x72,
382*64bf2397Sdlg 		0x20, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x73,
383*64bf2397Sdlg 		0x73, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x77,
384*64bf2397Sdlg 		0x69, 0x74, 0x68, 0x20, 0x77, 0x6f, 0x6c, 0x76,
385*64bf2397Sdlg 		0x65, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x79, 0x6f,
386*64bf2397Sdlg 		0x74, 0x65, 0x73, 0x2c, 0x20, 0x6a, 0x61, 0x63,
387*64bf2397Sdlg 		0x6b, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x61, 0x6e,
388*64bf2397Sdlg 		0x64, 0x20, 0x66, 0x6f, 0x78, 0x65, 0x73, 0x20,
389*64bf2397Sdlg 		0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74,
390*64bf2397Sdlg 		0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63,
391*64bf2397Sdlg 		0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20,
392*64bf2397Sdlg 		0x43, 0x61, 0x6e, 0x69, 0x64, 0x61, 0x65, 0x2e,
393*64bf2397Sdlg 	};
394*64bf2397Sdlg 	static const unsigned char cipher[] = {
395*64bf2397Sdlg 		0x45, 0x59, 0xab, 0xba, 0x4e, 0x48, 0xc1, 0x61,
396*64bf2397Sdlg 		0x02, 0xe8, 0xbb, 0x2c, 0x05, 0xe6, 0x94, 0x7f,
397*64bf2397Sdlg 		0x50, 0xa7, 0x86, 0xde, 0x16, 0x2f, 0x9b, 0x0b,
398*64bf2397Sdlg 		0x7e, 0x59, 0x2a, 0x9b, 0x53, 0xd0, 0xd4, 0xe9,
399*64bf2397Sdlg 		0x8d, 0x8d, 0x64, 0x10, 0xd5, 0x40, 0xa1, 0xa6,
400*64bf2397Sdlg 		0x37, 0x5b, 0x26, 0xd8, 0x0d, 0xac, 0xe4, 0xfa,
401*64bf2397Sdlg 		0xb5, 0x23, 0x84, 0xc7, 0x31, 0xac, 0xbf, 0x16,
402*64bf2397Sdlg 		0xa5, 0x92, 0x3c, 0x0c, 0x48, 0xd3, 0x57, 0x5d,
403*64bf2397Sdlg 		0x4d, 0x0d, 0x2c, 0x67, 0x3b, 0x66, 0x6f, 0xaa,
404*64bf2397Sdlg 		0x73, 0x10, 0x61, 0x27, 0x77, 0x01, 0x09, 0x3a,
405*64bf2397Sdlg 		0x6b, 0xf7, 0xa1, 0x58, 0xa8, 0x86, 0x42, 0x92,
406*64bf2397Sdlg 		0xa4, 0x1c, 0x48, 0xe3, 0xa9, 0xb4, 0xc0, 0xda,
407*64bf2397Sdlg 		0xec, 0xe0, 0xf8, 0xd9, 0x8d, 0x0d, 0x7e, 0x05,
408*64bf2397Sdlg 		0xb3, 0x7a, 0x30, 0x7b, 0xbb, 0x66, 0x33, 0x31,
409*64bf2397Sdlg 		0x64, 0xec, 0x9e, 0x1b, 0x24, 0xea, 0x0d, 0x6c,
410*64bf2397Sdlg 		0x3f, 0xfd, 0xdc, 0xec, 0x4f, 0x68, 0xe7, 0x44,
411*64bf2397Sdlg 		0x30, 0x56, 0x19, 0x3a, 0x03, 0xc8, 0x10, 0xe1,
412*64bf2397Sdlg 		0x13, 0x44, 0xca, 0x06, 0xd8, 0xed, 0x8a, 0x2b,
413*64bf2397Sdlg 		0xfb, 0x1e, 0x8d, 0x48, 0xcf, 0xa6, 0xbc, 0x0e,
414*64bf2397Sdlg 		0xb4, 0xe2, 0x46, 0x4b, 0x74, 0x81, 0x42, 0x40,
415*64bf2397Sdlg 		0x7c, 0x9f, 0x43, 0x1a, 0xee, 0x76, 0x99, 0x60,
416*64bf2397Sdlg 		0xe1, 0x5b, 0xa8, 0xb9, 0x68, 0x90, 0x46, 0x6e,
417*64bf2397Sdlg 		0xf2, 0x45, 0x75, 0x99, 0x85, 0x23, 0x85, 0xc6,
418*64bf2397Sdlg 		0x61, 0xf7, 0x52, 0xce, 0x20, 0xf9, 0xda, 0x0c,
419*64bf2397Sdlg 		0x09, 0xab, 0x6b, 0x19, 0xdf, 0x74, 0xe7, 0x6a,
420*64bf2397Sdlg 		0x95, 0x96, 0x74, 0x46, 0xf8, 0xd0, 0xfd, 0x41,
421*64bf2397Sdlg 		0x5e, 0x7b, 0xee, 0x2a, 0x12, 0xa1, 0x14, 0xc2,
422*64bf2397Sdlg 		0x0e, 0xb5, 0x29, 0x2a, 0xe7, 0xa3, 0x49, 0xae,
423*64bf2397Sdlg 		0x57, 0x78, 0x20, 0xd5, 0x52, 0x0a, 0x1f, 0x3f,
424*64bf2397Sdlg 		0xb6, 0x2a, 0x17, 0xce, 0x6a, 0x7e, 0x68, 0xfa,
425*64bf2397Sdlg 		0x7c, 0x79, 0x11, 0x1d, 0x88, 0x60, 0x92, 0x0b,
426*64bf2397Sdlg 		0xc0, 0x48, 0xef, 0x43, 0xfe, 0x84, 0x48, 0x6c,
427*64bf2397Sdlg 		0xcb, 0x87, 0xc2, 0x5f, 0x0a, 0xe0, 0x45, 0xf0,
428*64bf2397Sdlg 		0xcc, 0xe1, 0xe7, 0x98, 0x9a, 0x9a, 0xa2, 0x20,
429*64bf2397Sdlg 		0xa2, 0x8b, 0xdd, 0x48, 0x27, 0xe7, 0x51, 0xa2,
430*64bf2397Sdlg 		0x4a, 0x6d, 0x5c, 0x62, 0xd7, 0x90, 0xa6, 0x63,
431*64bf2397Sdlg 		0x93, 0xb9, 0x31, 0x11, 0xc1, 0xa5, 0x5d, 0xd7,
432*64bf2397Sdlg 		0x42, 0x1a, 0x10, 0x18, 0x49, 0x74, 0xc7, 0xc5,
433*64bf2397Sdlg 	};
434*64bf2397Sdlg 	unsigned char out[sizeof(cipher)];
435*64bf2397Sdlg 	int failed = 0;
436*64bf2397Sdlg 	size_t k;
437*64bf2397Sdlg 
438*64bf2397Sdlg 	CRYPTO_xchacha_20(out, plain, sizeof(out), key, iv);
439*64bf2397Sdlg 
440*64bf2397Sdlg 	if (memcmp(out, cipher, sizeof(out)) != 0) {
441*64bf2397Sdlg 		printf("XChaCha20 failed!\n");
442*64bf2397Sdlg 
443*64bf2397Sdlg 		printf("Got:\t");
444*64bf2397Sdlg 		for (k = 0; k < sizeof(out); k++)
445*64bf2397Sdlg 			printf("%2.2x", out[k]);
446*64bf2397Sdlg 		printf("\n");
447*64bf2397Sdlg 
448*64bf2397Sdlg 		printf("Want:\t");
449*64bf2397Sdlg 		for (k = 0; k < sizeof(cipher); k++)
450*64bf2397Sdlg 			printf("%2.2x", cipher[k]);
451*64bf2397Sdlg 		printf("\n");
452*64bf2397Sdlg 
453*64bf2397Sdlg 		failed = 1;
454*64bf2397Sdlg 	}
455*64bf2397Sdlg 
456*64bf2397Sdlg 	return (failed);
457*64bf2397Sdlg }
458*64bf2397Sdlg 
45993d23226Sjsing int
main(int argc,char ** argv)46093d23226Sjsing main(int argc, char **argv)
46193d23226Sjsing {
46293d23226Sjsing 	struct chacha_tv *tv;
46393d23226Sjsing 	unsigned char *in, *out;
46478825ca7Sjsing 	size_t i, j, k;
46578825ca7Sjsing 	int failed = 0;
46693d23226Sjsing 
46793d23226Sjsing 	for (i = 0; i < N_VECTORS; i++) {
46893d23226Sjsing 		tv = &chacha_test_vectors[i];
46993d23226Sjsing 
47078825ca7Sjsing 		for (j = 0; j < N_FUNCS; j++) {
47178825ca7Sjsing 			in = calloc(1, tv->len);
47293d23226Sjsing 			if (in == NULL)
47378825ca7Sjsing 				errx(1, "calloc in");
47478825ca7Sjsing 			out = calloc(1, tv->len);
47593d23226Sjsing 			if (out == NULL)
47678825ca7Sjsing 				errx(1, "calloc out");
47793d23226Sjsing 
47878825ca7Sjsing 			chacha_test_functions[j].func(tv, out, in);
47993d23226Sjsing 
48093d23226Sjsing 			if (memcmp(out, tv->out, tv->len) != 0) {
48178825ca7Sjsing 				printf("ChaCha %s failed for \"%s\"!\n",
48278825ca7Sjsing 				    chacha_test_functions[j].name, tv->desc);
48378825ca7Sjsing 
48478825ca7Sjsing 				printf("Got:\t");
48578825ca7Sjsing 				for (k = 0; k < tv->len; k++)
48678825ca7Sjsing 					printf("%2.2x", out[k]);
48793d23226Sjsing 				printf("\n");
48878825ca7Sjsing 
48978825ca7Sjsing 				printf("Want:\t");
49078825ca7Sjsing 				for (k = 0; k < tv->len; k++)
49178825ca7Sjsing 					printf("%2.2x", tv->out[k]);
49293d23226Sjsing 				printf("\n");
49378825ca7Sjsing 
49478825ca7Sjsing 				failed = 1;
49593d23226Sjsing 			}
49693d23226Sjsing 
49793d23226Sjsing 			free(in);
49893d23226Sjsing 			free(out);
49993d23226Sjsing 		}
50078825ca7Sjsing 	}
50193d23226Sjsing 
502*64bf2397Sdlg 	if (crypto_hchacha_20_test() != 0)
503*64bf2397Sdlg 		failed = 1;
504*64bf2397Sdlg 
505*64bf2397Sdlg 	if (crypto_xchacha_20_test() != 0)
506*64bf2397Sdlg 		failed = 1;
507*64bf2397Sdlg 
50878825ca7Sjsing 	return failed;
50993d23226Sjsing }
510