2 * Copyright 2005-2016 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
14 #include <openssl/whrlpool.h>
15 #include <openssl/crypto.h>
17 #if defined(OPENSSL_NO_WHIRLPOOL)
18 int main(int argc, char *argv[])
20 printf("No Whirlpool support\n");
25 /* ISO/IEC 10118-3 test vector set */
26 static const unsigned char iso_test_1[WHIRLPOOL_DIGEST_LENGTH] = {
27 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
37 static const unsigned char iso_test_2[WHIRLPOOL_DIGEST_LENGTH] = {
38 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
48 static const unsigned char iso_test_3[WHIRLPOOL_DIGEST_LENGTH] = {
49 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
59 static const unsigned char iso_test_4[WHIRLPOOL_DIGEST_LENGTH] = {
60 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
70 static const unsigned char iso_test_5[WHIRLPOOL_DIGEST_LENGTH] = {
71 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
81 static const unsigned char iso_test_6[WHIRLPOOL_DIGEST_LENGTH] = {
82 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
92 static const unsigned char iso_test_7[WHIRLPOOL_DIGEST_LENGTH] = {
93 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
103 static const unsigned char iso_test_8[WHIRLPOOL_DIGEST_LENGTH] = {
104 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
114 static const unsigned char iso_test_9[WHIRLPOOL_DIGEST_LENGTH] = {
115 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
125 int main(int argc, char *argv[])
127 unsigned char md[WHIRLPOOL_DIGEST_LENGTH];
131 fprintf(stdout, "Testing Whirlpool ");
133 WHIRLPOOL("", 0, md);
134 if (memcmp(md, iso_test_1, sizeof(iso_test_1))) {
136 fprintf(stderr, "\nTEST 1 of 9 failed.\n");
139 fprintf(stdout, ".");
142 WHIRLPOOL("a", 1, md);
143 if (memcmp(md, iso_test_2, sizeof(iso_test_2))) {
145 fprintf(stderr, "\nTEST 2 of 9 failed.\n");
148 fprintf(stdout, ".");
151 WHIRLPOOL("abc", 3, md);
152 if (memcmp(md, iso_test_3, sizeof(iso_test_3))) {
154 fprintf(stderr, "\nTEST 3 of 9 failed.\n");
157 fprintf(stdout, ".");
160 WHIRLPOOL("message digest", 14, md);
161 if (memcmp(md, iso_test_4, sizeof(iso_test_4))) {
163 fprintf(stderr, "\nTEST 4 of 9 failed.\n");
166 fprintf(stdout, ".");
169 WHIRLPOOL("abcdefghijklmnopqrstuvwxyz", 26, md);
170 if (memcmp(md, iso_test_5, sizeof(iso_test_5))) {
172 fprintf(stderr, "\nTEST 5 of 9 failed.\n");
175 fprintf(stdout, ".");
178 WHIRLPOOL("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
179 "abcdefghijklmnopqrstuvwxyz" "0123456789", 62, md);
180 if (memcmp(md, iso_test_6, sizeof(iso_test_6))) {
182 fprintf(stderr, "\nTEST 6 of 9 failed.\n");
185 fprintf(stdout, ".");
188 WHIRLPOOL("1234567890" "1234567890" "1234567890" "1234567890"
189 "1234567890" "1234567890" "1234567890" "1234567890", 80, md);
190 if (memcmp(md, iso_test_7, sizeof(iso_test_7))) {
192 fprintf(stderr, "\nTEST 7 of 9 failed.\n");
195 fprintf(stdout, ".");
198 WHIRLPOOL("abcdbcdecdefdefgefghfghighijhijk", 32, md);
199 if (memcmp(md, iso_test_8, sizeof(iso_test_8))) {
201 fprintf(stderr, "\nTEST 8 of 9 failed.\n");
204 fprintf(stdout, ".");
207 WHIRLPOOL_Init(&ctx);
208 for (i = 0; i < 1000000; i += 288)
209 WHIRLPOOL_Update(&ctx, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
210 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
211 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
212 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
213 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
214 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
215 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
216 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
217 "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
218 (1000000 - i) < 288 ? 1000000 - i : 288);
219 WHIRLPOOL_Final(md, &ctx);
220 if (memcmp(md, iso_test_9, sizeof(iso_test_9))) {
222 fprintf(stderr, "\nTEST 9 of 9 failed.\n");
225 fprintf(stdout, ".");
228 fprintf(stdout, " passed.\n");