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