1238384Sjkim/* ====================================================================
2238384Sjkim * Copyright (c) 2005 The OpenSSL Project.  All rights reserved.
3238384Sjkim * ====================================================================
4238384Sjkim */
5238384Sjkim#include <stdio.h>
6238384Sjkim#include <string.h>
7238384Sjkim#include <stdlib.h>
8238384Sjkim
9238384Sjkim#include <openssl/whrlpool.h>
10238384Sjkim#include <openssl/crypto.h>
11238384Sjkim
12238384Sjkim#if defined(OPENSSL_NO_WHIRLPOOL)
13238384Sjkimint main(int argc, char *argv[])
14238384Sjkim{
15238384Sjkim    printf("No Whirlpool support\n");
16280304Sjkim    return (0);
17238384Sjkim}
18238384Sjkim#else
19238384Sjkim
20238384Sjkim/* ISO/IEC 10118-3 test vector set */
21238384Sjkimunsigned char iso_test_1[WHIRLPOOL_DIGEST_LENGTH] = {
22280304Sjkim    0x19, 0xFA, 0x61, 0xD7, 0x55, 0x22, 0xA4, 0x66,
23280304Sjkim    0x9B, 0x44, 0xE3, 0x9C, 0x1D, 0x2E, 0x17, 0x26,
24280304Sjkim    0xC5, 0x30, 0x23, 0x21, 0x30, 0xD4, 0x07, 0xF8,
25280304Sjkim    0x9A, 0xFE, 0xE0, 0x96, 0x49, 0x97, 0xF7, 0xA7,
26280304Sjkim    0x3E, 0x83, 0xBE, 0x69, 0x8B, 0x28, 0x8F, 0xEB,
27280304Sjkim    0xCF, 0x88, 0xE3, 0xE0, 0x3C, 0x4F, 0x07, 0x57,
28280304Sjkim    0xEA, 0x89, 0x64, 0xE5, 0x9B, 0x63, 0xD9, 0x37,
29280304Sjkim    0x08, 0xB1, 0x38, 0xCC, 0x42, 0xA6, 0x6E, 0xB3
30280304Sjkim};
31238384Sjkim
32238384Sjkimunsigned char iso_test_2[WHIRLPOOL_DIGEST_LENGTH] = {
33280304Sjkim    0x8A, 0xCA, 0x26, 0x02, 0x79, 0x2A, 0xEC, 0x6F,
34280304Sjkim    0x11, 0xA6, 0x72, 0x06, 0x53, 0x1F, 0xB7, 0xD7,
35280304Sjkim    0xF0, 0xDF, 0xF5, 0x94, 0x13, 0x14, 0x5E, 0x69,
36280304Sjkim    0x73, 0xC4, 0x50, 0x01, 0xD0, 0x08, 0x7B, 0x42,
37280304Sjkim    0xD1, 0x1B, 0xC6, 0x45, 0x41, 0x3A, 0xEF, 0xF6,
38280304Sjkim    0x3A, 0x42, 0x39, 0x1A, 0x39, 0x14, 0x5A, 0x59,
39280304Sjkim    0x1A, 0x92, 0x20, 0x0D, 0x56, 0x01, 0x95, 0xE5,
40280304Sjkim    0x3B, 0x47, 0x85, 0x84, 0xFD, 0xAE, 0x23, 0x1A
41280304Sjkim};
42238384Sjkim
43238384Sjkimunsigned char iso_test_3[WHIRLPOOL_DIGEST_LENGTH] = {
44280304Sjkim    0x4E, 0x24, 0x48, 0xA4, 0xC6, 0xF4, 0x86, 0xBB,
45280304Sjkim    0x16, 0xB6, 0x56, 0x2C, 0x73, 0xB4, 0x02, 0x0B,
46280304Sjkim    0xF3, 0x04, 0x3E, 0x3A, 0x73, 0x1B, 0xCE, 0x72,
47280304Sjkim    0x1A, 0xE1, 0xB3, 0x03, 0xD9, 0x7E, 0x6D, 0x4C,
48280304Sjkim    0x71, 0x81, 0xEE, 0xBD, 0xB6, 0xC5, 0x7E, 0x27,
49280304Sjkim    0x7D, 0x0E, 0x34, 0x95, 0x71, 0x14, 0xCB, 0xD6,
50280304Sjkim    0xC7, 0x97, 0xFC, 0x9D, 0x95, 0xD8, 0xB5, 0x82,
51280304Sjkim    0xD2, 0x25, 0x29, 0x20, 0x76, 0xD4, 0xEE, 0xF5
52280304Sjkim};
53238384Sjkim
54238384Sjkimunsigned char iso_test_4[WHIRLPOOL_DIGEST_LENGTH] = {
55280304Sjkim    0x37, 0x8C, 0x84, 0xA4, 0x12, 0x6E, 0x2D, 0xC6,
56280304Sjkim    0xE5, 0x6D, 0xCC, 0x74, 0x58, 0x37, 0x7A, 0xAC,
57280304Sjkim    0x83, 0x8D, 0x00, 0x03, 0x22, 0x30, 0xF5, 0x3C,
58280304Sjkim    0xE1, 0xF5, 0x70, 0x0C, 0x0F, 0xFB, 0x4D, 0x3B,
59280304Sjkim    0x84, 0x21, 0x55, 0x76, 0x59, 0xEF, 0x55, 0xC1,
60280304Sjkim    0x06, 0xB4, 0xB5, 0x2A, 0xC5, 0xA4, 0xAA, 0xA6,
61280304Sjkim    0x92, 0xED, 0x92, 0x00, 0x52, 0x83, 0x8F, 0x33,
62280304Sjkim    0x62, 0xE8, 0x6D, 0xBD, 0x37, 0xA8, 0x90, 0x3E
63280304Sjkim};
64238384Sjkim
65238384Sjkimunsigned char iso_test_5[WHIRLPOOL_DIGEST_LENGTH] = {
66280304Sjkim    0xF1, 0xD7, 0x54, 0x66, 0x26, 0x36, 0xFF, 0xE9,
67280304Sjkim    0x2C, 0x82, 0xEB, 0xB9, 0x21, 0x2A, 0x48, 0x4A,
68280304Sjkim    0x8D, 0x38, 0x63, 0x1E, 0xAD, 0x42, 0x38, 0xF5,
69280304Sjkim    0x44, 0x2E, 0xE1, 0x3B, 0x80, 0x54, 0xE4, 0x1B,
70280304Sjkim    0x08, 0xBF, 0x2A, 0x92, 0x51, 0xC3, 0x0B, 0x6A,
71280304Sjkim    0x0B, 0x8A, 0xAE, 0x86, 0x17, 0x7A, 0xB4, 0xA6,
72280304Sjkim    0xF6, 0x8F, 0x67, 0x3E, 0x72, 0x07, 0x86, 0x5D,
73280304Sjkim    0x5D, 0x98, 0x19, 0xA3, 0xDB, 0xA4, 0xEB, 0x3B
74280304Sjkim};
75238384Sjkim
76238384Sjkimunsigned char iso_test_6[WHIRLPOOL_DIGEST_LENGTH] = {
77280304Sjkim    0xDC, 0x37, 0xE0, 0x08, 0xCF, 0x9E, 0xE6, 0x9B,
78280304Sjkim    0xF1, 0x1F, 0x00, 0xED, 0x9A, 0xBA, 0x26, 0x90,
79280304Sjkim    0x1D, 0xD7, 0xC2, 0x8C, 0xDE, 0xC0, 0x66, 0xCC,
80280304Sjkim    0x6A, 0xF4, 0x2E, 0x40, 0xF8, 0x2F, 0x3A, 0x1E,
81280304Sjkim    0x08, 0xEB, 0xA2, 0x66, 0x29, 0x12, 0x9D, 0x8F,
82280304Sjkim    0xB7, 0xCB, 0x57, 0x21, 0x1B, 0x92, 0x81, 0xA6,
83280304Sjkim    0x55, 0x17, 0xCC, 0x87, 0x9D, 0x7B, 0x96, 0x21,
84280304Sjkim    0x42, 0xC6, 0x5F, 0x5A, 0x7A, 0xF0, 0x14, 0x67
85280304Sjkim};
86238384Sjkim
87238384Sjkimunsigned char iso_test_7[WHIRLPOOL_DIGEST_LENGTH] = {
88280304Sjkim    0x46, 0x6E, 0xF1, 0x8B, 0xAB, 0xB0, 0x15, 0x4D,
89280304Sjkim    0x25, 0xB9, 0xD3, 0x8A, 0x64, 0x14, 0xF5, 0xC0,
90280304Sjkim    0x87, 0x84, 0x37, 0x2B, 0xCC, 0xB2, 0x04, 0xD6,
91280304Sjkim    0x54, 0x9C, 0x4A, 0xFA, 0xDB, 0x60, 0x14, 0x29,
92280304Sjkim    0x4D, 0x5B, 0xD8, 0xDF, 0x2A, 0x6C, 0x44, 0xE5,
93280304Sjkim    0x38, 0xCD, 0x04, 0x7B, 0x26, 0x81, 0xA5, 0x1A,
94280304Sjkim    0x2C, 0x60, 0x48, 0x1E, 0x88, 0xC5, 0xA2, 0x0B,
95280304Sjkim    0x2C, 0x2A, 0x80, 0xCF, 0x3A, 0x9A, 0x08, 0x3B
96280304Sjkim};
97238384Sjkim
98238384Sjkimunsigned char iso_test_8[WHIRLPOOL_DIGEST_LENGTH] = {
99280304Sjkim    0x2A, 0x98, 0x7E, 0xA4, 0x0F, 0x91, 0x70, 0x61,
100280304Sjkim    0xF5, 0xD6, 0xF0, 0xA0, 0xE4, 0x64, 0x4F, 0x48,
101280304Sjkim    0x8A, 0x7A, 0x5A, 0x52, 0xDE, 0xEE, 0x65, 0x62,
102280304Sjkim    0x07, 0xC5, 0x62, 0xF9, 0x88, 0xE9, 0x5C, 0x69,
103280304Sjkim    0x16, 0xBD, 0xC8, 0x03, 0x1B, 0xC5, 0xBE, 0x1B,
104280304Sjkim    0x7B, 0x94, 0x76, 0x39, 0xFE, 0x05, 0x0B, 0x56,
105280304Sjkim    0x93, 0x9B, 0xAA, 0xA0, 0xAD, 0xFF, 0x9A, 0xE6,
106280304Sjkim    0x74, 0x5B, 0x7B, 0x18, 0x1C, 0x3B, 0xE3, 0xFD
107280304Sjkim};
108238384Sjkim
109238384Sjkimunsigned char iso_test_9[WHIRLPOOL_DIGEST_LENGTH] = {
110280304Sjkim    0x0C, 0x99, 0x00, 0x5B, 0xEB, 0x57, 0xEF, 0xF5,
111280304Sjkim    0x0A, 0x7C, 0xF0, 0x05, 0x56, 0x0D, 0xDF, 0x5D,
112280304Sjkim    0x29, 0x05, 0x7F, 0xD8, 0x6B, 0x20, 0xBF, 0xD6,
113280304Sjkim    0x2D, 0xEC, 0xA0, 0xF1, 0xCC, 0xEA, 0x4A, 0xF5,
114280304Sjkim    0x1F, 0xC1, 0x54, 0x90, 0xED, 0xDC, 0x47, 0xAF,
115280304Sjkim    0x32, 0xBB, 0x2B, 0x66, 0xC3, 0x4F, 0xF9, 0xAD,
116280304Sjkim    0x8C, 0x60, 0x08, 0xAD, 0x67, 0x7F, 0x77, 0x12,
117280304Sjkim    0x69, 0x53, 0xB2, 0x26, 0xE4, 0xED, 0x8B, 0x01
118280304Sjkim};
119238384Sjkim
120280304Sjkimint main(int argc, char *argv[])
121280304Sjkim{
122280304Sjkim    unsigned char md[WHIRLPOOL_DIGEST_LENGTH];
123280304Sjkim    int i;
124280304Sjkim    WHIRLPOOL_CTX ctx;
125238384Sjkim
126280304Sjkim# ifdef OPENSSL_IA32_SSE2
127280304Sjkim    /*
128280304Sjkim     * Alternative to this is to call OpenSSL_add_all_algorithms... The below
129280304Sjkim     * code is retained exclusively for debugging purposes.
130280304Sjkim     */
131280304Sjkim    {
132280304Sjkim        char *env;
133238384Sjkim
134280304Sjkim        if ((env = getenv("OPENSSL_ia32cap")))
135280304Sjkim            OPENSSL_ia32cap = strtoul(env, NULL, 0);
136238384Sjkim    }
137280304Sjkim# endif
138238384Sjkim
139280304Sjkim    fprintf(stdout, "Testing Whirlpool ");
140238384Sjkim
141280304Sjkim    WHIRLPOOL("", 0, md);
142280304Sjkim    if (memcmp(md, iso_test_1, sizeof(iso_test_1))) {
143280304Sjkim        fflush(stdout);
144280304Sjkim        fprintf(stderr, "\nTEST 1 of 9 failed.\n");
145280304Sjkim        return 1;
146280304Sjkim    } else
147280304Sjkim        fprintf(stdout, ".");
148280304Sjkim    fflush(stdout);
149238384Sjkim
150280304Sjkim    WHIRLPOOL("a", 1, md);
151280304Sjkim    if (memcmp(md, iso_test_2, sizeof(iso_test_2))) {
152280304Sjkim        fflush(stdout);
153280304Sjkim        fprintf(stderr, "\nTEST 2 of 9 failed.\n");
154280304Sjkim        return 1;
155280304Sjkim    } else
156280304Sjkim        fprintf(stdout, ".");
157280304Sjkim    fflush(stdout);
158238384Sjkim
159280304Sjkim    WHIRLPOOL("abc", 3, md);
160280304Sjkim    if (memcmp(md, iso_test_3, sizeof(iso_test_3))) {
161280304Sjkim        fflush(stdout);
162280304Sjkim        fprintf(stderr, "\nTEST 3 of 9 failed.\n");
163280304Sjkim        return 1;
164280304Sjkim    } else
165280304Sjkim        fprintf(stdout, ".");
166280304Sjkim    fflush(stdout);
167238384Sjkim
168280304Sjkim    WHIRLPOOL("message digest", 14, md);
169280304Sjkim    if (memcmp(md, iso_test_4, sizeof(iso_test_4))) {
170280304Sjkim        fflush(stdout);
171280304Sjkim        fprintf(stderr, "\nTEST 4 of 9 failed.\n");
172280304Sjkim        return 1;
173280304Sjkim    } else
174280304Sjkim        fprintf(stdout, ".");
175280304Sjkim    fflush(stdout);
176238384Sjkim
177280304Sjkim    WHIRLPOOL("abcdefghijklmnopqrstuvwxyz", 26, md);
178280304Sjkim    if (memcmp(md, iso_test_5, sizeof(iso_test_5))) {
179280304Sjkim        fflush(stdout);
180280304Sjkim        fprintf(stderr, "\nTEST 5 of 9 failed.\n");
181280304Sjkim        return 1;
182280304Sjkim    } else
183280304Sjkim        fprintf(stdout, ".");
184280304Sjkim    fflush(stdout);
185238384Sjkim
186280304Sjkim    WHIRLPOOL("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
187280304Sjkim              "abcdefghijklmnopqrstuvwxyz" "0123456789", 62, md);
188280304Sjkim    if (memcmp(md, iso_test_6, sizeof(iso_test_6))) {
189280304Sjkim        fflush(stdout);
190280304Sjkim        fprintf(stderr, "\nTEST 6 of 9 failed.\n");
191280304Sjkim        return 1;
192280304Sjkim    } else
193280304Sjkim        fprintf(stdout, ".");
194280304Sjkim    fflush(stdout);
195238384Sjkim
196280304Sjkim    WHIRLPOOL("1234567890" "1234567890" "1234567890" "1234567890"
197280304Sjkim              "1234567890" "1234567890" "1234567890" "1234567890", 80, md);
198280304Sjkim    if (memcmp(md, iso_test_7, sizeof(iso_test_7))) {
199280304Sjkim        fflush(stdout);
200280304Sjkim        fprintf(stderr, "\nTEST 7 of 9 failed.\n");
201280304Sjkim        return 1;
202280304Sjkim    } else
203280304Sjkim        fprintf(stdout, ".");
204280304Sjkim    fflush(stdout);
205238384Sjkim
206280304Sjkim    WHIRLPOOL("abcdbcdecdefdefgefghfghighijhijk", 32, md);
207280304Sjkim    if (memcmp(md, iso_test_8, sizeof(iso_test_8))) {
208280304Sjkim        fflush(stdout);
209280304Sjkim        fprintf(stderr, "\nTEST 8 of 9 failed.\n");
210280304Sjkim        return 1;
211280304Sjkim    } else
212280304Sjkim        fprintf(stdout, ".");
213280304Sjkim    fflush(stdout);
214238384Sjkim
215280304Sjkim    WHIRLPOOL_Init(&ctx);
216280304Sjkim    for (i = 0; i < 1000000; i += 288)
217280304Sjkim        WHIRLPOOL_Update(&ctx, "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
218280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
219280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
220280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
221280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
222280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
223280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
224280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa"
225280304Sjkim                         "aaaaaaaa" "aaaaaaaa" "aaaaaaaa" "aaaaaaaa",
226280304Sjkim                         (1000000 - i) < 288 ? 1000000 - i : 288);
227280304Sjkim    WHIRLPOOL_Final(md, &ctx);
228280304Sjkim    if (memcmp(md, iso_test_9, sizeof(iso_test_9))) {
229280304Sjkim        fflush(stdout);
230280304Sjkim        fprintf(stderr, "\nTEST 9 of 9 failed.\n");
231280304Sjkim        return 1;
232280304Sjkim    } else
233280304Sjkim        fprintf(stdout, ".");
234280304Sjkim    fflush(stdout);
235238384Sjkim
236280304Sjkim    fprintf(stdout, " passed.\n");
237280304Sjkim    fflush(stdout);
238280304Sjkim
239280304Sjkim    return 0;
240238384Sjkim}
241238384Sjkim#endif
242