blob: 40859bae290296f3aa370cfe968a2ae17aae1907 [file] [log] [blame]
Rich Salz440e5d82016-05-17 14:20:24 -04001/*
2 * Copyright 2005-2016 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
Andy Polyakovd1593e62005-11-28 20:09:58 +00008 */
Rich Salz440e5d82016-05-17 14:20:24 -04009
Andy Polyakovd1593e62005-11-28 20:09:58 +000010#include <stdio.h>
11#include <string.h>
12#include <stdlib.h>
13
14#include <openssl/whrlpool.h>
15#include <openssl/crypto.h>
16
17#if defined(OPENSSL_NO_WHIRLPOOL)
18int main(int argc, char *argv[])
19{
20 printf("No Whirlpool support\n");
Matt Caswell0f113f32015-01-22 03:40:55 +000021 return (0);
Andy Polyakovd1593e62005-11-28 20:09:58 +000022}
23#else
24
25/* ISO/IEC 10118-3 test vector set */
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010026static const unsigned char iso_test_1[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000027 0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
28 0x9B, 0x44, 0xE3, 0x9C, 0x1D, 0x2E, 0x17, 0x26,
29 0xC5, 0x30, 0x23, 0x21, 0x30, 0xD4, 0x07, 0xF8,
30 0x9A, 0xFE, 0xE0, 0x96, 0x49, 0x97, 0xF7, 0xA7,
31 0x3E, 0x83, 0xBE, 0x69, 0x8B, 0x28, 0x8F, 0xEB,
32 0xCF, 0x88, 0xE3, 0xE0, 0x3C, 0x4F, 0x07, 0x57,
33 0xEA, 0x89, 0x64, 0xE5, 0x9B, 0x63, 0xD9, 0x37,
34 0x08, 0xB1, 0x38, 0xCC, 0x42, 0xA6, 0x6E, 0xB3
35};
Andy Polyakovd1593e62005-11-28 20:09:58 +000036
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010037static const unsigned char iso_test_2[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000038 0x8A, 0xCA, 0x26, 0x02, 0x79, 0x2A, 0xEC, 0x6F,
39 0x11, 0xA6, 0x72, 0x06, 0x53, 0x1F, 0xB7, 0xD7,
40 0xF0, 0xDF, 0xF5, 0x94, 0x13, 0x14, 0x5E, 0x69,
41 0x73, 0xC4, 0x50, 0x01, 0xD0, 0x08, 0x7B, 0x42,
42 0xD1, 0x1B, 0xC6, 0x45, 0x41, 0x3A, 0xEF, 0xF6,
43 0x3A, 0x42, 0x39, 0x1A, 0x39, 0x14, 0x5A, 0x59,
44 0x1A, 0x92, 0x20, 0x0D, 0x56, 0x01, 0x95, 0xE5,
45 0x3B, 0x47, 0x85, 0x84, 0xFD, 0xAE, 0x23, 0x1A
46};
Andy Polyakovd1593e62005-11-28 20:09:58 +000047
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010048static const unsigned char iso_test_3[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000049 0x4E, 0x24, 0x48, 0xA4, 0xC6, 0xF4, 0x86, 0xBB,
50 0x16, 0xB6, 0x56, 0x2C, 0x73, 0xB4, 0x02, 0x0B,
51 0xF3, 0x04, 0x3E, 0x3A, 0x73, 0x1B, 0xCE, 0x72,
52 0x1A, 0xE1, 0xB3, 0x03, 0xD9, 0x7E, 0x6D, 0x4C,
53 0x71, 0x81, 0xEE, 0xBD, 0xB6, 0xC5, 0x7E, 0x27,
54 0x7D, 0x0E, 0x34, 0x95, 0x71, 0x14, 0xCB, 0xD6,
55 0xC7, 0x97, 0xFC, 0x9D, 0x95, 0xD8, 0xB5, 0x82,
56 0xD2, 0x25, 0x29, 0x20, 0x76, 0xD4, 0xEE, 0xF5
57};
Andy Polyakovd1593e62005-11-28 20:09:58 +000058
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010059static const unsigned char iso_test_4[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000060 0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
61 0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
62 0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
63 0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B,
64 0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1,
65 0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6,
66 0x92, 0xED, 0x92, 0x00, 0x52, 0x83, 0x8F, 0x33,
67 0x62, 0xE8, 0x6D, 0xBD, 0x37, 0xA8, 0x90, 0x3E
68};
Andy Polyakovd1593e62005-11-28 20:09:58 +000069
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010070static const unsigned char iso_test_5[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000071 0xF1, 0xD7, 0x54, 0x66, 0x26, 0x36, 0xFF, 0xE9,
72 0x2C, 0x82, 0xEB, 0xB9, 0x21, 0x2A, 0x48, 0x4A,
73 0x8D, 0x38, 0x63, 0x1E, 0xAD, 0x42, 0x38, 0xF5,
74 0x44, 0x2E, 0xE1, 0x3B, 0x80, 0x54, 0xE4, 0x1B,
75 0x08, 0xBF, 0x2A, 0x92, 0x51, 0xC3, 0x0B, 0x6A,
76 0x0B, 0x8A, 0xAE, 0x86, 0x17, 0x7A, 0xB4, 0xA6,
77 0xF6, 0x8F, 0x67, 0x3E, 0x72, 0x07, 0x86, 0x5D,
78 0x5D, 0x98, 0x19, 0xA3, 0xDB, 0xA4, 0xEB, 0x3B
79};
Andy Polyakovd1593e62005-11-28 20:09:58 +000080
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010081static const unsigned char iso_test_6[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000082 0xDC, 0x37, 0xE0, 0x08, 0xCF, 0x9E, 0xE6, 0x9B,
83 0xF1, 0x1F, 0x00, 0xED, 0x9A, 0xBA, 0x26, 0x90,
84 0x1D, 0xD7, 0xC2, 0x8C, 0xDE, 0xC0, 0x66, 0xCC,
85 0x6A, 0xF4, 0x2E, 0x40, 0xF8, 0x2F, 0x3A, 0x1E,
86 0x08, 0xEB, 0xA2, 0x66, 0x29, 0x12, 0x9D, 0x8F,
87 0xB7, 0xCB, 0x57, 0x21, 0x1B, 0x92, 0x81, 0xA6,
88 0x55, 0x17, 0xCC, 0x87, 0x9D, 0x7B, 0x96, 0x21,
89 0x42, 0xC6, 0x5F, 0x5A, 0x7A, 0xF0, 0x14, 0x67
90};
Andy Polyakovd1593e62005-11-28 20:09:58 +000091
Ben Lauriedf2ee0e2015-09-05 13:32:58 +010092static const unsigned char iso_test_7[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +000093 0x46, 0x6E, 0xF1, 0x8B, 0xAB, 0xB0, 0x15, 0x4D,
94 0x25, 0xB9, 0xD3, 0x8A, 0x64, 0x14, 0xF5, 0xC0,
95 0x87, 0x84, 0x37, 0x2B, 0xCC, 0xB2, 0x04, 0xD6,
96 0x54, 0x9C, 0x4A, 0xFA, 0xDB, 0x60, 0x14, 0x29,
97 0x4D, 0x5B, 0xD8, 0xDF, 0x2A, 0x6C, 0x44, 0xE5,
98 0x38, 0xCD, 0x04, 0x7B, 0x26, 0x81, 0xA5, 0x1A,
99 0x2C, 0x60, 0x48, 0x1E, 0x88, 0xC5, 0xA2, 0x0B,
100 0x2C, 0x2A, 0x80, 0xCF, 0x3A, 0x9A, 0x08, 0x3B
101};
Andy Polyakovd1593e62005-11-28 20:09:58 +0000102
Ben Lauriedf2ee0e2015-09-05 13:32:58 +0100103static const unsigned char iso_test_8[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +0000104 0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
105 0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
106 0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
107 0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69,
108 0x16, 0xBD, 0xC8, 0x03, 0x1B, 0xC5, 0xBE, 0x1B,
109 0x7B, 0x94, 0x76, 0x39, 0xFE, 0x05, 0x0B, 0x56,
110 0x93, 0x9B, 0xAA, 0xA0, 0xAD, 0xFF, 0x9A, 0xE6,
111 0x74, 0x5B, 0x7B, 0x18, 0x1C, 0x3B, 0xE3, 0xFD
112};
Andy Polyakovd1593e62005-11-28 20:09:58 +0000113
Ben Lauriedf2ee0e2015-09-05 13:32:58 +0100114static const unsigned char iso_test_9[WHIRLPOOL_DIGEST_LENGTH] = {
Matt Caswell0f113f32015-01-22 03:40:55 +0000115 0x0C, 0x99, 0x00, 0x5B, 0xEB, 0x57, 0xEF, 0xF5,
116 0x0A, 0x7C, 0xF0, 0x05, 0x56, 0x0D, 0xDF, 0x5D,
117 0x29, 0x05, 0x7F, 0xD8, 0x6B, 0x20, 0xBF, 0xD6,
118 0x2D, 0xEC, 0xA0, 0xF1, 0xCC, 0xEA, 0x4A, 0xF5,
119 0x1F, 0xC1, 0x54, 0x90, 0xED, 0xDC, 0x47, 0xAF,
120 0x32, 0xBB, 0x2B, 0x66, 0xC3, 0x4F, 0xF9, 0xAD,
121 0x8C, 0x60, 0x08, 0xAD, 0x67, 0x7F, 0x77, 0x12,
122 0x69, 0x53, 0xB2, 0x26, 0xE4, 0xED, 0x8B, 0x01
123};
Andy Polyakovd1593e62005-11-28 20:09:58 +0000124
Matt Caswell0f113f32015-01-22 03:40:55 +0000125int main(int argc, char *argv[])
126{
127 unsigned char md[WHIRLPOOL_DIGEST_LENGTH];
128 int i;
129 WHIRLPOOL_CTX ctx;
Andy Polyakovd1593e62005-11-28 20:09:58 +0000130
Matt Caswell0f113f32015-01-22 03:40:55 +0000131# ifdef OPENSSL_IA32_SSE2
132 /*
133 * Alternative to this is to call OpenSSL_add_all_algorithms... The below
134 * code is retained exclusively for debugging purposes.
135 */
136 {
137 char *env;
Andy Polyakovd1593e62005-11-28 20:09:58 +0000138
Matt Caswell0f113f32015-01-22 03:40:55 +0000139 if ((env = getenv("OPENSSL_ia32cap")))
140 OPENSSL_ia32cap = strtoul(env, NULL, 0);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000141 }
Matt Caswell0f113f32015-01-22 03:40:55 +0000142# endif
Andy Polyakovd1593e62005-11-28 20:09:58 +0000143
Matt Caswell0f113f32015-01-22 03:40:55 +0000144 fprintf(stdout, "Testing Whirlpool ");
Andy Polyakovd1593e62005-11-28 20:09:58 +0000145
Matt Caswell0f113f32015-01-22 03:40:55 +0000146 WHIRLPOOL("", 0, md);
147 if (memcmp(md, iso_test_1, sizeof(iso_test_1))) {
148 fflush(stdout);
149 fprintf(stderr, "\nTEST 1 of 9 failed.\n");
150 return 1;
151 } else
152 fprintf(stdout, ".");
153 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000154
Matt Caswell0f113f32015-01-22 03:40:55 +0000155 WHIRLPOOL("a", 1, md);
156 if (memcmp(md, iso_test_2, sizeof(iso_test_2))) {
157 fflush(stdout);
158 fprintf(stderr, "\nTEST 2 of 9 failed.\n");
159 return 1;
160 } else
161 fprintf(stdout, ".");
162 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000163
Matt Caswell0f113f32015-01-22 03:40:55 +0000164 WHIRLPOOL("abc", 3, md);
165 if (memcmp(md, iso_test_3, sizeof(iso_test_3))) {
166 fflush(stdout);
167 fprintf(stderr, "\nTEST 3 of 9 failed.\n");
168 return 1;
169 } else
170 fprintf(stdout, ".");
171 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000172
Matt Caswell0f113f32015-01-22 03:40:55 +0000173 WHIRLPOOL("message digest", 14, md);
174 if (memcmp(md, iso_test_4, sizeof(iso_test_4))) {
175 fflush(stdout);
176 fprintf(stderr, "\nTEST 4 of 9 failed.\n");
177 return 1;
178 } else
179 fprintf(stdout, ".");
180 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000181
Matt Caswell0f113f32015-01-22 03:40:55 +0000182 WHIRLPOOL("abcdefghijklmnopqrstuvwxyz", 26, md);
183 if (memcmp(md, iso_test_5, sizeof(iso_test_5))) {
184 fflush(stdout);
185 fprintf(stderr, "\nTEST 5 of 9 failed.\n");
186 return 1;
187 } else
188 fprintf(stdout, ".");
189 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000190
Matt Caswell0f113f32015-01-22 03:40:55 +0000191 WHIRLPOOL("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
192 "abcdefghijklmnopqrstuvwxyz" "0123456789", 62, md);
193 if (memcmp(md, iso_test_6, sizeof(iso_test_6))) {
194 fflush(stdout);
195 fprintf(stderr, "\nTEST 6 of 9 failed.\n");
196 return 1;
197 } else
198 fprintf(stdout, ".");
199 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000200
Matt Caswell0f113f32015-01-22 03:40:55 +0000201 WHIRLPOOL("1234567890" "1234567890" "1234567890" "1234567890"
202 "1234567890" "1234567890" "1234567890" "1234567890", 80, md);
203 if (memcmp(md, iso_test_7, sizeof(iso_test_7))) {
204 fflush(stdout);
205 fprintf(stderr, "\nTEST 7 of 9 failed.\n");
206 return 1;
207 } else
208 fprintf(stdout, ".");
209 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000210
Matt Caswell0f113f32015-01-22 03:40:55 +0000211 WHIRLPOOL("abcdbcdecdefdefgefghfghighijhijk", 32, md);
212 if (memcmp(md, iso_test_8, sizeof(iso_test_8))) {
213 fflush(stdout);
214 fprintf(stderr, "\nTEST 8 of 9 failed.\n");
215 return 1;
216 } else
217 fprintf(stdout, ".");
218 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000219
Matt Caswell0f113f32015-01-22 03:40:55 +0000220 WHIRLPOOL_Init(&ctx);
221 for (i = 0; i < 1000000; i += 288)
222 WHIRLPOOL_Update(&ctx, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
223 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
224 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
225 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
226 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
227 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
228 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
229 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
230 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
231 (1000000 - i) < 288 ? 1000000 - i : 288);
232 WHIRLPOOL_Final(md, &ctx);
233 if (memcmp(md, iso_test_9, sizeof(iso_test_9))) {
234 fflush(stdout);
235 fprintf(stderr, "\nTEST 9 of 9 failed.\n");
236 return 1;
237 } else
238 fprintf(stdout, ".");
239 fflush(stdout);
Andy Polyakovd1593e62005-11-28 20:09:58 +0000240
Matt Caswell0f113f32015-01-22 03:40:55 +0000241 fprintf(stdout, " passed.\n");
242 fflush(stdout);
243
244 return 0;
Andy Polyakovd1593e62005-11-28 20:09:58 +0000245}
246#endif