mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
798 lines
23 KiB
798 lines
23 KiB
/* $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 <[email protected]> |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <time.h> |
|
|
|
#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; |
|
}
|
|
|