1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2013 Nicolas George 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public License 8cabdff1aSopenharmony_ci * as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14cabdff1aSopenharmony_ci * GNU Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public License 17cabdff1aSopenharmony_ci * along with FFmpeg; if not, write to the Free Software Foundation, Inc., 18cabdff1aSopenharmony_ci * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci/* Optional external libraries; can be enabled using: 22cabdff1aSopenharmony_ci * make VERSUS=crypto+gcrypt+tomcrypt+mbedcrypto tools/crypto_bench */ 23cabdff1aSopenharmony_ci#define USE_crypto 0x01 /* OpenSSL's libcrypto */ 24cabdff1aSopenharmony_ci#define USE_gcrypt 0x02 /* GnuTLS's libgcrypt */ 25cabdff1aSopenharmony_ci#define USE_tomcrypt 0x04 /* LibTomCrypt */ 26cabdff1aSopenharmony_ci#define USE_mbedcrypto 0x08 /* mbed TLS */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include <stdlib.h> 29cabdff1aSopenharmony_ci#include <math.h> 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "libavutil/avutil.h" 32cabdff1aSopenharmony_ci#include "libavutil/avstring.h" 33cabdff1aSopenharmony_ci#include "libavutil/crc.h" 34cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 35cabdff1aSopenharmony_ci#include "libavutil/timer.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#ifndef AV_READ_TIME 38cabdff1aSopenharmony_ci#define AV_READ_TIME(x) 0 39cabdff1aSopenharmony_ci#endif 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#if HAVE_UNISTD_H 42cabdff1aSopenharmony_ci#include <unistd.h> /* for getopt */ 43cabdff1aSopenharmony_ci#endif 44cabdff1aSopenharmony_ci#if !HAVE_GETOPT 45cabdff1aSopenharmony_ci#include "compat/getopt.c" 46cabdff1aSopenharmony_ci#endif 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci#define MAX_INPUT_SIZE 1048576 49cabdff1aSopenharmony_ci#define MAX_OUTPUT_SIZE 128 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_cistatic const char *enabled_libs; 52cabdff1aSopenharmony_cistatic const char *enabled_algos; 53cabdff1aSopenharmony_cistatic unsigned specified_runs; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_cistatic const uint8_t *hardcoded_key = "FFmpeg is the best program ever."; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_cistatic void fatal_error(const char *tag) 58cabdff1aSopenharmony_ci{ 59cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Fatal error: %s\n", tag); 60cabdff1aSopenharmony_ci exit(1); 61cabdff1aSopenharmony_ci} 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistruct hash_impl { 64cabdff1aSopenharmony_ci const char *lib; 65cabdff1aSopenharmony_ci const char *name; 66cabdff1aSopenharmony_ci void (*run)(uint8_t *output, const uint8_t *input, unsigned size); 67cabdff1aSopenharmony_ci const char *output; 68cabdff1aSopenharmony_ci}; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci/*************************************************************************** 71cabdff1aSopenharmony_ci * lavu: libavutil 72cabdff1aSopenharmony_ci ***************************************************************************/ 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci#include "libavutil/md5.h" 75cabdff1aSopenharmony_ci#include "libavutil/sha.h" 76cabdff1aSopenharmony_ci#include "libavutil/sha512.h" 77cabdff1aSopenharmony_ci#include "libavutil/ripemd.h" 78cabdff1aSopenharmony_ci#include "libavutil/aes.h" 79cabdff1aSopenharmony_ci#include "libavutil/blowfish.h" 80cabdff1aSopenharmony_ci#include "libavutil/camellia.h" 81cabdff1aSopenharmony_ci#include "libavutil/cast5.h" 82cabdff1aSopenharmony_ci#include "libavutil/des.h" 83cabdff1aSopenharmony_ci#include "libavutil/twofish.h" 84cabdff1aSopenharmony_ci#include "libavutil/rc4.h" 85cabdff1aSopenharmony_ci#include "libavutil/xtea.h" 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci#define IMPL_USE_lavu IMPL_USE 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_cistatic void run_lavu_md5(uint8_t *output, 90cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 91cabdff1aSopenharmony_ci{ 92cabdff1aSopenharmony_ci av_md5_sum(output, input, size); 93cabdff1aSopenharmony_ci} 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci#define DEFINE_LAVU_MD(suffix, type, namespace, hsize) \ 96cabdff1aSopenharmony_cistatic void run_lavu_ ## suffix(uint8_t *output, \ 97cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 98cabdff1aSopenharmony_ci{ \ 99cabdff1aSopenharmony_ci static struct type *h; \ 100cabdff1aSopenharmony_ci if (!h && !(h = av_ ## namespace ## _alloc())) \ 101cabdff1aSopenharmony_ci fatal_error("out of memory"); \ 102cabdff1aSopenharmony_ci av_ ## namespace ## _init(h, hsize); \ 103cabdff1aSopenharmony_ci av_ ## namespace ## _update(h, input, size); \ 104cabdff1aSopenharmony_ci av_ ## namespace ## _final(h, output); \ 105cabdff1aSopenharmony_ci} 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ciDEFINE_LAVU_MD(sha1, AVSHA, sha, 160); 108cabdff1aSopenharmony_ciDEFINE_LAVU_MD(sha256, AVSHA, sha, 256); 109cabdff1aSopenharmony_ciDEFINE_LAVU_MD(sha512, AVSHA512, sha512, 512); 110cabdff1aSopenharmony_ciDEFINE_LAVU_MD(ripemd128, AVRIPEMD, ripemd, 128); 111cabdff1aSopenharmony_ciDEFINE_LAVU_MD(ripemd160, AVRIPEMD, ripemd, 160); 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_cistatic void run_lavu_aes128(uint8_t *output, 114cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 115cabdff1aSopenharmony_ci{ 116cabdff1aSopenharmony_ci static struct AVAES *aes; 117cabdff1aSopenharmony_ci if (!aes && !(aes = av_aes_alloc())) 118cabdff1aSopenharmony_ci fatal_error("out of memory"); 119cabdff1aSopenharmony_ci av_aes_init(aes, hardcoded_key, 128, 0); 120cabdff1aSopenharmony_ci av_aes_crypt(aes, output, input, size >> 4, NULL, 0); 121cabdff1aSopenharmony_ci} 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_cistatic void run_lavu_blowfish(uint8_t *output, 124cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 125cabdff1aSopenharmony_ci{ 126cabdff1aSopenharmony_ci static struct AVBlowfish *blowfish; 127cabdff1aSopenharmony_ci if (!blowfish && !(blowfish = av_blowfish_alloc())) 128cabdff1aSopenharmony_ci fatal_error("out of memory"); 129cabdff1aSopenharmony_ci av_blowfish_init(blowfish, hardcoded_key, 16); 130cabdff1aSopenharmony_ci av_blowfish_crypt(blowfish, output, input, size >> 3, NULL, 0); 131cabdff1aSopenharmony_ci} 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_cistatic void run_lavu_camellia(uint8_t *output, 134cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 135cabdff1aSopenharmony_ci{ 136cabdff1aSopenharmony_ci static struct AVCAMELLIA *camellia; 137cabdff1aSopenharmony_ci if (!camellia && !(camellia = av_camellia_alloc())) 138cabdff1aSopenharmony_ci fatal_error("out of memory"); 139cabdff1aSopenharmony_ci av_camellia_init(camellia, hardcoded_key, 128); 140cabdff1aSopenharmony_ci av_camellia_crypt(camellia, output, input, size >> 4, NULL, 0); 141cabdff1aSopenharmony_ci} 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_cistatic void run_lavu_cast128(uint8_t *output, 144cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 145cabdff1aSopenharmony_ci{ 146cabdff1aSopenharmony_ci static struct AVCAST5 *cast; 147cabdff1aSopenharmony_ci if (!cast && !(cast = av_cast5_alloc())) 148cabdff1aSopenharmony_ci fatal_error("out of memory"); 149cabdff1aSopenharmony_ci av_cast5_init(cast, hardcoded_key, 128); 150cabdff1aSopenharmony_ci av_cast5_crypt(cast, output, input, size >> 3, 0); 151cabdff1aSopenharmony_ci} 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_cistatic void run_lavu_des(uint8_t *output, 154cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 155cabdff1aSopenharmony_ci{ 156cabdff1aSopenharmony_ci static struct AVDES *des; 157cabdff1aSopenharmony_ci if (!des && !(des = av_des_alloc())) 158cabdff1aSopenharmony_ci fatal_error("out of memory"); 159cabdff1aSopenharmony_ci av_des_init(des, hardcoded_key, 64, 0); 160cabdff1aSopenharmony_ci av_des_crypt(des, output, input, size >> 3, NULL, 0); 161cabdff1aSopenharmony_ci} 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_cistatic void run_lavu_twofish(uint8_t *output, 164cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 165cabdff1aSopenharmony_ci{ 166cabdff1aSopenharmony_ci static struct AVTWOFISH *twofish; 167cabdff1aSopenharmony_ci if (!twofish && !(twofish = av_twofish_alloc())) 168cabdff1aSopenharmony_ci fatal_error("out of memory"); 169cabdff1aSopenharmony_ci av_twofish_init(twofish, hardcoded_key, 128); 170cabdff1aSopenharmony_ci av_twofish_crypt(twofish, output, input, size >> 4, NULL, 0); 171cabdff1aSopenharmony_ci} 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_cistatic void run_lavu_rc4(uint8_t *output, 174cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 175cabdff1aSopenharmony_ci{ 176cabdff1aSopenharmony_ci static struct AVRC4 *rc4; 177cabdff1aSopenharmony_ci if (!rc4 && !(rc4 = av_rc4_alloc())) 178cabdff1aSopenharmony_ci fatal_error("out of memory"); 179cabdff1aSopenharmony_ci av_rc4_init(rc4, hardcoded_key, 128, 0); 180cabdff1aSopenharmony_ci av_rc4_crypt(rc4, output, input, size, NULL, 0); 181cabdff1aSopenharmony_ci} 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_cistatic void run_lavu_xtea(uint8_t *output, 184cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 185cabdff1aSopenharmony_ci{ 186cabdff1aSopenharmony_ci static struct AVXTEA *xtea; 187cabdff1aSopenharmony_ci if (!xtea && !(xtea = av_xtea_alloc())) 188cabdff1aSopenharmony_ci fatal_error("out of memory"); 189cabdff1aSopenharmony_ci av_xtea_init(xtea, hardcoded_key); 190cabdff1aSopenharmony_ci av_xtea_crypt(xtea, output, input, size >> 3, NULL, 0); 191cabdff1aSopenharmony_ci} 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci/*************************************************************************** 194cabdff1aSopenharmony_ci * crypto: OpenSSL's libcrypto 195cabdff1aSopenharmony_ci ***************************************************************************/ 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci#if (USE_EXT_LIBS) & USE_crypto 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci#define OPENSSL_DISABLE_OLD_DES_SUPPORT 200cabdff1aSopenharmony_ci#include <openssl/md5.h> 201cabdff1aSopenharmony_ci#include <openssl/sha.h> 202cabdff1aSopenharmony_ci#include <openssl/ripemd.h> 203cabdff1aSopenharmony_ci#include <openssl/aes.h> 204cabdff1aSopenharmony_ci#include <openssl/blowfish.h> 205cabdff1aSopenharmony_ci#include <openssl/camellia.h> 206cabdff1aSopenharmony_ci#include <openssl/cast.h> 207cabdff1aSopenharmony_ci#include <openssl/des.h> 208cabdff1aSopenharmony_ci#include <openssl/rc4.h> 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci#define DEFINE_CRYPTO_WRAPPER(suffix, function) \ 211cabdff1aSopenharmony_cistatic void run_crypto_ ## suffix(uint8_t *output, \ 212cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 213cabdff1aSopenharmony_ci{ \ 214cabdff1aSopenharmony_ci function(input, size, output); \ 215cabdff1aSopenharmony_ci} 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ciDEFINE_CRYPTO_WRAPPER(md5, MD5) 218cabdff1aSopenharmony_ciDEFINE_CRYPTO_WRAPPER(sha1, SHA1) 219cabdff1aSopenharmony_ciDEFINE_CRYPTO_WRAPPER(sha256, SHA256) 220cabdff1aSopenharmony_ciDEFINE_CRYPTO_WRAPPER(sha512, SHA512) 221cabdff1aSopenharmony_ciDEFINE_CRYPTO_WRAPPER(ripemd160, RIPEMD160) 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_cistatic void run_crypto_aes128(uint8_t *output, 224cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 225cabdff1aSopenharmony_ci{ 226cabdff1aSopenharmony_ci AES_KEY aes; 227cabdff1aSopenharmony_ci unsigned i; 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci AES_set_encrypt_key(hardcoded_key, 128, &aes); 230cabdff1aSopenharmony_ci size -= 15; 231cabdff1aSopenharmony_ci for (i = 0; i < size; i += 16) 232cabdff1aSopenharmony_ci AES_encrypt(input + i, output + i, &aes); 233cabdff1aSopenharmony_ci} 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_cistatic void run_crypto_blowfish(uint8_t *output, 236cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 237cabdff1aSopenharmony_ci{ 238cabdff1aSopenharmony_ci BF_KEY blowfish; 239cabdff1aSopenharmony_ci unsigned i; 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci BF_set_key(&blowfish, 16, hardcoded_key); 242cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 243cabdff1aSopenharmony_ci BF_ecb_encrypt(input + i, output + i, &blowfish, 1); 244cabdff1aSopenharmony_ci} 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_cistatic void run_crypto_camellia(uint8_t *output, 247cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 248cabdff1aSopenharmony_ci{ 249cabdff1aSopenharmony_ci CAMELLIA_KEY camellia; 250cabdff1aSopenharmony_ci unsigned i; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci Camellia_set_key(hardcoded_key, 128, &camellia); 253cabdff1aSopenharmony_ci size -= 15; 254cabdff1aSopenharmony_ci for (i = 0; i < size; i += 16) 255cabdff1aSopenharmony_ci Camellia_ecb_encrypt(input + i, output + i, &camellia, 1); 256cabdff1aSopenharmony_ci} 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_cistatic void run_crypto_cast128(uint8_t *output, 259cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 260cabdff1aSopenharmony_ci{ 261cabdff1aSopenharmony_ci CAST_KEY cast; 262cabdff1aSopenharmony_ci unsigned i; 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_ci CAST_set_key(&cast, 16, hardcoded_key); 265cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 266cabdff1aSopenharmony_ci CAST_ecb_encrypt(input + i, output + i, &cast, 1); 267cabdff1aSopenharmony_ci} 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_cistatic void run_crypto_des(uint8_t *output, 270cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 271cabdff1aSopenharmony_ci{ 272cabdff1aSopenharmony_ci DES_key_schedule des; 273cabdff1aSopenharmony_ci unsigned i; 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci DES_set_key(hardcoded_key, &des); 276cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 277cabdff1aSopenharmony_ci DES_ecb_encrypt(input + i, output + i, &des, 1); 278cabdff1aSopenharmony_ci} 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_cistatic void run_crypto_rc4(uint8_t *output, 281cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 282cabdff1aSopenharmony_ci{ 283cabdff1aSopenharmony_ci RC4_KEY rc4; 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci RC4_set_key(&rc4, 16, hardcoded_key); 286cabdff1aSopenharmony_ci RC4(&rc4, size, input, output); 287cabdff1aSopenharmony_ci} 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci#define IMPL_USE_crypto(...) IMPL_USE(__VA_ARGS__) 290cabdff1aSopenharmony_ci#else 291cabdff1aSopenharmony_ci#define IMPL_USE_crypto(...) /* ignore */ 292cabdff1aSopenharmony_ci#endif 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci/*************************************************************************** 295cabdff1aSopenharmony_ci * gcrypt: GnuTLS's libgcrypt 296cabdff1aSopenharmony_ci ***************************************************************************/ 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci#if (USE_EXT_LIBS) & USE_gcrypt 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci#include <gcrypt.h> 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci#define DEFINE_GCRYPT_WRAPPER(suffix, algo) \ 303cabdff1aSopenharmony_cistatic void run_gcrypt_ ## suffix(uint8_t *output, \ 304cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 305cabdff1aSopenharmony_ci{ \ 306cabdff1aSopenharmony_ci gcry_md_hash_buffer(GCRY_MD_ ## algo, output, input, size); \ 307cabdff1aSopenharmony_ci} 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ciDEFINE_GCRYPT_WRAPPER(md5, MD5) 310cabdff1aSopenharmony_ciDEFINE_GCRYPT_WRAPPER(sha1, SHA1) 311cabdff1aSopenharmony_ciDEFINE_GCRYPT_WRAPPER(sha256, SHA256) 312cabdff1aSopenharmony_ciDEFINE_GCRYPT_WRAPPER(sha512, SHA512) 313cabdff1aSopenharmony_ciDEFINE_GCRYPT_WRAPPER(ripemd160, RMD160) 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci#define DEFINE_GCRYPT_CYPHER_WRAPPER(suffix, cypher, mode, sz) \ 316cabdff1aSopenharmony_cistatic void run_gcrypt_ ## suffix(uint8_t *output, \ 317cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 318cabdff1aSopenharmony_ci{ \ 319cabdff1aSopenharmony_ci static gcry_cipher_hd_t suffix; \ 320cabdff1aSopenharmony_ci if (!suffix) \ 321cabdff1aSopenharmony_ci gcry_cipher_open(&suffix, GCRY_CIPHER_ ## cypher, GCRY_CIPHER_MODE_ ## mode, 0); \ 322cabdff1aSopenharmony_ci gcry_cipher_setkey(suffix, hardcoded_key, sz); \ 323cabdff1aSopenharmony_ci gcry_cipher_encrypt(suffix, output, size, input, size); \ 324cabdff1aSopenharmony_ci} 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(aes128, AES128, ECB, 16) 327cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(blowfish, BLOWFISH, ECB, 16) 328cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(camellia, CAMELLIA128, ECB, 16) 329cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(cast128, CAST5, ECB, 16) 330cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(des, DES, ECB, 8) 331cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(twofish, TWOFISH128, ECB, 16) 332cabdff1aSopenharmony_ciDEFINE_GCRYPT_CYPHER_WRAPPER(rc4, ARCFOUR, STREAM, 16) 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_ci#define IMPL_USE_gcrypt(...) IMPL_USE(__VA_ARGS__) 335cabdff1aSopenharmony_ci#else 336cabdff1aSopenharmony_ci#define IMPL_USE_gcrypt(...) /* ignore */ 337cabdff1aSopenharmony_ci#endif 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci/*************************************************************************** 340cabdff1aSopenharmony_ci * mbedcrypto: mbed TLS 341cabdff1aSopenharmony_ci ***************************************************************************/ 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci#if (USE_EXT_LIBS) & USE_mbedcrypto 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci#include <mbedtls/aes.h> 346cabdff1aSopenharmony_ci#include <mbedtls/arc4.h> 347cabdff1aSopenharmony_ci#include <mbedtls/blowfish.h> 348cabdff1aSopenharmony_ci#include <mbedtls/camellia.h> 349cabdff1aSopenharmony_ci#include <mbedtls/des.h> 350cabdff1aSopenharmony_ci#include <mbedtls/md5.h> 351cabdff1aSopenharmony_ci#include <mbedtls/ripemd160.h> 352cabdff1aSopenharmony_ci#include <mbedtls/sha1.h> 353cabdff1aSopenharmony_ci#include <mbedtls/sha256.h> 354cabdff1aSopenharmony_ci#include <mbedtls/sha512.h> 355cabdff1aSopenharmony_ci#include <mbedtls/xtea.h> 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci#define DEFINE_MBEDCRYPTO_WRAPPER(suffix) \ 358cabdff1aSopenharmony_cistatic void run_mbedcrypto_ ## suffix(uint8_t *output, \ 359cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 360cabdff1aSopenharmony_ci{ \ 361cabdff1aSopenharmony_ci mbedtls_ ## suffix ## _ret(input, size, output); \ 362cabdff1aSopenharmony_ci} 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci#define DEFINE_MBEDCRYPTO_WRAPPER_SHA2(suffix) \ 365cabdff1aSopenharmony_cistatic void run_mbedcrypto_ ## suffix(uint8_t *output, \ 366cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 367cabdff1aSopenharmony_ci{ \ 368cabdff1aSopenharmony_ci mbedtls_ ## suffix ## _ret(input, size, output, 0); \ 369cabdff1aSopenharmony_ci} 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_WRAPPER(md5) 372cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_WRAPPER(ripemd160) 373cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_WRAPPER(sha1) 374cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_WRAPPER_SHA2(sha256) 375cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_WRAPPER_SHA2(sha512) 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_ci#define DEFINE_MBEDCRYPTO_CYPHER_WRAPPER(suffix, cypher, algo) \ 379cabdff1aSopenharmony_cistatic void run_mbedcrypto_ ## suffix(uint8_t *output, \ 380cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 381cabdff1aSopenharmony_ci{ \ 382cabdff1aSopenharmony_ci mbedtls_ ## cypher ## _context cypher; \ 383cabdff1aSopenharmony_ci \ 384cabdff1aSopenharmony_ci mbedtls_ ## cypher ## _init(&cypher); \ 385cabdff1aSopenharmony_ci mbedtls_ ## cypher ## _setkey_enc(&cypher, hardcoded_key, 128); \ 386cabdff1aSopenharmony_ci for (int i = 0; i < size; i += 16) \ 387cabdff1aSopenharmony_ci mbedtls_ ## cypher ## _crypt_ecb(&cypher, MBEDTLS_ ## algo ## _ENCRYPT, \ 388cabdff1aSopenharmony_ci input + i, output + i); \ 389cabdff1aSopenharmony_ci mbedtls_ ## cypher ## _free(&cypher); \ 390cabdff1aSopenharmony_ci} 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_CYPHER_WRAPPER(aes128, aes, AES) 393cabdff1aSopenharmony_ciDEFINE_MBEDCRYPTO_CYPHER_WRAPPER(camellia, camellia, CAMELLIA) 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_cistatic void run_mbedcrypto_blowfish(uint8_t *output, 396cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 397cabdff1aSopenharmony_ci{ 398cabdff1aSopenharmony_ci mbedtls_blowfish_context blowfish; 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci mbedtls_blowfish_init(&blowfish); 401cabdff1aSopenharmony_ci mbedtls_blowfish_setkey(&blowfish, hardcoded_key, 128); 402cabdff1aSopenharmony_ci for (int i = 0; i < size; i += 8) 403cabdff1aSopenharmony_ci mbedtls_blowfish_crypt_ecb(&blowfish, MBEDTLS_BLOWFISH_ENCRYPT, 404cabdff1aSopenharmony_ci input + i, output + i); 405cabdff1aSopenharmony_ci mbedtls_blowfish_free(&blowfish); 406cabdff1aSopenharmony_ci} 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_cistatic void run_mbedcrypto_des(uint8_t *output, 409cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 410cabdff1aSopenharmony_ci{ 411cabdff1aSopenharmony_ci mbedtls_des_context des; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci mbedtls_des_init(&des); 414cabdff1aSopenharmony_ci mbedtls_des_setkey_enc(&des, hardcoded_key); 415cabdff1aSopenharmony_ci for (int i = 0; i < size; i += 8) 416cabdff1aSopenharmony_ci mbedtls_des_crypt_ecb(&des, input + i, output + i); 417cabdff1aSopenharmony_ci mbedtls_des_free(&des); 418cabdff1aSopenharmony_ci} 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_cistatic void run_mbedcrypto_rc4(uint8_t *output, 421cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 422cabdff1aSopenharmony_ci{ 423cabdff1aSopenharmony_ci mbedtls_arc4_context rc4; 424cabdff1aSopenharmony_ci 425cabdff1aSopenharmony_ci mbedtls_arc4_init(&rc4); 426cabdff1aSopenharmony_ci mbedtls_arc4_setup(&rc4, hardcoded_key, 16); 427cabdff1aSopenharmony_ci mbedtls_arc4_crypt(&rc4, size, input, output); 428cabdff1aSopenharmony_ci mbedtls_arc4_free(&rc4); 429cabdff1aSopenharmony_ci} 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_cistatic void run_mbedcrypto_xtea(uint8_t *output, 432cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 433cabdff1aSopenharmony_ci{ 434cabdff1aSopenharmony_ci mbedtls_xtea_context xtea; 435cabdff1aSopenharmony_ci 436cabdff1aSopenharmony_ci mbedtls_xtea_init(&xtea); 437cabdff1aSopenharmony_ci mbedtls_xtea_setup(&xtea, hardcoded_key); 438cabdff1aSopenharmony_ci for (int i = 0; i < size; i += 8) 439cabdff1aSopenharmony_ci mbedtls_xtea_crypt_ecb(&xtea, MBEDTLS_XTEA_ENCRYPT, 440cabdff1aSopenharmony_ci input + i, output + i); 441cabdff1aSopenharmony_ci mbedtls_xtea_free(&xtea); 442cabdff1aSopenharmony_ci} 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci#define IMPL_USE_mbedcrypto(...) IMPL_USE(__VA_ARGS__) 445cabdff1aSopenharmony_ci#else 446cabdff1aSopenharmony_ci#define IMPL_USE_mbedcrypto(...) /* ignore */ 447cabdff1aSopenharmony_ci#endif 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci/*************************************************************************** 450cabdff1aSopenharmony_ci * tomcrypt: LibTomCrypt 451cabdff1aSopenharmony_ci ***************************************************************************/ 452cabdff1aSopenharmony_ci 453cabdff1aSopenharmony_ci#if (USE_EXT_LIBS) & USE_tomcrypt 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci#include <tomcrypt.h> 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_ci#define DEFINE_TOMCRYPT_WRAPPER(suffix, namespace, algo) \ 458cabdff1aSopenharmony_cistatic void run_tomcrypt_ ## suffix(uint8_t *output, \ 459cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) \ 460cabdff1aSopenharmony_ci{ \ 461cabdff1aSopenharmony_ci hash_state md; \ 462cabdff1aSopenharmony_ci namespace ## _init(&md); \ 463cabdff1aSopenharmony_ci namespace ## _process(&md, input, size); \ 464cabdff1aSopenharmony_ci namespace ## _done(&md, output); \ 465cabdff1aSopenharmony_ci} 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(md5, md5, MD5) 468cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(sha1, sha1, SHA1) 469cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(sha256, sha256, SHA256) 470cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(sha512, sha512, SHA512) 471cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(ripemd128, rmd128, RIPEMD128) 472cabdff1aSopenharmony_ciDEFINE_TOMCRYPT_WRAPPER(ripemd160, rmd160, RIPEMD160) 473cabdff1aSopenharmony_ci 474cabdff1aSopenharmony_cistatic void run_tomcrypt_aes128(uint8_t *output, 475cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 476cabdff1aSopenharmony_ci{ 477cabdff1aSopenharmony_ci symmetric_key aes; 478cabdff1aSopenharmony_ci unsigned i; 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci aes_setup(hardcoded_key, 16, 0, &aes); 481cabdff1aSopenharmony_ci size -= 15; 482cabdff1aSopenharmony_ci for (i = 0; i < size; i += 16) 483cabdff1aSopenharmony_ci aes_ecb_encrypt(input + i, output + i, &aes); 484cabdff1aSopenharmony_ci} 485cabdff1aSopenharmony_ci 486cabdff1aSopenharmony_cistatic void run_tomcrypt_blowfish(uint8_t *output, 487cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 488cabdff1aSopenharmony_ci{ 489cabdff1aSopenharmony_ci symmetric_key blowfish; 490cabdff1aSopenharmony_ci unsigned i; 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci blowfish_setup(hardcoded_key, 16, 0, &blowfish); 493cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 494cabdff1aSopenharmony_ci blowfish_ecb_encrypt(input + i, output + i, &blowfish); 495cabdff1aSopenharmony_ci} 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_cistatic void run_tomcrypt_camellia(uint8_t *output, 498cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 499cabdff1aSopenharmony_ci{ 500cabdff1aSopenharmony_ci symmetric_key camellia; 501cabdff1aSopenharmony_ci unsigned i; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci camellia_setup(hardcoded_key, 16, 0, &camellia); 504cabdff1aSopenharmony_ci size -= 15; 505cabdff1aSopenharmony_ci for (i = 0; i < size; i += 16) 506cabdff1aSopenharmony_ci camellia_ecb_encrypt(input + i, output + i, &camellia); 507cabdff1aSopenharmony_ci} 508cabdff1aSopenharmony_ci 509cabdff1aSopenharmony_cistatic void run_tomcrypt_cast128(uint8_t *output, 510cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 511cabdff1aSopenharmony_ci{ 512cabdff1aSopenharmony_ci symmetric_key cast; 513cabdff1aSopenharmony_ci unsigned i; 514cabdff1aSopenharmony_ci 515cabdff1aSopenharmony_ci cast5_setup(hardcoded_key, 16, 0, &cast); 516cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 517cabdff1aSopenharmony_ci cast5_ecb_encrypt(input + i, output + i, &cast); 518cabdff1aSopenharmony_ci} 519cabdff1aSopenharmony_ci 520cabdff1aSopenharmony_cistatic void run_tomcrypt_des(uint8_t *output, 521cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 522cabdff1aSopenharmony_ci{ 523cabdff1aSopenharmony_ci symmetric_key des; 524cabdff1aSopenharmony_ci unsigned i; 525cabdff1aSopenharmony_ci 526cabdff1aSopenharmony_ci des_setup(hardcoded_key, 8, 0, &des); 527cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 528cabdff1aSopenharmony_ci des_ecb_encrypt(input + i, output + i, &des); 529cabdff1aSopenharmony_ci} 530cabdff1aSopenharmony_ci 531cabdff1aSopenharmony_cistatic void run_tomcrypt_rc4(uint8_t *output, 532cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 533cabdff1aSopenharmony_ci{ 534cabdff1aSopenharmony_ci rc4_state rc4; 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci rc4_stream_setup(&rc4, hardcoded_key, 16); 537cabdff1aSopenharmony_ci rc4_stream_crypt(&rc4, input, size, output); 538cabdff1aSopenharmony_ci rc4_stream_done(&rc4); 539cabdff1aSopenharmony_ci} 540cabdff1aSopenharmony_ci 541cabdff1aSopenharmony_cistatic void run_tomcrypt_twofish(uint8_t *output, 542cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 543cabdff1aSopenharmony_ci{ 544cabdff1aSopenharmony_ci symmetric_key twofish; 545cabdff1aSopenharmony_ci unsigned i; 546cabdff1aSopenharmony_ci 547cabdff1aSopenharmony_ci twofish_setup(hardcoded_key, 16, 0, &twofish); 548cabdff1aSopenharmony_ci size -= 15; 549cabdff1aSopenharmony_ci for (i = 0; i < size; i += 16) 550cabdff1aSopenharmony_ci twofish_ecb_encrypt(input + i, output + i, &twofish); 551cabdff1aSopenharmony_ci} 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_cistatic void run_tomcrypt_xtea(uint8_t *output, 554cabdff1aSopenharmony_ci const uint8_t *input, unsigned size) 555cabdff1aSopenharmony_ci{ 556cabdff1aSopenharmony_ci symmetric_key xtea; 557cabdff1aSopenharmony_ci unsigned i; 558cabdff1aSopenharmony_ci 559cabdff1aSopenharmony_ci xtea_setup(hardcoded_key, 16, 0, &xtea); 560cabdff1aSopenharmony_ci for (i = 0; i < size; i += 8) 561cabdff1aSopenharmony_ci xtea_ecb_encrypt(input + i, output + i, &xtea); 562cabdff1aSopenharmony_ci} 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_ci#define IMPL_USE_tomcrypt(...) IMPL_USE(__VA_ARGS__) 566cabdff1aSopenharmony_ci#else 567cabdff1aSopenharmony_ci#define IMPL_USE_tomcrypt(...) /* ignore */ 568cabdff1aSopenharmony_ci#endif 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci/*************************************************************************** 571cabdff1aSopenharmony_ci * Driver code 572cabdff1aSopenharmony_ci ***************************************************************************/ 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_cistatic unsigned crc32(const uint8_t *data, unsigned size) 575cabdff1aSopenharmony_ci{ 576cabdff1aSopenharmony_ci return av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, data, size); 577cabdff1aSopenharmony_ci} 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_cistatic void run_implementation(const uint8_t *input, uint8_t *output, 580cabdff1aSopenharmony_ci struct hash_impl *impl, unsigned size) 581cabdff1aSopenharmony_ci{ 582cabdff1aSopenharmony_ci uint64_t t0, t1; 583cabdff1aSopenharmony_ci unsigned nruns = specified_runs ? specified_runs : (1 << 30) / size; 584cabdff1aSopenharmony_ci unsigned outlen = 0, outcrc = 0; 585cabdff1aSopenharmony_ci unsigned i, j, val; 586cabdff1aSopenharmony_ci double mtime, ttime = 0, ttime2 = 0, stime; 587cabdff1aSopenharmony_ci uint8_t outref[MAX_OUTPUT_SIZE]; 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ci if (enabled_libs && !av_stristr(enabled_libs, impl->lib) || 590cabdff1aSopenharmony_ci enabled_algos && !av_stristr(enabled_algos, impl->name)) 591cabdff1aSopenharmony_ci return; 592cabdff1aSopenharmony_ci if (!sscanf(impl->output, "crc:%x", &outcrc)) { 593cabdff1aSopenharmony_ci outlen = strlen(impl->output) / 2; 594cabdff1aSopenharmony_ci for (i = 0; i < outlen; i++) { 595cabdff1aSopenharmony_ci sscanf(impl->output + i * 2, "%02x", &val); 596cabdff1aSopenharmony_ci outref[i] = val; 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci } 599cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) /* heat caches */ 600cabdff1aSopenharmony_ci impl->run(output, input, size); 601cabdff1aSopenharmony_ci for (i = 0; i < nruns; i++) { 602cabdff1aSopenharmony_ci memset(output, 0, size); /* avoid leftovers from previous runs */ 603cabdff1aSopenharmony_ci t0 = AV_READ_TIME(); 604cabdff1aSopenharmony_ci impl->run(output, input, size); 605cabdff1aSopenharmony_ci t1 = AV_READ_TIME(); 606cabdff1aSopenharmony_ci if (outlen ? memcmp(output, outref, outlen) : 607cabdff1aSopenharmony_ci crc32(output, size) != outcrc) { 608cabdff1aSopenharmony_ci fprintf(stderr, "Expected: "); 609cabdff1aSopenharmony_ci if (outlen) 610cabdff1aSopenharmony_ci for (j = 0; j < outlen; j++) 611cabdff1aSopenharmony_ci fprintf(stderr, "%02x", output[j]); 612cabdff1aSopenharmony_ci else 613cabdff1aSopenharmony_ci fprintf(stderr, "%08x", crc32(output, size)); 614cabdff1aSopenharmony_ci fprintf(stderr, "\n"); 615cabdff1aSopenharmony_ci fatal_error("output mismatch"); 616cabdff1aSopenharmony_ci } 617cabdff1aSopenharmony_ci mtime = (double)(t1 - t0) / size; 618cabdff1aSopenharmony_ci ttime += mtime; 619cabdff1aSopenharmony_ci ttime2 += mtime * mtime; 620cabdff1aSopenharmony_ci } 621cabdff1aSopenharmony_ci 622cabdff1aSopenharmony_ci ttime /= nruns; 623cabdff1aSopenharmony_ci ttime2 /= nruns; 624cabdff1aSopenharmony_ci stime = sqrt(ttime2 - ttime * ttime); 625cabdff1aSopenharmony_ci printf("%-10s %-12s size: %7d runs: %6d time: %8.3f +- %.3f\n", 626cabdff1aSopenharmony_ci impl->lib, impl->name, size, nruns, ttime, stime); 627cabdff1aSopenharmony_ci fflush(stdout); 628cabdff1aSopenharmony_ci} 629cabdff1aSopenharmony_ci 630cabdff1aSopenharmony_ci#define IMPL_USE(lib, name, symbol, output) \ 631cabdff1aSopenharmony_ci { #lib, name, run_ ## lib ## _ ## symbol, output }, 632cabdff1aSopenharmony_ci#define IMPL(lib, ...) IMPL_USE_ ## lib(lib, __VA_ARGS__) 633cabdff1aSopenharmony_ci#define IMPL_ALL(...) \ 634cabdff1aSopenharmony_ci IMPL(lavu, __VA_ARGS__) \ 635cabdff1aSopenharmony_ci IMPL(crypto, __VA_ARGS__) \ 636cabdff1aSopenharmony_ci IMPL(gcrypt, __VA_ARGS__) \ 637cabdff1aSopenharmony_ci IMPL(mbedcrypto, __VA_ARGS__) \ 638cabdff1aSopenharmony_ci IMPL(tomcrypt, __VA_ARGS__) 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_cistruct hash_impl implementations[] = { 641cabdff1aSopenharmony_ci IMPL_ALL("MD5", md5, "aa26ff5b895356bcffd9292ba9f89e66") 642cabdff1aSopenharmony_ci IMPL_ALL("SHA-1", sha1, "1fd8bd1fa02f5b0fe916b0d71750726b096c5744") 643cabdff1aSopenharmony_ci IMPL_ALL("SHA-256", sha256, "14028ac673b3087e51a1d407fbf0df4deeec8f217119e13b07bf2138f93db8c5") 644cabdff1aSopenharmony_ci IMPL_ALL("SHA-512", sha512, "3afdd44a80d99af15c87bd724cb717243193767835ce866dd5d58c02d674bb57" 645cabdff1aSopenharmony_ci "7c25b9e118c200a189fcd5a01ef106a4e200061f3e97dbf50ba065745fd46bef") 646cabdff1aSopenharmony_ci IMPL(lavu, "RIPEMD-128", ripemd128, "9ab8bfba2ddccc5d99c9d4cdfb844a5f") 647cabdff1aSopenharmony_ci IMPL(tomcrypt, "RIPEMD-128", ripemd128, "9ab8bfba2ddccc5d99c9d4cdfb844a5f") 648cabdff1aSopenharmony_ci IMPL_ALL("RIPEMD-160", ripemd160, "62a5321e4fc8784903bb43ab7752c75f8b25af00") 649cabdff1aSopenharmony_ci IMPL_ALL("AES-128", aes128, "crc:ff6bc888") 650cabdff1aSopenharmony_ci IMPL_ALL("CAMELLIA", camellia, "crc:7abb59a7") 651cabdff1aSopenharmony_ci IMPL(lavu, "CAST-128", cast128, "crc:456aa584") 652cabdff1aSopenharmony_ci IMPL(crypto, "CAST-128", cast128, "crc:456aa584") 653cabdff1aSopenharmony_ci IMPL(gcrypt, "CAST-128", cast128, "crc:456aa584") 654cabdff1aSopenharmony_ci IMPL(tomcrypt, "CAST-128", cast128, "crc:456aa584") 655cabdff1aSopenharmony_ci IMPL_ALL("BLOWFISH", blowfish, "crc:33e8aa74") 656cabdff1aSopenharmony_ci IMPL_ALL("DES", des, "crc:31291e0b") 657cabdff1aSopenharmony_ci IMPL(lavu, "TWOFISH", twofish, "crc:9edbd5c1") 658cabdff1aSopenharmony_ci IMPL(gcrypt, "TWOFISH", twofish, "crc:9edbd5c1") 659cabdff1aSopenharmony_ci IMPL(tomcrypt, "TWOFISH", twofish, "crc:9edbd5c1") 660cabdff1aSopenharmony_ci IMPL_ALL("RC4", rc4, "crc:538d37b2") 661cabdff1aSopenharmony_ci IMPL(lavu, "XTEA", xtea, "crc:931fc270") 662cabdff1aSopenharmony_ci IMPL(mbedcrypto, "XTEA", xtea, "crc:931fc270") 663cabdff1aSopenharmony_ci IMPL(tomcrypt, "XTEA", xtea, "crc:931fc270") 664cabdff1aSopenharmony_ci}; 665cabdff1aSopenharmony_ci 666cabdff1aSopenharmony_ciint main(int argc, char **argv) 667cabdff1aSopenharmony_ci{ 668cabdff1aSopenharmony_ci uint8_t *input; 669cabdff1aSopenharmony_ci uint8_t *output; 670cabdff1aSopenharmony_ci unsigned i, impl, size; 671cabdff1aSopenharmony_ci int opt; 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci while ((opt = getopt(argc, argv, "hl:a:r:")) != -1) { 674cabdff1aSopenharmony_ci switch (opt) { 675cabdff1aSopenharmony_ci case 'l': 676cabdff1aSopenharmony_ci enabled_libs = optarg; 677cabdff1aSopenharmony_ci break; 678cabdff1aSopenharmony_ci case 'a': 679cabdff1aSopenharmony_ci enabled_algos = optarg; 680cabdff1aSopenharmony_ci break; 681cabdff1aSopenharmony_ci case 'r': 682cabdff1aSopenharmony_ci specified_runs = strtol(optarg, NULL, 0); 683cabdff1aSopenharmony_ci break; 684cabdff1aSopenharmony_ci case 'h': 685cabdff1aSopenharmony_ci default: 686cabdff1aSopenharmony_ci fprintf(stderr, "Usage: %s [-l libs] [-a algos] [-r runs]\n", 687cabdff1aSopenharmony_ci argv[0]); 688cabdff1aSopenharmony_ci if ((USE_EXT_LIBS)) { 689cabdff1aSopenharmony_ci char buf[1024]; 690cabdff1aSopenharmony_ci snprintf(buf, sizeof(buf), "%s%s%s%s", 691cabdff1aSopenharmony_ci ((USE_EXT_LIBS) & USE_crypto) ? "+crypto" : "", 692cabdff1aSopenharmony_ci ((USE_EXT_LIBS) & USE_gcrypt) ? "+gcrypt" : "", 693cabdff1aSopenharmony_ci ((USE_EXT_LIBS) & USE_mbedcrypto) ? "+mbedcrypto" : "", 694cabdff1aSopenharmony_ci ((USE_EXT_LIBS) & USE_tomcrypt) ? "+tomcrypt" : ""); 695cabdff1aSopenharmony_ci fprintf(stderr, "Built with the following external libraries:\n" 696cabdff1aSopenharmony_ci "make VERSUS=%s\n", buf + 1); 697cabdff1aSopenharmony_ci } else { 698cabdff1aSopenharmony_ci fprintf(stderr, "Built without external libraries; use\n" 699cabdff1aSopenharmony_ci "make VERSUS=crypto+gcrypt+mbedcrypto+tomcrypt tools/crypto_bench\n" 700cabdff1aSopenharmony_ci "to enable them.\n"); 701cabdff1aSopenharmony_ci } 702cabdff1aSopenharmony_ci exit(opt != 'h'); 703cabdff1aSopenharmony_ci } 704cabdff1aSopenharmony_ci } 705cabdff1aSopenharmony_ci input = av_malloc(MAX_INPUT_SIZE * 2); 706cabdff1aSopenharmony_ci if (!input) 707cabdff1aSopenharmony_ci fatal_error("out of memory"); 708cabdff1aSopenharmony_ci for (i = 0; i < MAX_INPUT_SIZE; i += 4) 709cabdff1aSopenharmony_ci AV_WB32(input + i, i); 710cabdff1aSopenharmony_ci 711cabdff1aSopenharmony_ci output = input + MAX_INPUT_SIZE; 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci size = MAX_INPUT_SIZE; 714cabdff1aSopenharmony_ci for (impl = 0; impl < FF_ARRAY_ELEMS(implementations); impl++) 715cabdff1aSopenharmony_ci run_implementation(input, output, &implementations[impl], size); 716cabdff1aSopenharmony_ci 717cabdff1aSopenharmony_ci av_free(input); 718cabdff1aSopenharmony_ci 719cabdff1aSopenharmony_ci return 0; 720cabdff1aSopenharmony_ci} 721