1/*
2 * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License").  You may not use
5 * this file except in compliance with the License.  You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10/*
11 * Internal tests for the chacha module. EVP tests would exercise
12 * complete 32-byte blocks. This test goes per byte...
13 */
14
15#include <string.h>
16#include <openssl/opensslconf.h>
17#include "testutil.h"
18#include "crypto/chacha.h"
19
20static const unsigned int key[] = {
21    0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
22    0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c
23};
24
25static const unsigned int ivp[] = {
26    0x00000000, 0x00000000, 0x03020100, 0x07060504
27};
28
29static const unsigned char ref[] = {
30    0xf7, 0x98, 0xa1, 0x89, 0xf1, 0x95, 0xe6, 0x69,
31    0x82, 0x10, 0x5f, 0xfb, 0x64, 0x0b, 0xb7, 0x75,
32    0x7f, 0x57, 0x9d, 0xa3, 0x16, 0x02, 0xfc, 0x93,
33    0xec, 0x01, 0xac, 0x56, 0xf8, 0x5a, 0xc3, 0xc1,
34    0x34, 0xa4, 0x54, 0x7b, 0x73, 0x3b, 0x46, 0x41,
35    0x30, 0x42, 0xc9, 0x44, 0x00, 0x49, 0x17, 0x69,
36    0x05, 0xd3, 0xbe, 0x59, 0xea, 0x1c, 0x53, 0xf1,
37    0x59, 0x16, 0x15, 0x5c, 0x2b, 0xe8, 0x24, 0x1a,
38    0x38, 0x00, 0x8b, 0x9a, 0x26, 0xbc, 0x35, 0x94,
39    0x1e, 0x24, 0x44, 0x17, 0x7c, 0x8a, 0xde, 0x66,
40    0x89, 0xde, 0x95, 0x26, 0x49, 0x86, 0xd9, 0x58,
41    0x89, 0xfb, 0x60, 0xe8, 0x46, 0x29, 0xc9, 0xbd,
42    0x9a, 0x5a, 0xcb, 0x1c, 0xc1, 0x18, 0xbe, 0x56,
43    0x3e, 0xb9, 0xb3, 0xa4, 0xa4, 0x72, 0xf8, 0x2e,
44    0x09, 0xa7, 0xe7, 0x78, 0x49, 0x2b, 0x56, 0x2e,
45    0xf7, 0x13, 0x0e, 0x88, 0xdf, 0xe0, 0x31, 0xc7,
46    0x9d, 0xb9, 0xd4, 0xf7, 0xc7, 0xa8, 0x99, 0x15,
47    0x1b, 0x9a, 0x47, 0x50, 0x32, 0xb6, 0x3f, 0xc3,
48    0x85, 0x24, 0x5f, 0xe0, 0x54, 0xe3, 0xdd, 0x5a,
49    0x97, 0xa5, 0xf5, 0x76, 0xfe, 0x06, 0x40, 0x25,
50    0xd3, 0xce, 0x04, 0x2c, 0x56, 0x6a, 0xb2, 0xc5,
51    0x07, 0xb1, 0x38, 0xdb, 0x85, 0x3e, 0x3d, 0x69,
52    0x59, 0x66, 0x09, 0x96, 0x54, 0x6c, 0xc9, 0xc4,
53    0xa6, 0xea, 0xfd, 0xc7, 0x77, 0xc0, 0x40, 0xd7,
54    0x0e, 0xaf, 0x46, 0xf7, 0x6d, 0xad, 0x39, 0x79,
55    0xe5, 0xc5, 0x36, 0x0c, 0x33, 0x17, 0x16, 0x6a,
56    0x1c, 0x89, 0x4c, 0x94, 0xa3, 0x71, 0x87, 0x6a,
57    0x94, 0xdf, 0x76, 0x28, 0xfe, 0x4e, 0xaa, 0xf2,
58    0xcc, 0xb2, 0x7d, 0x5a, 0xaa, 0xe0, 0xad, 0x7a,
59    0xd0, 0xf9, 0xd4, 0xb6, 0xad, 0x3b, 0x54, 0x09,
60    0x87, 0x46, 0xd4, 0x52, 0x4d, 0x38, 0x40, 0x7a,
61    0x6d, 0xeb, 0x3a, 0xb7, 0x8f, 0xab, 0x78, 0xc9,
62    0x42, 0x13, 0x66, 0x8b, 0xbb, 0xd3, 0x94, 0xc5,
63    0xde, 0x93, 0xb8, 0x53, 0x17, 0x8a, 0xdd, 0xd6,
64    0xb9, 0x7f, 0x9f, 0xa1, 0xec, 0x3e, 0x56, 0xc0,
65    0x0c, 0x9d, 0xdf, 0xf0, 0xa4, 0x4a, 0x20, 0x42,
66    0x41, 0x17, 0x5a, 0x4c, 0xab, 0x0f, 0x96, 0x1b,
67    0xa5, 0x3e, 0xde, 0x9b, 0xdf, 0x96, 0x0b, 0x94,
68    0xf9, 0x82, 0x9b, 0x1f, 0x34, 0x14, 0x72, 0x64,
69    0x29, 0xb3, 0x62, 0xc5, 0xb5, 0x38, 0xe3, 0x91,
70    0x52, 0x0f, 0x48, 0x9b, 0x7e, 0xd8, 0xd2, 0x0a,
71    0xe3, 0xfd, 0x49, 0xe9, 0xe2, 0x59, 0xe4, 0x43,
72    0x97, 0x51, 0x4d, 0x61, 0x8c, 0x96, 0xc4, 0x84,
73    0x6b, 0xe3, 0xc6, 0x80, 0xbd, 0xc1, 0x1c, 0x71,
74    0xdc, 0xbb, 0xe2, 0x9c, 0xcf, 0x80, 0xd6, 0x2a,
75    0x09, 0x38, 0xfa, 0x54, 0x93, 0x91, 0xe6, 0xea,
76    0x57, 0xec, 0xbe, 0x26, 0x06, 0x79, 0x0e, 0xc1,
77    0x5d, 0x22, 0x24, 0xae, 0x30, 0x7c, 0x14, 0x42,
78    0x26, 0xb7, 0xc4, 0xe8, 0xc2, 0xf9, 0x7d, 0x2a,
79    0x1d, 0x67, 0x85, 0x2d, 0x29, 0xbe, 0xba, 0x11,
80    0x0e, 0xdd, 0x44, 0x51, 0x97, 0x01, 0x20, 0x62,
81    0xa3, 0x93, 0xa9, 0xc9, 0x28, 0x03, 0xad, 0x3b,
82    0x4f, 0x31, 0xd7, 0xbc, 0x60, 0x33, 0xcc, 0xf7,
83    0x93, 0x2c, 0xfe, 0xd3, 0xf0, 0x19, 0x04, 0x4d,
84    0x25, 0x90, 0x59, 0x16, 0x77, 0x72, 0x86, 0xf8,
85    0x2f, 0x9a, 0x4c, 0xc1, 0xff, 0xe4, 0x30, 0xff,
86    0xd1, 0xdc, 0xfc, 0x27, 0xde, 0xed, 0x32, 0x7b,
87    0x9f, 0x96, 0x30, 0xd2, 0xfa, 0x96, 0x9f, 0xb6,
88    0xf0, 0x60, 0x3c, 0xd1, 0x9d, 0xd9, 0xa9, 0x51,
89    0x9e, 0x67, 0x3b, 0xcf, 0xcd, 0x90, 0x14, 0x12,
90    0x52, 0x91, 0xa4, 0x46, 0x69, 0xef, 0x72, 0x85,
91    0xe7, 0x4e, 0xd3, 0x72, 0x9b, 0x67, 0x7f, 0x80,
92    0x1c, 0x3c, 0xdf, 0x05, 0x8c, 0x50, 0x96, 0x31,
93    0x68, 0xb4, 0x96, 0x04, 0x37, 0x16, 0xc7, 0x30,
94    0x7c, 0xd9, 0xe0, 0xcd, 0xd1, 0x37, 0xfc, 0xcb,
95    0x0f, 0x05, 0xb4, 0x7c, 0xdb, 0xb9, 0x5c, 0x5f,
96    0x54, 0x83, 0x16, 0x22, 0xc3, 0x65, 0x2a, 0x32,
97    0xb2, 0x53, 0x1f, 0xe3, 0x26, 0xbc, 0xd6, 0xe2,
98    0xbb, 0xf5, 0x6a, 0x19, 0x4f, 0xa1, 0x96, 0xfb,
99    0xd1, 0xa5, 0x49, 0x52, 0x11, 0x0f, 0x51, 0xc7,
100    0x34, 0x33, 0x86, 0x5f, 0x76, 0x64, 0xb8, 0x36,
101    0x68, 0x5e, 0x36, 0x64, 0xb3, 0xd8, 0x44, 0x4a,
102    0xf8, 0x9a, 0x24, 0x28, 0x05, 0xe1, 0x8c, 0x97,
103    0x5f, 0x11, 0x46, 0x32, 0x49, 0x96, 0xfd, 0xe1,
104    0x70, 0x07, 0xcf, 0x3e, 0x6e, 0x8f, 0x4e, 0x76,
105    0x40, 0x22, 0x53, 0x3e, 0xdb, 0xfe, 0x07, 0xd4,
106    0x73, 0x3e, 0x48, 0xbb, 0x37, 0x2d, 0x75, 0xb0,
107    0xef, 0x48, 0xec, 0x98, 0x3e, 0xb7, 0x85, 0x32,
108    0x16, 0x1c, 0xc5, 0x29, 0xe5, 0xab, 0xb8, 0x98,
109    0x37, 0xdf, 0xcc, 0xa6, 0x26, 0x1d, 0xbb, 0x37,
110    0xc7, 0xc5, 0xe6, 0xa8, 0x74, 0x78, 0xbf, 0x41,
111    0xee, 0x85, 0xa5, 0x18, 0xc0, 0xf4, 0xef, 0xa9,
112    0xbd, 0xe8, 0x28, 0xc5, 0xa7, 0x1b, 0x8e, 0x46,
113    0x59, 0x7b, 0x63, 0x4a, 0xfd, 0x20, 0x4d, 0x3c,
114    0x50, 0x13, 0x34, 0x23, 0x9c, 0x34, 0x14, 0x28,
115    0x5e, 0xd7, 0x2d, 0x3a, 0x91, 0x69, 0xea, 0xbb,
116    0xd4, 0xdc, 0x25, 0xd5, 0x2b, 0xb7, 0x51, 0x6d,
117    0x3b, 0xa7, 0x12, 0xd7, 0x5a, 0xd8, 0xc0, 0xae,
118    0x5d, 0x49, 0x3c, 0x19, 0xe3, 0x8a, 0x77, 0x93,
119    0x9e, 0x7a, 0x05, 0x8d, 0x71, 0x3e, 0x9c, 0xcc,
120    0xca, 0x58, 0x04, 0x5f, 0x43, 0x6b, 0x43, 0x4b,
121    0x1c, 0x80, 0xd3, 0x65, 0x47, 0x24, 0x06, 0xe3,
122    0x92, 0x95, 0x19, 0x87, 0xdb, 0x69, 0x05, 0xc8,
123    0x0d, 0x43, 0x1d, 0xa1, 0x84, 0x51, 0x13, 0x5b,
124    0xe7, 0xe8, 0x2b, 0xca, 0xb3, 0x58, 0xcb, 0x39,
125    0x71, 0xe6, 0x14, 0x05, 0xb2, 0xff, 0x17, 0x98,
126    0x0d, 0x6e, 0x7e, 0x67, 0xe8, 0x61, 0xe2, 0x82,
127    0x01, 0xc1, 0xee, 0x30, 0xb4, 0x41, 0x04, 0x0f,
128    0xd0, 0x68, 0x78, 0xd6, 0x50, 0x42, 0xc9, 0x55,
129    0x82, 0xa4, 0x31, 0x82, 0x07, 0xbf, 0xc7, 0x00,
130    0xbe, 0x0c, 0xe3, 0x28, 0x89, 0xae, 0xc2, 0xff,
131    0xe5, 0x08, 0x5e, 0x89, 0x67, 0x91, 0x0d, 0x87,
132    0x9f, 0xa0, 0xe8, 0xc0, 0xff, 0x85, 0xfd, 0xc5,
133    0x10, 0xb9, 0xff, 0x2f, 0xbf, 0x87, 0xcf, 0xcb,
134    0x29, 0x57, 0x7d, 0x68, 0x09, 0x9e, 0x04, 0xff,
135    0xa0, 0x5f, 0x75, 0x2a, 0x73, 0xd3, 0x77, 0xc7,
136    0x0d, 0x3a, 0x8b, 0xc2, 0xda, 0x80, 0xe6, 0xe7,
137    0x80, 0xec, 0x05, 0x71, 0x82, 0xc3, 0x3a, 0xd1,
138    0xde, 0x38, 0x72, 0x52, 0x25, 0x8a, 0x1e, 0x18,
139    0xe6, 0xfa, 0xd9, 0x10, 0x32, 0x7c, 0xe7, 0xf4,
140    0x2f, 0xd1, 0xe1, 0xe0, 0x51, 0x5f, 0x95, 0x86,
141    0xe2, 0xf2, 0xef, 0xcb, 0x9f, 0x47, 0x2b, 0x1d,
142    0xbd, 0xba, 0xc3, 0x54, 0xa4, 0x16, 0x21, 0x51,
143    0xe9, 0xd9, 0x2c, 0x79, 0xfb, 0x08, 0xbb, 0x4d,
144    0xdc, 0x56, 0xf1, 0x94, 0x48, 0xc0, 0x17, 0x5a,
145    0x46, 0xe2, 0xe6, 0xc4, 0x91, 0xfe, 0xc7, 0x14,
146    0x19, 0xaa, 0x43, 0xa3, 0x49, 0xbe, 0xa7, 0x68,
147    0xa9, 0x2c, 0x75, 0xde, 0x68, 0xfd, 0x95, 0x91,
148    0xe6, 0x80, 0x67, 0xf3, 0x19, 0x70, 0x94, 0xd3,
149    0xfb, 0x87, 0xed, 0x81, 0x78, 0x5e, 0xa0, 0x75,
150    0xe4, 0xb6, 0x5e, 0x3e, 0x4c, 0x78, 0xf8, 0x1d,
151    0xa9, 0xb7, 0x51, 0xc5, 0xef, 0xe0, 0x24, 0x15,
152    0x23, 0x01, 0xc4, 0x8e, 0x63, 0x24, 0x5b, 0x55,
153    0x6c, 0x4c, 0x67, 0xaf, 0xf8, 0x57, 0xe5, 0xea,
154    0x15, 0xa9, 0x08, 0xd8, 0x3a, 0x1d, 0x97, 0x04,
155    0xf8, 0xe5, 0x5e, 0x73, 0x52, 0xb2, 0x0b, 0x69,
156    0x4b, 0xf9, 0x97, 0x02, 0x98, 0xe6, 0xb5, 0xaa,
157    0xd3, 0x3e, 0xa2, 0x15, 0x5d, 0x10, 0x5d, 0x4e
158};
159
160static int test_cha_cha_internal(int n)
161{
162    unsigned char buf[sizeof(ref)];
163    unsigned int i = n + 1, j;
164
165    memset(buf, 0, i);
166    memcpy(buf + i, ref + i, sizeof(ref) - i);
167
168    ChaCha20_ctr32(buf, buf, i, key, ivp);
169
170    /*
171     * Idea behind checking for whole sizeof(ref) is that if
172     * ChaCha20_ctr32 oversteps i-th byte, then we'd know
173     */
174    for (j = 0; j < sizeof(ref); j++)
175        if (!TEST_uchar_eq(buf[j], ref[j])) {
176            TEST_info("%d failed at %u (%02x)\n", i, j, buf[j]);
177            return 0;
178        }
179    return 1;
180}
181
182int setup_tests(void)
183{
184#ifdef OPENSSL_CPUID_OBJ
185    OPENSSL_cpuid_setup();
186#endif
187
188    ADD_ALL_TESTS(test_cha_cha_internal, sizeof(ref));
189    return 1;
190}
191