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_print("%.2f MB/sec ", (double)total
/ MiB
/ g_test_timer_last());
57 int main(int argc
, char **argv
)
61 g_test_init(&argc
, &argv
, NULL
);
62 g_assert(qcrypto_init(NULL
) == 0);
64 #define TEST_ONE(a, c) \
65 QCryptoHashOpts opts ## a ## c = { \
66 .alg = QCRYPTO_HASH_ALG_ ## a, .chunk_size = c, \
68 memset(name, 0 , sizeof(name)); \
69 snprintf(name, sizeof(name), \
70 "/crypto/benchmark/hash/%s/bufsize-%d", \
71 QCryptoHashAlgorithm_str(QCRYPTO_HASH_ALG_ ## a), \
73 if (qcrypto_hash_supports(QCRYPTO_HASH_ALG_ ## a)) \
74 g_test_add_data_func(name, \
86 TEST_ONE(SHA1
, 16384);
88 TEST_ONE(SHA224
, 512);
89 TEST_ONE(SHA224
, 1024);
90 TEST_ONE(SHA224
, 4096);
91 TEST_ONE(SHA224
, 16384);
93 TEST_ONE(SHA384
, 512);
94 TEST_ONE(SHA384
, 1024);
95 TEST_ONE(SHA384
, 4096);
96 TEST_ONE(SHA384
, 16384);
98 TEST_ONE(SHA256
, 512);
99 TEST_ONE(SHA256
, 1024);
100 TEST_ONE(SHA256
, 4096);
101 TEST_ONE(SHA256
, 16384);
103 TEST_ONE(SHA512
, 512);
104 TEST_ONE(SHA512
, 1024);
105 TEST_ONE(SHA512
, 4096);
106 TEST_ONE(SHA512
, 16384);
108 TEST_ONE(RIPEMD160
, 512);
109 TEST_ONE(RIPEMD160
, 1024);
110 TEST_ONE(RIPEMD160
, 4096);
111 TEST_ONE(RIPEMD160
, 16384);