113d40330Schristos /*
2*4778aedeSchristos * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
313d40330Schristos *
4b0d17251Schristos * Licensed under the Apache License 2.0 (the "License"). You may not use
513d40330Schristos * this file except in compliance with the License. You can obtain a copy
613d40330Schristos * in the file LICENSE in the source distribution or at
713d40330Schristos * https://www.openssl.org/source/license.html
813d40330Schristos */
913d40330Schristos
1013d40330Schristos /*
1113d40330Schristos * Internal tests for the chacha module. EVP tests would exercise
1213d40330Schristos * complete 32-byte blocks. This test goes per byte...
1313d40330Schristos */
1413d40330Schristos
1513d40330Schristos #include <string.h>
1613d40330Schristos #include <openssl/opensslconf.h>
1713d40330Schristos #include "testutil.h"
187d004720Schristos #include "crypto/chacha.h"
1913d40330Schristos
2013d40330Schristos static const unsigned int key[] = {
2113d40330Schristos 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
2213d40330Schristos 0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c
2313d40330Schristos };
2413d40330Schristos
2513d40330Schristos static const unsigned int ivp[] = {
2613d40330Schristos 0x00000000, 0x00000000, 0x03020100, 0x07060504
2713d40330Schristos };
2813d40330Schristos
2913d40330Schristos static const unsigned char ref[] = {
3013d40330Schristos 0xf7, 0x98, 0xa1, 0x89, 0xf1, 0x95, 0xe6, 0x69,
3113d40330Schristos 0x82, 0x10, 0x5f, 0xfb, 0x64, 0x0b, 0xb7, 0x75,
3213d40330Schristos 0x7f, 0x57, 0x9d, 0xa3, 0x16, 0x02, 0xfc, 0x93,
3313d40330Schristos 0xec, 0x01, 0xac, 0x56, 0xf8, 0x5a, 0xc3, 0xc1,
3413d40330Schristos 0x34, 0xa4, 0x54, 0x7b, 0x73, 0x3b, 0x46, 0x41,
3513d40330Schristos 0x30, 0x42, 0xc9, 0x44, 0x00, 0x49, 0x17, 0x69,
3613d40330Schristos 0x05, 0xd3, 0xbe, 0x59, 0xea, 0x1c, 0x53, 0xf1,
3713d40330Schristos 0x59, 0x16, 0x15, 0x5c, 0x2b, 0xe8, 0x24, 0x1a,
3813d40330Schristos 0x38, 0x00, 0x8b, 0x9a, 0x26, 0xbc, 0x35, 0x94,
3913d40330Schristos 0x1e, 0x24, 0x44, 0x17, 0x7c, 0x8a, 0xde, 0x66,
4013d40330Schristos 0x89, 0xde, 0x95, 0x26, 0x49, 0x86, 0xd9, 0x58,
4113d40330Schristos 0x89, 0xfb, 0x60, 0xe8, 0x46, 0x29, 0xc9, 0xbd,
4213d40330Schristos 0x9a, 0x5a, 0xcb, 0x1c, 0xc1, 0x18, 0xbe, 0x56,
4313d40330Schristos 0x3e, 0xb9, 0xb3, 0xa4, 0xa4, 0x72, 0xf8, 0x2e,
4413d40330Schristos 0x09, 0xa7, 0xe7, 0x78, 0x49, 0x2b, 0x56, 0x2e,
4513d40330Schristos 0xf7, 0x13, 0x0e, 0x88, 0xdf, 0xe0, 0x31, 0xc7,
4613d40330Schristos 0x9d, 0xb9, 0xd4, 0xf7, 0xc7, 0xa8, 0x99, 0x15,
4713d40330Schristos 0x1b, 0x9a, 0x47, 0x50, 0x32, 0xb6, 0x3f, 0xc3,
4813d40330Schristos 0x85, 0x24, 0x5f, 0xe0, 0x54, 0xe3, 0xdd, 0x5a,
4913d40330Schristos 0x97, 0xa5, 0xf5, 0x76, 0xfe, 0x06, 0x40, 0x25,
5013d40330Schristos 0xd3, 0xce, 0x04, 0x2c, 0x56, 0x6a, 0xb2, 0xc5,
5113d40330Schristos 0x07, 0xb1, 0x38, 0xdb, 0x85, 0x3e, 0x3d, 0x69,
5213d40330Schristos 0x59, 0x66, 0x09, 0x96, 0x54, 0x6c, 0xc9, 0xc4,
5313d40330Schristos 0xa6, 0xea, 0xfd, 0xc7, 0x77, 0xc0, 0x40, 0xd7,
5413d40330Schristos 0x0e, 0xaf, 0x46, 0xf7, 0x6d, 0xad, 0x39, 0x79,
5513d40330Schristos 0xe5, 0xc5, 0x36, 0x0c, 0x33, 0x17, 0x16, 0x6a,
5613d40330Schristos 0x1c, 0x89, 0x4c, 0x94, 0xa3, 0x71, 0x87, 0x6a,
5713d40330Schristos 0x94, 0xdf, 0x76, 0x28, 0xfe, 0x4e, 0xaa, 0xf2,
5813d40330Schristos 0xcc, 0xb2, 0x7d, 0x5a, 0xaa, 0xe0, 0xad, 0x7a,
5913d40330Schristos 0xd0, 0xf9, 0xd4, 0xb6, 0xad, 0x3b, 0x54, 0x09,
6013d40330Schristos 0x87, 0x46, 0xd4, 0x52, 0x4d, 0x38, 0x40, 0x7a,
6113d40330Schristos 0x6d, 0xeb, 0x3a, 0xb7, 0x8f, 0xab, 0x78, 0xc9,
6213d40330Schristos 0x42, 0x13, 0x66, 0x8b, 0xbb, 0xd3, 0x94, 0xc5,
6313d40330Schristos 0xde, 0x93, 0xb8, 0x53, 0x17, 0x8a, 0xdd, 0xd6,
6413d40330Schristos 0xb9, 0x7f, 0x9f, 0xa1, 0xec, 0x3e, 0x56, 0xc0,
6513d40330Schristos 0x0c, 0x9d, 0xdf, 0xf0, 0xa4, 0x4a, 0x20, 0x42,
6613d40330Schristos 0x41, 0x17, 0x5a, 0x4c, 0xab, 0x0f, 0x96, 0x1b,
6713d40330Schristos 0xa5, 0x3e, 0xde, 0x9b, 0xdf, 0x96, 0x0b, 0x94,
6813d40330Schristos 0xf9, 0x82, 0x9b, 0x1f, 0x34, 0x14, 0x72, 0x64,
6913d40330Schristos 0x29, 0xb3, 0x62, 0xc5, 0xb5, 0x38, 0xe3, 0x91,
7013d40330Schristos 0x52, 0x0f, 0x48, 0x9b, 0x7e, 0xd8, 0xd2, 0x0a,
7113d40330Schristos 0xe3, 0xfd, 0x49, 0xe9, 0xe2, 0x59, 0xe4, 0x43,
7213d40330Schristos 0x97, 0x51, 0x4d, 0x61, 0x8c, 0x96, 0xc4, 0x84,
7313d40330Schristos 0x6b, 0xe3, 0xc6, 0x80, 0xbd, 0xc1, 0x1c, 0x71,
7413d40330Schristos 0xdc, 0xbb, 0xe2, 0x9c, 0xcf, 0x80, 0xd6, 0x2a,
7513d40330Schristos 0x09, 0x38, 0xfa, 0x54, 0x93, 0x91, 0xe6, 0xea,
7613d40330Schristos 0x57, 0xec, 0xbe, 0x26, 0x06, 0x79, 0x0e, 0xc1,
7713d40330Schristos 0x5d, 0x22, 0x24, 0xae, 0x30, 0x7c, 0x14, 0x42,
7813d40330Schristos 0x26, 0xb7, 0xc4, 0xe8, 0xc2, 0xf9, 0x7d, 0x2a,
7913d40330Schristos 0x1d, 0x67, 0x85, 0x2d, 0x29, 0xbe, 0xba, 0x11,
8013d40330Schristos 0x0e, 0xdd, 0x44, 0x51, 0x97, 0x01, 0x20, 0x62,
8113d40330Schristos 0xa3, 0x93, 0xa9, 0xc9, 0x28, 0x03, 0xad, 0x3b,
8213d40330Schristos 0x4f, 0x31, 0xd7, 0xbc, 0x60, 0x33, 0xcc, 0xf7,
8313d40330Schristos 0x93, 0x2c, 0xfe, 0xd3, 0xf0, 0x19, 0x04, 0x4d,
8413d40330Schristos 0x25, 0x90, 0x59, 0x16, 0x77, 0x72, 0x86, 0xf8,
8513d40330Schristos 0x2f, 0x9a, 0x4c, 0xc1, 0xff, 0xe4, 0x30, 0xff,
8613d40330Schristos 0xd1, 0xdc, 0xfc, 0x27, 0xde, 0xed, 0x32, 0x7b,
8713d40330Schristos 0x9f, 0x96, 0x30, 0xd2, 0xfa, 0x96, 0x9f, 0xb6,
8813d40330Schristos 0xf0, 0x60, 0x3c, 0xd1, 0x9d, 0xd9, 0xa9, 0x51,
8913d40330Schristos 0x9e, 0x67, 0x3b, 0xcf, 0xcd, 0x90, 0x14, 0x12,
9013d40330Schristos 0x52, 0x91, 0xa4, 0x46, 0x69, 0xef, 0x72, 0x85,
9113d40330Schristos 0xe7, 0x4e, 0xd3, 0x72, 0x9b, 0x67, 0x7f, 0x80,
9213d40330Schristos 0x1c, 0x3c, 0xdf, 0x05, 0x8c, 0x50, 0x96, 0x31,
9313d40330Schristos 0x68, 0xb4, 0x96, 0x04, 0x37, 0x16, 0xc7, 0x30,
9413d40330Schristos 0x7c, 0xd9, 0xe0, 0xcd, 0xd1, 0x37, 0xfc, 0xcb,
9513d40330Schristos 0x0f, 0x05, 0xb4, 0x7c, 0xdb, 0xb9, 0x5c, 0x5f,
9613d40330Schristos 0x54, 0x83, 0x16, 0x22, 0xc3, 0x65, 0x2a, 0x32,
9713d40330Schristos 0xb2, 0x53, 0x1f, 0xe3, 0x26, 0xbc, 0xd6, 0xe2,
9813d40330Schristos 0xbb, 0xf5, 0x6a, 0x19, 0x4f, 0xa1, 0x96, 0xfb,
9913d40330Schristos 0xd1, 0xa5, 0x49, 0x52, 0x11, 0x0f, 0x51, 0xc7,
10013d40330Schristos 0x34, 0x33, 0x86, 0x5f, 0x76, 0x64, 0xb8, 0x36,
10113d40330Schristos 0x68, 0x5e, 0x36, 0x64, 0xb3, 0xd8, 0x44, 0x4a,
10213d40330Schristos 0xf8, 0x9a, 0x24, 0x28, 0x05, 0xe1, 0x8c, 0x97,
10313d40330Schristos 0x5f, 0x11, 0x46, 0x32, 0x49, 0x96, 0xfd, 0xe1,
10413d40330Schristos 0x70, 0x07, 0xcf, 0x3e, 0x6e, 0x8f, 0x4e, 0x76,
10513d40330Schristos 0x40, 0x22, 0x53, 0x3e, 0xdb, 0xfe, 0x07, 0xd4,
10613d40330Schristos 0x73, 0x3e, 0x48, 0xbb, 0x37, 0x2d, 0x75, 0xb0,
10713d40330Schristos 0xef, 0x48, 0xec, 0x98, 0x3e, 0xb7, 0x85, 0x32,
10813d40330Schristos 0x16, 0x1c, 0xc5, 0x29, 0xe5, 0xab, 0xb8, 0x98,
10913d40330Schristos 0x37, 0xdf, 0xcc, 0xa6, 0x26, 0x1d, 0xbb, 0x37,
11013d40330Schristos 0xc7, 0xc5, 0xe6, 0xa8, 0x74, 0x78, 0xbf, 0x41,
11113d40330Schristos 0xee, 0x85, 0xa5, 0x18, 0xc0, 0xf4, 0xef, 0xa9,
11213d40330Schristos 0xbd, 0xe8, 0x28, 0xc5, 0xa7, 0x1b, 0x8e, 0x46,
11313d40330Schristos 0x59, 0x7b, 0x63, 0x4a, 0xfd, 0x20, 0x4d, 0x3c,
11413d40330Schristos 0x50, 0x13, 0x34, 0x23, 0x9c, 0x34, 0x14, 0x28,
11513d40330Schristos 0x5e, 0xd7, 0x2d, 0x3a, 0x91, 0x69, 0xea, 0xbb,
11613d40330Schristos 0xd4, 0xdc, 0x25, 0xd5, 0x2b, 0xb7, 0x51, 0x6d,
11713d40330Schristos 0x3b, 0xa7, 0x12, 0xd7, 0x5a, 0xd8, 0xc0, 0xae,
11813d40330Schristos 0x5d, 0x49, 0x3c, 0x19, 0xe3, 0x8a, 0x77, 0x93,
11913d40330Schristos 0x9e, 0x7a, 0x05, 0x8d, 0x71, 0x3e, 0x9c, 0xcc,
12013d40330Schristos 0xca, 0x58, 0x04, 0x5f, 0x43, 0x6b, 0x43, 0x4b,
12113d40330Schristos 0x1c, 0x80, 0xd3, 0x65, 0x47, 0x24, 0x06, 0xe3,
12213d40330Schristos 0x92, 0x95, 0x19, 0x87, 0xdb, 0x69, 0x05, 0xc8,
12313d40330Schristos 0x0d, 0x43, 0x1d, 0xa1, 0x84, 0x51, 0x13, 0x5b,
12413d40330Schristos 0xe7, 0xe8, 0x2b, 0xca, 0xb3, 0x58, 0xcb, 0x39,
12513d40330Schristos 0x71, 0xe6, 0x14, 0x05, 0xb2, 0xff, 0x17, 0x98,
12613d40330Schristos 0x0d, 0x6e, 0x7e, 0x67, 0xe8, 0x61, 0xe2, 0x82,
12713d40330Schristos 0x01, 0xc1, 0xee, 0x30, 0xb4, 0x41, 0x04, 0x0f,
12813d40330Schristos 0xd0, 0x68, 0x78, 0xd6, 0x50, 0x42, 0xc9, 0x55,
12913d40330Schristos 0x82, 0xa4, 0x31, 0x82, 0x07, 0xbf, 0xc7, 0x00,
13013d40330Schristos 0xbe, 0x0c, 0xe3, 0x28, 0x89, 0xae, 0xc2, 0xff,
13113d40330Schristos 0xe5, 0x08, 0x5e, 0x89, 0x67, 0x91, 0x0d, 0x87,
13213d40330Schristos 0x9f, 0xa0, 0xe8, 0xc0, 0xff, 0x85, 0xfd, 0xc5,
13313d40330Schristos 0x10, 0xb9, 0xff, 0x2f, 0xbf, 0x87, 0xcf, 0xcb,
13413d40330Schristos 0x29, 0x57, 0x7d, 0x68, 0x09, 0x9e, 0x04, 0xff,
13513d40330Schristos 0xa0, 0x5f, 0x75, 0x2a, 0x73, 0xd3, 0x77, 0xc7,
13613d40330Schristos 0x0d, 0x3a, 0x8b, 0xc2, 0xda, 0x80, 0xe6, 0xe7,
13713d40330Schristos 0x80, 0xec, 0x05, 0x71, 0x82, 0xc3, 0x3a, 0xd1,
13813d40330Schristos 0xde, 0x38, 0x72, 0x52, 0x25, 0x8a, 0x1e, 0x18,
13913d40330Schristos 0xe6, 0xfa, 0xd9, 0x10, 0x32, 0x7c, 0xe7, 0xf4,
14013d40330Schristos 0x2f, 0xd1, 0xe1, 0xe0, 0x51, 0x5f, 0x95, 0x86,
14113d40330Schristos 0xe2, 0xf2, 0xef, 0xcb, 0x9f, 0x47, 0x2b, 0x1d,
14213d40330Schristos 0xbd, 0xba, 0xc3, 0x54, 0xa4, 0x16, 0x21, 0x51,
14313d40330Schristos 0xe9, 0xd9, 0x2c, 0x79, 0xfb, 0x08, 0xbb, 0x4d,
14413d40330Schristos 0xdc, 0x56, 0xf1, 0x94, 0x48, 0xc0, 0x17, 0x5a,
14513d40330Schristos 0x46, 0xe2, 0xe6, 0xc4, 0x91, 0xfe, 0xc7, 0x14,
14613d40330Schristos 0x19, 0xaa, 0x43, 0xa3, 0x49, 0xbe, 0xa7, 0x68,
14713d40330Schristos 0xa9, 0x2c, 0x75, 0xde, 0x68, 0xfd, 0x95, 0x91,
14813d40330Schristos 0xe6, 0x80, 0x67, 0xf3, 0x19, 0x70, 0x94, 0xd3,
14913d40330Schristos 0xfb, 0x87, 0xed, 0x81, 0x78, 0x5e, 0xa0, 0x75,
15013d40330Schristos 0xe4, 0xb6, 0x5e, 0x3e, 0x4c, 0x78, 0xf8, 0x1d,
15113d40330Schristos 0xa9, 0xb7, 0x51, 0xc5, 0xef, 0xe0, 0x24, 0x15,
15213d40330Schristos 0x23, 0x01, 0xc4, 0x8e, 0x63, 0x24, 0x5b, 0x55,
15313d40330Schristos 0x6c, 0x4c, 0x67, 0xaf, 0xf8, 0x57, 0xe5, 0xea,
15413d40330Schristos 0x15, 0xa9, 0x08, 0xd8, 0x3a, 0x1d, 0x97, 0x04,
15513d40330Schristos 0xf8, 0xe5, 0x5e, 0x73, 0x52, 0xb2, 0x0b, 0x69,
15613d40330Schristos 0x4b, 0xf9, 0x97, 0x02, 0x98, 0xe6, 0xb5, 0xaa,
15713d40330Schristos 0xd3, 0x3e, 0xa2, 0x15, 0x5d, 0x10, 0x5d, 0x4e
15813d40330Schristos };
15913d40330Schristos
test_cha_cha_internal(int n)16013d40330Schristos static int test_cha_cha_internal(int n)
16113d40330Schristos {
16213d40330Schristos unsigned char buf[sizeof(ref)];
16313d40330Schristos unsigned int i = n + 1, j;
16413d40330Schristos
16513d40330Schristos memset(buf, 0, i);
16613d40330Schristos memcpy(buf + i, ref + i, sizeof(ref) - i);
16713d40330Schristos
16813d40330Schristos ChaCha20_ctr32(buf, buf, i, key, ivp);
16913d40330Schristos
17013d40330Schristos /*
17113d40330Schristos * Idea behind checking for whole sizeof(ref) is that if
17213d40330Schristos * ChaCha20_ctr32 oversteps i-th byte, then we'd know
17313d40330Schristos */
17413d40330Schristos for (j = 0; j < sizeof(ref); j++)
17513d40330Schristos if (!TEST_uchar_eq(buf[j], ref[j])) {
17613d40330Schristos TEST_info("%d failed at %u (%02x)\n", i, j, buf[j]);
17713d40330Schristos return 0;
17813d40330Schristos }
17913d40330Schristos return 1;
18013d40330Schristos }
18113d40330Schristos
setup_tests(void)18213d40330Schristos int setup_tests(void)
18313d40330Schristos {
184*4778aedeSchristos #ifdef OPENSSL_CPUID_OBJ
18513d40330Schristos OPENSSL_cpuid_setup();
18613d40330Schristos #endif
18713d40330Schristos
18813d40330Schristos ADD_ALL_TESTS(test_cha_cha_internal, sizeof(ref));
18913d40330Schristos return 1;
19013d40330Schristos }
191