2 * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
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
11 * Internal tests for the chacha module. EVP tests would exercise
12 * complete 32-byte blocks. This test goes per byte...
16 #include <openssl/opensslconf.h>
17 #include "test_main.h"
19 #include "internal/chacha.h"
21 const static unsigned int key[] = {
22 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
23 0x13121110, 0x17161514, 0x1b1a1918, 0x1f1e1d1c
26 const static unsigned int ivp[] = {
27 0x00000000, 0x00000000, 0x03020100, 0x07060504
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
161 static int test_cha_cha_internal(int n)
163 unsigned char buf[sizeof(ref)];
164 unsigned int i = n + 1, j;
167 memcpy(buf + i, ref + i, sizeof(ref) - i);
169 ChaCha20_ctr32(buf, buf, i, key, ivp);
172 * Idea behind checking for whole sizeof(ref) is that if
173 * ChaCha20_ctr32 oversteps i-th byte, then we'd know
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]);
183 void register_tests(void)
186 OPENSSL_cpuid_setup();
189 ADD_ALL_TESTS(test_cha_cha_internal, sizeof(ref));