/* $Id: speed.c 223 2010-06-09 13:22:59Z tp $ */ /* * Speed testing for some hash functions. Each function is invoked * repeatedly on messages of increasing sizes (16, 64, 256, 1024 and * 8192 bytes). The resulting hash function bandwidth is then printed in * megabytes per second. Larger blocks increase bandwidth, since this * makes finalization events rarer (e.g. final padding). This test is * similar to what "openssl speed" performs. * * An additional test is performed for a "long message": a single * computation over a message consisting of many consecutive blocks * of 8192 bytes. This measures top hashing speed for a long stream. * * ==========================(LICENSE BEGIN)============================ * * Copyright (c) 2007-2010 Projet RNRT SAPHIR * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * ===========================(LICENSE END)============================= * * @author Thomas Pornin */ #include #include #include #include #include "sph_blake.h" #include "sph_bmw.h" #include "sph_cubehash.h" #include "sph_echo.h" #include "sph_fugue.h" #include "sph_groestl.h" #include "sph_hamsi.h" #include "sph_haval.h" #include "sph_jh.h" #include "sph_keccak.h" #include "sph_luffa.h" #include "sph_md2.h" #include "sph_md4.h" #include "sph_md5.h" #include "sph_panama.h" #include "sph_radiogatun.h" #include "sph_ripemd.h" #include "sph_sha0.h" #include "sph_sha1.h" #include "sph_sha2.h" #include "sph_shabal.h" #include "sph_shavite.h" #include "sph_simd.h" #include "sph_skein.h" #include "sph_tiger.h" #include "sph_whirlpool.h" #define DATA_LEN 8192 static unsigned char *data; static size_t data_ptr; #define SPEED_TEST(Name, cname) \ static double \ speed_ ## cname ## _unit(size_t clen, size_t num) \ { \ clock_t orig, end; \ sph_ ## cname ## _context mc; \ \ orig = clock(); \ while (num -- > 0) { \ sph_ ## cname ## _init(&mc); \ sph_ ## cname(&mc, data, clen); \ sph_ ## cname ## _close(&mc, data + data_ptr); \ data_ptr += (SPH_SIZE_ ## cname / 8); \ if (data_ptr > (DATA_LEN - (SPH_SIZE_ ## cname / 8))) \ data_ptr = 0; \ } \ end = clock(); \ return (end - orig) / (double)CLOCKS_PER_SEC; \ } \ \ static double \ speed_ ## cname ## _long(size_t clen, size_t num) \ { \ clock_t orig, end; \ sph_ ## cname ## _context mc; \ unsigned char res[64]; \ \ orig = clock(); \ sph_ ## cname ## _init(&mc); \ while (num -- > 0) { \ sph_ ## cname(&mc, data, clen); \ } \ sph_ ## cname ## _close(&mc, res); \ end = clock(); \ return (end - orig) / (double)CLOCKS_PER_SEC; \ } \ \ static void \ speed_ ## cname(void) \ { \ size_t clen, num; \ \ printf("Speed test: %s\n", Name); \ fflush(stdout); \ num = 2; \ for (clen = 16;; clen <<= 2) { \ double tt; \ \ if (clen == 4096) { \ clen = DATA_LEN; \ if (num > 1) \ num >>= 1; \ } \ for (;;) { \ tt = speed_ ## cname ## _unit(clen, num); \ if (tt > 6.0) { \ if (num <= 1) \ break; \ num >>= 1; \ } else if (tt < 2.0) { \ num += num; \ } else { \ break; \ } \ } \ printf("message length = %5lu -> %7.2f MBytes/s\n", \ (unsigned long)clen, \ ((double)clen * (double)num) / (1000000.0 * tt)); \ fflush(stdout); \ if (clen == DATA_LEN) { \ tt = speed_ ## cname ## _long(clen, num); \ printf("long messages -> %7.2f MBytes/s\n", \ ((double)clen * (double)num) \ / (1000000.0 * tt)); \ fflush(stdout); \ break; \ } \ if (num > 4) \ num >>= 2; \ } \ } SPEED_TEST("MD2", md2) SPEED_TEST("MD4", md4) SPEED_TEST("MD5", md5) SPEED_TEST("SHA-0", sha0) SPEED_TEST("SHA-1", sha1) SPEED_TEST("SHA-224", sha224) SPEED_TEST("SHA-256", sha256) #if SPH_64 SPEED_TEST("SHA-384", sha384) SPEED_TEST("SHA-512", sha512) #endif SPEED_TEST("RIPEMD", ripemd) SPEED_TEST("RIPEMD-128", ripemd128) SPEED_TEST("RIPEMD-160", ripemd160) #if SPH_64 SPEED_TEST("Tiger", tiger) SPEED_TEST("Tiger2", tiger2) #endif SPEED_TEST("PANAMA", panama) SPEED_TEST("HAVAL[3 passes]", haval256_3) SPEED_TEST("HAVAL[4 passes]", haval256_4) SPEED_TEST("HAVAL[5 passes]", haval256_5) #if SPH_64 SPEED_TEST("WHIRLPOOL", whirlpool) #endif SPEED_TEST("RadioGatun[32]", radiogatun32) #if SPH_64 SPEED_TEST("RadioGatun[64]", radiogatun64) #endif SPEED_TEST("Shabal-224", shabal224) SPEED_TEST("Shabal-256", shabal256) SPEED_TEST("Shabal-384", shabal384) SPEED_TEST("Shabal-512", shabal512) SPEED_TEST("ECHO-224", echo224) SPEED_TEST("ECHO-256", echo256) SPEED_TEST("ECHO-384", echo384) SPEED_TEST("ECHO-512", echo512) SPEED_TEST("SIMD-224", simd224) SPEED_TEST("SIMD-256", simd256) SPEED_TEST("SIMD-384", simd384) SPEED_TEST("SIMD-512", simd512) SPEED_TEST("Luffa-224", luffa224) SPEED_TEST("Luffa-256", luffa256) SPEED_TEST("Luffa-384", luffa384) SPEED_TEST("Luffa-512", luffa512) SPEED_TEST("BLAKE-224", blake224) SPEED_TEST("BLAKE-256", blake256) #if SPH_64 SPEED_TEST("BLAKE-384", blake384) SPEED_TEST("BLAKE-512", blake512) #endif #if SPH_64 SPEED_TEST("Skein-224", skein224) SPEED_TEST("Skein-256", skein256) SPEED_TEST("Skein-384", skein384) SPEED_TEST("Skein-512", skein512) #endif SPEED_TEST("JH-224", jh224) SPEED_TEST("JH-256", jh256) SPEED_TEST("JH-384", jh384) SPEED_TEST("JH-512", jh512) SPEED_TEST("Fugue-224", fugue224) SPEED_TEST("Fugue-256", fugue256) SPEED_TEST("Fugue-384", fugue384) SPEED_TEST("Fugue-512", fugue512) SPEED_TEST("BMW-224", bmw224) SPEED_TEST("BMW-256", bmw256) #if SPH_64 SPEED_TEST("BMW-384", bmw384) SPEED_TEST("BMW-512", bmw512) #endif SPEED_TEST("CubeHash-224", cubehash224) SPEED_TEST("CubeHash-256", cubehash256) SPEED_TEST("CubeHash-384", cubehash384) SPEED_TEST("CubeHash-512", cubehash512) SPEED_TEST("Keccak-224", keccak224) SPEED_TEST("Keccak-256", keccak256) SPEED_TEST("Keccak-384", keccak384) SPEED_TEST("Keccak-512", keccak512) SPEED_TEST("Groestl-224", groestl224) SPEED_TEST("Groestl-256", groestl256) SPEED_TEST("Groestl-384", groestl384) SPEED_TEST("Groestl-512", groestl512) SPEED_TEST("Hamsi-224", hamsi224) SPEED_TEST("Hamsi-256", hamsi256) SPEED_TEST("Hamsi-384", hamsi384) SPEED_TEST("Hamsi-512", hamsi512) SPEED_TEST("SHAvite-224", shavite224) SPEED_TEST("SHAvite-256", shavite256) SPEED_TEST("SHAvite-384", shavite384) SPEED_TEST("SHAvite-512", shavite512) #define DO_MD2 0x00000001UL #define DO_MD4 0x00000002UL #define DO_MD5 0x00000004UL #define DO_SHA0 0x00000008UL #define DO_SHA1 0x00000010UL #define DO_SHA224 0x00000020UL #define DO_SHA256 0x00000040UL #if SPH_64 #define DO_SHA384 0x00000080UL #define DO_SHA512 0x00000100UL #endif #define DO_RIPEMD 0x00000200UL #define DO_RIPEMD128 0x00000400UL #define DO_RIPEMD160 0x00000800UL #if SPH_64 #define DO_TIGER 0x00001000UL #define DO_TIGER2 0x00002000UL #endif #define DO_PANAMA 0x00004000UL #define DO_HAVAL3 0x00008000UL #define DO_HAVAL4 0x00010000UL #define DO_HAVAL5 0x00020000UL #if SPH_64 #define DO_WHIRLPOOL 0x00040000UL #endif #define DO_SHABAL224 0x00080000UL #define DO_SHABAL256 0x00100000UL #define DO_SHABAL384 0x00200000UL #define DO_SHABAL512 0x00400000UL #define DO_RADIOGATUN32 0x01000000UL #define DO_RADIOGATUN64 0x02000000UL #define DO_ECHO224 0x04000000UL #define DO_ECHO256 0x08000000UL #define DO_ECHO384 0x10000000UL #define DO_ECHO512 0x20000000UL #define DO2_SIMD224 0x00000001UL #define DO2_SIMD256 0x00000002UL #define DO2_SIMD384 0x00000004UL #define DO2_SIMD512 0x00000008UL #define DO2_LUFFA224 0x00000010UL #define DO2_LUFFA256 0x00000020UL #define DO2_LUFFA384 0x00000040UL #define DO2_LUFFA512 0x00000080UL #define DO2_BLAKE224 0x00000100UL #define DO2_BLAKE256 0x00000200UL #define DO2_BLAKE384 0x00000400UL #define DO2_BLAKE512 0x00000800UL #define DO2_SKEIN224 0x00001000UL #define DO2_SKEIN256 0x00002000UL #define DO2_SKEIN384 0x00004000UL #define DO2_SKEIN512 0x00008000UL #define DO2_JH224 0x00010000UL #define DO2_JH256 0x00020000UL #define DO2_JH384 0x00040000UL #define DO2_JH512 0x00080000UL #define DO2_FUGUE224 0x00100000UL #define DO2_FUGUE256 0x00200000UL #define DO2_FUGUE384 0x00400000UL #define DO2_FUGUE512 0x00800000UL #define DO2_BMW224 0x01000000UL #define DO2_BMW256 0x02000000UL #define DO2_BMW384 0x04000000UL #define DO2_BMW512 0x08000000UL #define DO2_CUBEHASH224 0x10000000UL #define DO2_CUBEHASH256 0x20000000UL #define DO2_CUBEHASH384 0x40000000UL #define DO2_CUBEHASH512 0x80000000UL #define DO3_KECCAK224 0x00000001UL #define DO3_KECCAK256 0x00000002UL #define DO3_KECCAK384 0x00000004UL #define DO3_KECCAK512 0x00000008UL #define DO3_GROESTL224 0x00000010UL #define DO3_GROESTL256 0x00000020UL #define DO3_GROESTL384 0x00000040UL #define DO3_GROESTL512 0x00000080UL #define DO3_HAMSI224 0x00000100UL #define DO3_HAMSI256 0x00000200UL #define DO3_HAMSI384 0x00000400UL #define DO3_HAMSI512 0x00000800UL #define DO3_SHAVITE224 0x00001000UL #define DO3_SHAVITE256 0x00002000UL #define DO3_SHAVITE384 0x00004000UL #define DO3_SHAVITE512 0x00008000UL static struct { char *name; unsigned long flags, flags2, flags3; } function_names[] = { { "MD2", DO_MD2, 0, 0 }, { "MD4", DO_MD4, 0, 0 }, { "MD5", DO_MD5, 0, 0 }, { "SHA-0", DO_SHA0, 0, 0 }, { "SHA-1", DO_SHA1, 0, 0 }, { "SHA-224", DO_SHA224, 0, 0 }, { "SHA-256", DO_SHA256, 0, 0 }, #if SPH_64 { "SHA-384", DO_SHA384, 0, 0 }, { "SHA-512", DO_SHA512, 0, 0 }, #endif { "SHA2", DO_SHA224 | DO_SHA256 #if SPH_64 | DO_SHA384 | DO_SHA512 #endif , 0, 0 }, { "RMD", DO_RIPEMD, 0, 0 }, { "RIPEMD", DO_RIPEMD, 0, 0 }, { "RMD-128", DO_RIPEMD128, 0, 0 }, { "RIPEMD-128", DO_RIPEMD128, 0, 0 }, { "RMD-160", DO_RIPEMD160, 0, 0 }, { "RIPEMD-160", DO_RIPEMD160, 0, 0 }, #if SPH_64 { "Tiger", DO_TIGER, 0, 0 }, { "Tiger2", DO_TIGER2, 0, 0 }, #endif { "Panama", DO_PANAMA, 0, 0 }, { "HAVAL/3", DO_HAVAL3, 0, 0 }, { "HAVAL/4", DO_HAVAL4, 0, 0 }, { "HAVAL/5", DO_HAVAL5, 0, 0 }, { "HAVAL", DO_HAVAL3 | DO_HAVAL4 | DO_HAVAL5, 0, 0 }, #if SPH_64 { "Whirlpool", DO_WHIRLPOOL, 0, 0 }, #endif { "Shabal-224", DO_SHABAL224, 0, 0 }, { "Shabal-256", DO_SHABAL256, 0, 0 }, { "Shabal-384", DO_SHABAL384, 0, 0 }, { "Shabal-512", DO_SHABAL512, 0, 0 }, { "Shabal", DO_SHABAL224 | DO_SHABAL256 | DO_SHABAL384 | DO_SHABAL512, 0, 0 }, { "RadioGatun-32", DO_RADIOGATUN32, 0, 0 }, #if SPH_64 { "RadioGatun-64", DO_RADIOGATUN64, 0, 0 }, #endif { "RadioGatun", DO_RADIOGATUN32 | DO_RADIOGATUN64, 0, 0 }, { "ECHO-224", DO_ECHO224, 0, 0 }, { "ECHO-256", DO_ECHO256, 0, 0 }, { "ECHO-384", DO_ECHO384, 0, 0 }, { "ECHO-512", DO_ECHO512, 0, 0 }, { "ECHO", DO_ECHO224 | DO_ECHO256 | DO_ECHO384 | DO_ECHO512, 0, 0 }, { "SIMD-224", 0, DO2_SIMD224, 0 }, { "SIMD-256", 0, DO2_SIMD256, 0 }, { "SIMD-384", 0, DO2_SIMD384, 0 }, { "SIMD-512", 0, DO2_SIMD512, 0 }, { "SIMD", 0, DO2_SIMD224 | DO2_SIMD256 | DO2_SIMD384 | DO2_SIMD512, 0 }, { "Luffa-224", 0, DO2_LUFFA224, 0 }, { "Luffa-256", 0, DO2_LUFFA256, 0 }, { "Luffa-384", 0, DO2_LUFFA384, 0 }, { "Luffa-512", 0, DO2_LUFFA512, 0 }, { "Luffa", 0, DO2_LUFFA224 | DO2_LUFFA256 | DO2_LUFFA384 | DO2_LUFFA512, 0 }, { "BLAKE-224", 0, DO2_BLAKE224, 0 }, { "BLAKE-256", 0, DO2_BLAKE256, 0 }, #if SPH_64 { "BLAKE-384", 0, DO2_BLAKE384, 0 }, { "BLAKE-512", 0, DO2_BLAKE512, 0 }, #endif { "BLAKE", 0, DO2_BLAKE224 | DO2_BLAKE256 #if SPH_64 | DO2_BLAKE384 | DO2_BLAKE512 #endif , 0 }, #if SPH_64 { "Skein-224", 0, DO2_SKEIN224, 0 }, { "Skein-256", 0, DO2_SKEIN256, 0 }, { "Skein-384", 0, DO2_SKEIN384, 0 }, { "Skein-512", 0, DO2_SKEIN512, 0 }, { "Skein", 0, DO2_SKEIN224 | DO2_SKEIN256 | DO2_SKEIN384 | DO2_SKEIN512, 0 }, #endif { "JH-224", 0, DO2_JH224, 0 }, { "JH-256", 0, DO2_JH256, 0 }, { "JH-384", 0, DO2_JH384, 0 }, { "JH-512", 0, DO2_JH512, 0 }, { "JH", 0, DO2_JH224 | DO2_JH256 | DO2_JH384 | DO2_JH512, 0 }, { "Fugue-224", 0, DO2_FUGUE224, 0 }, { "Fugue-256", 0, DO2_FUGUE256, 0 }, { "Fugue-384", 0, DO2_FUGUE384, 0 }, { "Fugue-512", 0, DO2_FUGUE512, 0 }, { "Fugue", 0, DO2_FUGUE224 | DO2_FUGUE256 | DO2_FUGUE384 | DO2_FUGUE512, 0 }, { "BMW-224", 0, DO2_BMW224, 0 }, { "BMW-256", 0, DO2_BMW256, 0 }, #if SPH_64 { "BMW-384", 0, DO2_BMW384, 0 }, { "BMW-512", 0, DO2_BMW512, 0 }, #endif { "BMW", 0, DO2_BMW224 | DO2_BMW256 #if SPH_64 | DO2_BMW384 | DO2_BMW512 #endif , 0 }, { "CubeHash-224", 0, DO2_CUBEHASH224, 0 }, { "CubeHash-256", 0, DO2_CUBEHASH256, 0 }, { "CubeHash-384", 0, DO2_CUBEHASH384, 0 }, { "CubeHash-512", 0, DO2_CUBEHASH512, 0 }, { "CubeHash", 0, DO2_CUBEHASH224 | DO2_CUBEHASH256 | DO2_CUBEHASH384 | DO2_CUBEHASH512, 0 }, { "Keccak-224", 0, 0, DO3_KECCAK224 }, { "Keccak-256", 0, 0, DO3_KECCAK256 }, { "Keccak-384", 0, 0, DO3_KECCAK384 }, { "Keccak-512", 0, 0, DO3_KECCAK512 }, { "Keccak", 0, 0, DO3_KECCAK224 | DO3_KECCAK256 | DO3_KECCAK384 | DO3_KECCAK512 }, { "Groestl-224", 0, 0, DO3_GROESTL224 }, { "Groestl-256", 0, 0, DO3_GROESTL256 }, { "Groestl-384", 0, 0, DO3_GROESTL384 }, { "Groestl-512", 0, 0, DO3_GROESTL512 }, { "Groestl", 0, 0, DO3_GROESTL224 | DO3_GROESTL256 | DO3_GROESTL384 | DO3_GROESTL512 }, { "Hamsi-224", 0, 0, DO3_HAMSI224 }, { "Hamsi-256", 0, 0, DO3_HAMSI256 }, { "Hamsi-384", 0, 0, DO3_HAMSI384 }, { "Hamsi-512", 0, 0, DO3_HAMSI512 }, { "Hamsi", 0, 0, DO3_HAMSI224 | DO3_HAMSI256 | DO3_HAMSI384 | DO3_HAMSI512 }, { "SHAvite-224", 0, 0, DO3_SHAVITE224 }, { "SHAvite-256", 0, 0, DO3_SHAVITE256 }, { "SHAvite-384", 0, 0, DO3_SHAVITE384 }, { "SHAvite-512", 0, 0, DO3_SHAVITE512 }, { "SHAvite", 0, 0, DO3_SHAVITE224 | DO3_SHAVITE256 | DO3_SHAVITE384 | DO3_SHAVITE512 }, { "SHAvite-3", 0, 0, DO3_SHAVITE224 | DO3_SHAVITE256 | DO3_SHAVITE384 | DO3_SHAVITE512 }, { NULL, 0, 0, 0 } }; static void fail_unknown(char *name) { size_t u; fprintf(stderr, "unknown hash function name: '%s'\n", name); fprintf(stderr, "supported names:"); for (u = 0; function_names[u].name != NULL; u ++) { if (u == 0 || (u > 0 && (function_names[u].flags != function_names[u - 1].flags || function_names[u].flags2 != function_names[u - 1].flags2 || function_names[u].flags3 != function_names[u - 1].flags3))) { fprintf(stderr, "\n "); } else { fprintf(stderr, " "); } fprintf(stderr, "%s", function_names[u].name); } fprintf(stderr, "\n"); fprintf(stderr, "Mame matching is case insensitive" " and ignores '-' and '/' characters.\n"); #if SPH_64 fprintf(stderr, "'SHA2' stands for SHA-224, SHA-256," " SHA-384 and SHA-512.\n"); #else fprintf(stderr, "'SHA2' stands for SHA-224 and SHA-256.\n"); #endif fprintf(stderr, "'HAVAL' stands for HAVAL/3, HAVAL/4 and" " HAVAL/5 (256-bit output).\n"); fprintf(stderr, "'RadioGatun' stands for RadioGatun-32" #if SPH_64 " and RadioGatun-64" #endif ".\n"); fprintf(stderr, "'Shabal' stands for Shabal-224, Shabal-256," " Shabal-384 and Shabal-512.\n"); fprintf(stderr, "'ECHO' stands for ECHO-224, ECHO-256," " ECHO-384 and ECHO-512.\n"); fprintf(stderr, "'SIMD' stands for SIMD-224, SIMD-256," " SIMD-384 and SIMD-512.\n"); fprintf(stderr, "'Luffa' stands for Luffa-224, Luffa-256," " Luffa-384 and Luffa-512.\n"); #if SPH_64 fprintf(stderr, "'BLAKE' stands for BLAKE-224, BLAKE-256," " BLAKE-384 and BLAKE-512.\n"); #else fprintf(stderr, "'BLAKE' stands for BLAKE-224 and BLAKE-256.\n"); #endif #if SPH_64 fprintf(stderr, "'Skein' stands for Skein-224, Skein-256," " Skein-384 and Skein-512.\n"); #endif fprintf(stderr, "'JH' stands for JH-224, JH-256," " JH-384 and JH-512.\n"); fprintf(stderr, "'Fugue' stands for Fugue-224, Fugue-256," " Fugue-384 and Fugue-512.\n"); #if SPH_64 fprintf(stderr, "'BMW' stands for BMW-224, BMW-256," " BMW-384 and BMW-512.\n"); #else fprintf(stderr, "'BMW' stands for BMW-224 and BMW-256.\n"); #endif fprintf(stderr, "'CubeHash' stands for CubeHash-224, CubeHash-256," " CubeHash-384 and CubeHash-512.\n"); fprintf(stderr, "'Keccak' stands for Keccak-224, Keccak-256," " Keccak-384 and Keccak-512.\n"); fprintf(stderr, "'Groestl' stands for Groestl-224, Groestl-256," " Groestl-384 and Groestl-512.\n"); fprintf(stderr, "'Hamsi' stands for Hamsi-224, Hamsi-256," " Hamsi-384 and Hamsi-512.\n"); fprintf(stderr, "'SHAvite' and 'SHAvite-3' stand for SHAvite-224," " SHAvite-256, SHAvite-384 and SHAvite-512.\n"); exit(EXIT_FAILURE); } /* * Match two function names. Case is ignored. Minus and slash signs are * ignored as well. * * Note: this function assumes an ASCII host. */ static int match_names(char *s1, char *s2) { for (;;) { int c1, c2; while (*s1 == '-' || *s1 == '/') s1 ++; while (*s2 == '-' || *s2 == '/') s2 ++; c1 = *s1; c2 = *s2; if (c1 == 0 || c2 == 0) return c1 == c2; if (c1 >= 'A' && c1 <= 'Z') c1 += ('a' - 'A'); if (c2 >= 'A' && c2 <= 'Z') c2 += ('a' - 'A'); if (c1 != c2) return 0; s1 ++; s2 ++; } } int main(int argc, char *argv[]) { unsigned long todo, todo2, todo3; int i; todo = todo2 = todo3 = 0; for (i = 1; i < argc; i ++) { char *name; size_t u; name = argv[i]; for (u = 0; function_names[u].name != NULL; u ++) { if (match_names(name, function_names[u].name)) { todo |= function_names[u].flags; todo2 |= function_names[u].flags2; todo3 |= function_names[u].flags3; break; } } if (function_names[u].name == NULL) fail_unknown(name); } if (todo == 0 && todo2 == 0 && todo3 == 0) todo = todo2 = todo3 = ~(unsigned long)0; data = malloc(DATA_LEN); if (data == NULL) { fprintf(stderr, "could not allocate input buffer\n"); exit(EXIT_FAILURE); } memset(data, 'a', DATA_LEN); if (todo & DO_MD2) speed_md2(); if (todo & DO_MD4) speed_md4(); if (todo & DO_MD5) speed_md5(); if (todo & DO_SHA0) speed_sha0(); if (todo & DO_SHA1) speed_sha1(); if (todo & DO_SHA224) speed_sha224(); if (todo & DO_SHA256) speed_sha256(); #if SPH_64 if (todo & DO_SHA384) speed_sha384(); if (todo & DO_SHA512) speed_sha512(); #endif if (todo & DO_RIPEMD) speed_ripemd(); if (todo & DO_RIPEMD128) speed_ripemd128(); if (todo & DO_RIPEMD160) speed_ripemd160(); #if SPH_64 if (todo & DO_TIGER) speed_tiger(); if (todo & DO_TIGER2) speed_tiger2(); #endif if (todo & DO_PANAMA) speed_panama(); if (todo & DO_HAVAL3) speed_haval256_3(); if (todo & DO_HAVAL4) speed_haval256_4(); if (todo & DO_HAVAL5) speed_haval256_5(); #if SPH_64 if (todo & DO_WHIRLPOOL) speed_whirlpool(); #endif if (todo & DO_SHABAL224) speed_shabal224(); if (todo & DO_SHABAL256) speed_shabal256(); if (todo & DO_SHABAL384) speed_shabal384(); if (todo & DO_SHABAL512) speed_shabal512(); if (todo & DO_RADIOGATUN32) speed_radiogatun32(); #if SPH_64 if (todo & DO_RADIOGATUN64) speed_radiogatun64(); #endif if (todo & DO_ECHO224) speed_echo224(); if (todo & DO_ECHO256) speed_echo256(); if (todo & DO_ECHO384) speed_echo384(); if (todo & DO_ECHO512) speed_echo512(); if (todo2 & DO2_SIMD224) speed_simd224(); if (todo2 & DO2_SIMD256) speed_simd256(); if (todo2 & DO2_SIMD384) speed_simd384(); if (todo2 & DO2_SIMD512) speed_simd512(); if (todo2 & DO2_LUFFA224) speed_luffa224(); if (todo2 & DO2_LUFFA256) speed_luffa256(); if (todo2 & DO2_LUFFA384) speed_luffa384(); if (todo2 & DO2_LUFFA512) speed_luffa512(); if (todo2 & DO2_BLAKE224) speed_blake224(); if (todo2 & DO2_BLAKE256) speed_blake256(); #if SPH_64 if (todo2 & DO2_BLAKE384) speed_blake384(); if (todo2 & DO2_BLAKE512) speed_blake512(); #endif #if SPH_64 if (todo2 & DO2_SKEIN224) speed_skein224(); if (todo2 & DO2_SKEIN256) speed_skein256(); if (todo2 & DO2_SKEIN384) speed_skein384(); if (todo2 & DO2_SKEIN512) speed_skein512(); #endif if (todo2 & DO2_JH224) speed_jh224(); if (todo2 & DO2_JH256) speed_jh256(); if (todo2 & DO2_JH384) speed_jh384(); if (todo2 & DO2_JH512) speed_jh512(); if (todo2 & DO2_FUGUE224) speed_fugue224(); if (todo2 & DO2_FUGUE256) speed_fugue256(); if (todo2 & DO2_FUGUE384) speed_fugue384(); if (todo2 & DO2_FUGUE512) speed_fugue512(); if (todo2 & DO2_BMW224) speed_bmw224(); if (todo2 & DO2_BMW256) speed_bmw256(); #if SPH_64 if (todo2 & DO2_BMW384) speed_bmw384(); if (todo2 & DO2_BMW512) speed_bmw512(); #endif if (todo2 & DO2_CUBEHASH224) speed_cubehash224(); if (todo2 & DO2_CUBEHASH256) speed_cubehash256(); if (todo2 & DO2_CUBEHASH384) speed_cubehash384(); if (todo2 & DO2_CUBEHASH512) speed_cubehash512(); if (todo3 & DO3_KECCAK224) speed_keccak224(); if (todo3 & DO3_KECCAK256) speed_keccak256(); if (todo3 & DO3_KECCAK384) speed_keccak384(); if (todo3 & DO3_KECCAK512) speed_keccak512(); if (todo3 & DO3_GROESTL224) speed_groestl224(); if (todo3 & DO3_GROESTL256) speed_groestl256(); if (todo3 & DO3_GROESTL384) speed_groestl384(); if (todo3 & DO3_GROESTL512) speed_groestl512(); if (todo3 & DO3_HAMSI224) speed_hamsi224(); if (todo3 & DO3_HAMSI256) speed_hamsi256(); if (todo3 & DO3_HAMSI384) speed_hamsi384(); if (todo3 & DO3_HAMSI512) speed_hamsi512(); if (todo3 & DO3_SHAVITE224) speed_shavite224(); if (todo3 & DO3_SHAVITE256) speed_shavite256(); if (todo3 & DO3_SHAVITE384) speed_shavite384(); if (todo3 & DO3_SHAVITE512) speed_shavite512(); return 0; }