Re: [PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher
On Sat, May 14, 2022 at 08:55:02AM +0800, zhenwei pi wrote: > From: Lei He > > Add unit test and benchmark test for crypto akcipher. > > Signed-off-by: lei he > Signed-off-by: zhenwei pi > Reviewed-by: Daniel P. Berrangé > --- > tests/bench/benchmark-crypto-akcipher.c | 157 ++ > tests/bench/meson.build | 1 + > tests/bench/test_akcipher_keys.inc | 537 ++ > tests/unit/meson.build | 1 + > tests/unit/test-crypto-akcipher.c | 711 > 5 files changed, 1407 insertions(+) > create mode 100644 tests/bench/benchmark-crypto-akcipher.c > create mode 100644 tests/bench/test_akcipher_keys.inc > create mode 100644 tests/unit/test-crypto-akcipher.c > > diff --git a/tests/bench/benchmark-crypto-akcipher.c > b/tests/bench/benchmark-crypto-akcipher.c > new file mode 100644 > index 00..c6c80c0be1 > --- /dev/null > +++ b/tests/bench/benchmark-crypto-akcipher.c > @@ -0,0 +1,157 @@ > +/* > + * QEMU Crypto akcipher speed benchmark > + * > + * Copyright (c) 2022 Bytedance > + * > + * Authors: > + *lei he > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > + * (at your option) any later version. See the COPYING file in the > + * top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "crypto/init.h" > +#include "crypto/akcipher.h" > +#include "standard-headers/linux/virtio_crypto.h" > + > +#include "test_akcipher_keys.inc" > + > +static bool keep_running; > + > +static void alarm_handler(int sig) > +{ > +keep_running = false; > +} > + > +static QCryptoAkCipher *create_rsa_akcipher(const uint8_t *priv_key, > +size_t keylen, > +QCryptoRSAPaddingAlgorithm > padding, > +QCryptoHashAlgorithm hash) > +{ > +QCryptoAkCipherOptions opt; > +QCryptoAkCipher *rsa; > + > +opt.alg = QCRYPTO_AKCIPHER_ALG_RSA; > +opt.u.rsa.padding_alg = padding; > +opt.u.rsa.hash_alg = hash; > +rsa = qcrypto_akcipher_new(&opt, QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE, > + priv_key, keylen, &error_abort); > +return rsa; > +} > + > +static void test_rsa_speed(const uint8_t *priv_key, size_t keylen, > + size_t key_size) > +{ > +#define BYTE 8 > +#define SHA1_DGST_LEN 20 > +#define DURATION_SECONDS 10 > +#define PADDING QCRYPTO_RSA_PADDING_ALG_PKCS1 > +#define HASH QCRYPTO_HASH_ALG_SHA1 > + > +g_autoptr(QCryptoAkCipher) rsa = > +create_rsa_akcipher(priv_key, keylen, PADDING, HASH); > +g_autofree uint8_t *dgst = NULL; > +g_autofree uint8_t *signature = NULL; > +size_t count; > + > +dgst = g_new0(uint8_t, SHA1_DGST_LEN); > +memset(dgst, g_test_rand_int(), SHA1_DGST_LEN); > +signature = g_new0(uint8_t, key_size / BYTE); > + > +g_test_message("benchmark rsa%lu (%s-%s) sign in %d seconds", key_size, > + QCryptoRSAPaddingAlgorithm_str(PADDING), > + QCryptoHashAlgorithm_str(HASH), > + DURATION_SECONDS); Needs to be '%zu' here and several other places in this file for any parameter which is 'size_t'. > +alarm(DURATION_SECONDS); > +g_test_timer_start(); > +for (keep_running = true, count = 0; keep_running; ++count) { > +g_assert(qcrypto_akcipher_sign(rsa, dgst, SHA1_DGST_LEN, > + signature, key_size / BYTE, > + &error_abort) > 0); > +} > +g_test_timer_elapsed(); > +g_test_message("rsa%lu (%s-%s) sign %lu times in %.2f seconds," > + " %.2f times/sec ", > + key_size, QCryptoRSAPaddingAlgorithm_str(PADDING), > + QCryptoHashAlgorithm_str(HASH), > + count, g_test_timer_last(), > + (double)count / g_test_timer_last()); > + > +g_test_message("benchmark rsa%lu (%s-%s) verify in %d seconds", key_size, > + QCryptoRSAPaddingAlgorithm_str(PADDING), > + QCryptoHashAlgorithm_str(HASH), > + DURATION_SECONDS); > +alarm(DURATION_SECONDS); > +g_test_timer_start(); > +for (keep_running = true, count = 0; keep_running; ++count) { > +g_assert(qcrypto_akcipher_verify(rsa, signature, key_size / BYTE, > + dgst, SHA1_DGST_LEN, > + &error_abort) == 0); > +} > +g_test_timer_elapsed(); > +g_test_message("rsa%lu (%s-%s) verify %lu times in %.2f seconds," > + " %.2f times/sec ", > + key_size, QCryptoRSAPaddingAlgorithm_str(PADDING), > + QCryptoHashAlgorithm_str(HASH), > + count, g_test_timer_last(), > + (double)count / g_test_timer_last()); > +} > + > +static void test_rsa_1024_speed(const
[PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher
From: Lei He Add unit test and benchmark test for crypto akcipher. Signed-off-by: lei he Signed-off-by: zhenwei pi Reviewed-by: Daniel P. Berrangé --- tests/bench/benchmark-crypto-akcipher.c | 157 ++ tests/bench/meson.build | 1 + tests/bench/test_akcipher_keys.inc | 537 ++ tests/unit/meson.build | 1 + tests/unit/test-crypto-akcipher.c | 711 5 files changed, 1407 insertions(+) create mode 100644 tests/bench/benchmark-crypto-akcipher.c create mode 100644 tests/bench/test_akcipher_keys.inc create mode 100644 tests/unit/test-crypto-akcipher.c diff --git a/tests/bench/benchmark-crypto-akcipher.c b/tests/bench/benchmark-crypto-akcipher.c new file mode 100644 index 00..c6c80c0be1 --- /dev/null +++ b/tests/bench/benchmark-crypto-akcipher.c @@ -0,0 +1,157 @@ +/* + * QEMU Crypto akcipher speed benchmark + * + * Copyright (c) 2022 Bytedance + * + * Authors: + *lei he + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. See the COPYING file in the + * top-level directory. + */ + +#include "qemu/osdep.h" +#include "crypto/init.h" +#include "crypto/akcipher.h" +#include "standard-headers/linux/virtio_crypto.h" + +#include "test_akcipher_keys.inc" + +static bool keep_running; + +static void alarm_handler(int sig) +{ +keep_running = false; +} + +static QCryptoAkCipher *create_rsa_akcipher(const uint8_t *priv_key, +size_t keylen, +QCryptoRSAPaddingAlgorithm padding, +QCryptoHashAlgorithm hash) +{ +QCryptoAkCipherOptions opt; +QCryptoAkCipher *rsa; + +opt.alg = QCRYPTO_AKCIPHER_ALG_RSA; +opt.u.rsa.padding_alg = padding; +opt.u.rsa.hash_alg = hash; +rsa = qcrypto_akcipher_new(&opt, QCRYPTO_AKCIPHER_KEY_TYPE_PRIVATE, + priv_key, keylen, &error_abort); +return rsa; +} + +static void test_rsa_speed(const uint8_t *priv_key, size_t keylen, + size_t key_size) +{ +#define BYTE 8 +#define SHA1_DGST_LEN 20 +#define DURATION_SECONDS 10 +#define PADDING QCRYPTO_RSA_PADDING_ALG_PKCS1 +#define HASH QCRYPTO_HASH_ALG_SHA1 + +g_autoptr(QCryptoAkCipher) rsa = +create_rsa_akcipher(priv_key, keylen, PADDING, HASH); +g_autofree uint8_t *dgst = NULL; +g_autofree uint8_t *signature = NULL; +size_t count; + +dgst = g_new0(uint8_t, SHA1_DGST_LEN); +memset(dgst, g_test_rand_int(), SHA1_DGST_LEN); +signature = g_new0(uint8_t, key_size / BYTE); + +g_test_message("benchmark rsa%lu (%s-%s) sign in %d seconds", key_size, + QCryptoRSAPaddingAlgorithm_str(PADDING), + QCryptoHashAlgorithm_str(HASH), + DURATION_SECONDS); +alarm(DURATION_SECONDS); +g_test_timer_start(); +for (keep_running = true, count = 0; keep_running; ++count) { +g_assert(qcrypto_akcipher_sign(rsa, dgst, SHA1_DGST_LEN, + signature, key_size / BYTE, + &error_abort) > 0); +} +g_test_timer_elapsed(); +g_test_message("rsa%lu (%s-%s) sign %lu times in %.2f seconds," + " %.2f times/sec ", + key_size, QCryptoRSAPaddingAlgorithm_str(PADDING), + QCryptoHashAlgorithm_str(HASH), + count, g_test_timer_last(), + (double)count / g_test_timer_last()); + +g_test_message("benchmark rsa%lu (%s-%s) verify in %d seconds", key_size, + QCryptoRSAPaddingAlgorithm_str(PADDING), + QCryptoHashAlgorithm_str(HASH), + DURATION_SECONDS); +alarm(DURATION_SECONDS); +g_test_timer_start(); +for (keep_running = true, count = 0; keep_running; ++count) { +g_assert(qcrypto_akcipher_verify(rsa, signature, key_size / BYTE, + dgst, SHA1_DGST_LEN, + &error_abort) == 0); +} +g_test_timer_elapsed(); +g_test_message("rsa%lu (%s-%s) verify %lu times in %.2f seconds," + " %.2f times/sec ", + key_size, QCryptoRSAPaddingAlgorithm_str(PADDING), + QCryptoHashAlgorithm_str(HASH), + count, g_test_timer_last(), + (double)count / g_test_timer_last()); +} + +static void test_rsa_1024_speed(const void *opaque) +{ +size_t key_size = (size_t)opaque; +test_rsa_speed(rsa1024_priv_key, sizeof(rsa1024_priv_key), key_size); +} + +static void test_rsa_2048_speed(const void *opaque) +{ +size_t key_size = (size_t)opaque; +test_rsa_speed(rsa2048_priv_key, sizeof(rsa2048_priv_key), key_size); +} + +static void test_rsa_4096_speed(const void *opaque) +{ +size_t key_size = (size_t)opaque; +test_