xref: /freebsd/crypto/openssl/test/chacha_internal_test.c (revision 5b56413d04e608379c9a306373554a8e4d321bc0)
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 
20 static const unsigned int key[] = {
21     0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
22     0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c
23 };
24 
25 static const unsigned int ivp[] = {
26     0x00000000, 0x00000000, 0x03020100, 0x07060504
27 };
28 
29 static 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 
160 static 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 
182 int 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