Copyright consolidation 02/10
[openssl.git] / test / wp_test.c
1 /*
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
8  */
9
10 #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)
18 int main(int argc, char *argv[])
19 {
20     printf("No Whirlpool support\n");
21     return (0);
22 }
23 #else
24
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
35 };
36
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
46 };
47
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
57 };
58
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
68 };
69
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
79 };
80
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
90 };
91
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
101 };
102
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
112 };
113
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
123 };
124
125 int main(int argc, char *argv[])
126 {
127     unsigned char md[WHIRLPOOL_DIGEST_LENGTH];
128     int i;
129     WHIRLPOOL_CTX ctx;
130
131 # 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;
138
139         if ((env = getenv("OPENSSL_ia32cap")))
140             OPENSSL_ia32cap = strtoul(env, NULL, 0);
141     }
142 # endif
143
144     fprintf(stdout, "Testing Whirlpool ");
145
146     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);
154
155     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);
163
164     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);
172
173     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);
181
182     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);
190
191     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);
200
201     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);
210
211     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);
219
220     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);
240
241     fprintf(stdout, " passed.\n");
242     fflush(stdout);
243
244     return 0;
245 }
246 #endif