2 * QEMU Crypto hash speed benchmark
4 * Copyright (c) 2017 HUAWEI TECHNOLOGIES CO., LTD.
7 * Longpeng(Mike) <longpeng2@huawei.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or
10 * (at your option) any later version. See the COPYING file in the
11 * top-level directory.
13 #include "qemu/osdep.h"
14 #include "qemu/units.h"
15 #include "crypto/init.h"
16 #include "crypto/hash.h"
18 typedef struct QCryptoHashOpts
{
20 QCryptoHashAlgorithm alg
;
23 static void test_hash_speed(const void *opaque
)
25 const QCryptoHashOpts
*opts
= opaque
;
26 uint8_t *in
= NULL
, *out
= NULL
;
28 const size_t total
= 2 * GiB
;
33 in
= g_new0(uint8_t, opts
->chunk_size
);
34 memset(in
, g_test_rand_int(), opts
->chunk_size
);
36 iov
.iov_base
= (char *)in
;
37 iov
.iov_len
= opts
->chunk_size
;
42 ret
= qcrypto_hash_bytesv(opts
->alg
,
43 &iov
, 1, &out
, &out_len
,
47 remain
-= opts
->chunk_size
;
49 g_test_timer_elapsed();
51 g_test_message("hash(%s): chunk %zu bytes %.2f MB/sec",
52 QCryptoHashAlgorithm_str(opts
->alg
),
53 opts
->chunk_size
, total
/ g_test_timer_last());
59 int main(int argc
, char **argv
)
63 g_test_init(&argc
, &argv
, NULL
);
64 g_assert(qcrypto_init(NULL
) == 0);
66 #define TEST_ONE(a, c) \
67 QCryptoHashOpts opts ## a ## c = { \
68 .alg = QCRYPTO_HASH_ALG_ ## a, .chunk_size = c, \
70 memset(name, 0 , sizeof(name)); \
71 snprintf(name, sizeof(name), \
72 "/crypto/benchmark/hash/%s/bufsize-%d", \
73 QCryptoHashAlgorithm_str(QCRYPTO_HASH_ALG_ ## a), \
75 if (qcrypto_hash_supports(QCRYPTO_HASH_ALG_ ## a)) \
76 g_test_add_data_func(name, \
88 TEST_ONE(SHA1
, 16384);
90 TEST_ONE(SHA224
, 512);
91 TEST_ONE(SHA224
, 1024);
92 TEST_ONE(SHA224
, 4096);
93 TEST_ONE(SHA224
, 16384);
95 TEST_ONE(SHA384
, 512);
96 TEST_ONE(SHA384
, 1024);
97 TEST_ONE(SHA384
, 4096);
98 TEST_ONE(SHA384
, 16384);
100 TEST_ONE(SHA256
, 512);
101 TEST_ONE(SHA256
, 1024);
102 TEST_ONE(SHA256
, 4096);
103 TEST_ONE(SHA256
, 16384);
105 TEST_ONE(SHA512
, 512);
106 TEST_ONE(SHA512
, 1024);
107 TEST_ONE(SHA512
, 4096);
108 TEST_ONE(SHA512
, 16384);
110 TEST_ONE(RIPEMD160
, 512);
111 TEST_ONE(RIPEMD160
, 1024);
112 TEST_ONE(RIPEMD160
, 4096);
113 TEST_ONE(RIPEMD160
, 16384);