man3/OPENSSL_ia32cap.pod: clarify AVX512 support in clang context.
[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     fprintf(stdout, "Testing Whirlpool ");
132
133     WHIRLPOOL("", 0, md);
134     if (memcmp(md, iso_test_1, sizeof(iso_test_1))) {
135         fflush(stdout);
136         fprintf(stderr, "\nTEST 1 of 9 failed.\n");
137         return 1;
138     } else
139         fprintf(stdout, ".");
140     fflush(stdout);
141
142     WHIRLPOOL("a", 1, md);
143     if (memcmp(md, iso_test_2, sizeof(iso_test_2))) {
144         fflush(stdout);
145         fprintf(stderr, "\nTEST 2 of 9 failed.\n");
146         return 1;
147     } else
148         fprintf(stdout, ".");
149     fflush(stdout);
150
151     WHIRLPOOL("abc", 3, md);
152     if (memcmp(md, iso_test_3, sizeof(iso_test_3))) {
153         fflush(stdout);
154         fprintf(stderr, "\nTEST 3 of 9 failed.\n");
155         return 1;
156     } else
157         fprintf(stdout, ".");
158     fflush(stdout);
159
160     WHIRLPOOL("message digest", 14, md);
161     if (memcmp(md, iso_test_4, sizeof(iso_test_4))) {
162         fflush(stdout);
163         fprintf(stderr, "\nTEST 4 of 9 failed.\n");
164         return 1;
165     } else
166         fprintf(stdout, ".");
167     fflush(stdout);
168
169     WHIRLPOOL("abcdefghijklmnopqrstuvwxyz", 26, md);
170     if (memcmp(md, iso_test_5, sizeof(iso_test_5))) {
171         fflush(stdout);
172         fprintf(stderr, "\nTEST 5 of 9 failed.\n");
173         return 1;
174     } else
175         fprintf(stdout, ".");
176     fflush(stdout);
177
178     WHIRLPOOL("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
179               "abcdefghijklmnopqrstuvwxyz" "0123456789", 62, md);
180     if (memcmp(md, iso_test_6, sizeof(iso_test_6))) {
181         fflush(stdout);
182         fprintf(stderr, "\nTEST 6 of 9 failed.\n");
183         return 1;
184     } else
185         fprintf(stdout, ".");
186     fflush(stdout);
187
188     WHIRLPOOL("1234567890" "1234567890" "1234567890" "1234567890"
189               "1234567890" "1234567890" "1234567890" "1234567890", 80, md);
190     if (memcmp(md, iso_test_7, sizeof(iso_test_7))) {
191         fflush(stdout);
192         fprintf(stderr, "\nTEST 7 of 9 failed.\n");
193         return 1;
194     } else
195         fprintf(stdout, ".");
196     fflush(stdout);
197
198     WHIRLPOOL("abcdbcdecdefdefgefghfghighijhijk", 32, md);
199     if (memcmp(md, iso_test_8, sizeof(iso_test_8))) {
200         fflush(stdout);
201         fprintf(stderr, "\nTEST 8 of 9 failed.\n");
202         return 1;
203     } else
204         fprintf(stdout, ".");
205     fflush(stdout);
206
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))) {
221         fflush(stdout);
222         fprintf(stderr, "\nTEST 9 of 9 failed.\n");
223         return 1;
224     } else
225         fprintf(stdout, ".");
226     fflush(stdout);
227
228     fprintf(stdout, " passed.\n");
229     fflush(stdout);
230
231     return 0;
232 }
233 #endif