xref: /third_party/ffmpeg/tools/crypto_bench.c (revision cabdff1a)
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