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