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