[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher
From: |
Daniel P . Berrangé |
Subject: |
Re: [PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher |
Date: |
Mon, 23 May 2022 10:45:19 +0100 |
User-agent: |
Mutt/2.2.1 (2022-02-19) |
On Sat, May 14, 2022 at 08:55:02AM +0800, zhenwei pi wrote:
> From: Lei He <helei.sig11@bytedance.com>
>
> Add unit test and benchmark test for crypto akcipher.
>
> Signed-off-by: lei he <helei.sig11@bytedance.com>
> Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> 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 0000000000..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 <helei.sig11@bytedance.com>
> + *
> + * 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 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_rsa_speed(rsa4096_priv_key, sizeof(rsa4096_priv_key), key_size);
> +}
> +
> +int main(int argc, char **argv)
> +{
> + char *alg = NULL;
> + char *size = NULL;
> + g_test_init(&argc, &argv, NULL);
> + g_assert(qcrypto_init(NULL) == 0);
> + struct sigaction new_action, old_action;
> +
> + new_action.sa_handler = alarm_handler;
> +
> + /* Set up the structure to specify the new action. */
> + sigemptyset(&new_action.sa_mask);
> + new_action.sa_flags = 0;
> + sigaction(SIGALRM, NULL, &old_action);
> + g_assert(old_action.sa_handler != SIG_IGN);
> + sigaction(SIGALRM, &new_action, NULL);
sigaction doesn't exist on Windows so this fails to compile.
I'd suggest processing a constant amount of data, as the other
benchmark programs do, rather than trying to run for a constant
amount of time.
> +
> +#define ADD_TEST(asym_alg, keysize) \
> + if ((!alg || g_str_equal(alg, #asym_alg)) && \
> + (!size || g_str_equal(size, #keysize))) \
> + g_test_add_data_func( \
> + "/crypto/akcipher/" #asym_alg "-" #keysize, \
> + (void *)keysize, \
> + test_ ## asym_alg ## _ ## keysize ## _speed)
> +
> + if (argc >= 2) {
> + alg = argv[1];
> + }
> + if (argc >= 3) {
> + size = argv[2];
> + }
> +
> + ADD_TEST(rsa, 1024);
> + ADD_TEST(rsa, 2048);
> + ADD_TEST(rsa, 4096);
> +
> + return g_test_run();
> +}
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
- [PATCH v6 1/9] virtio-crypto: header update, (continued)
- [PATCH v6 1/9] virtio-crypto: header update, zhenwei pi, 2022/05/13
- [PATCH v6 2/9] qapi: crypto-akcipher: Introduce akcipher types to qapi, zhenwei pi, 2022/05/13
- [PATCH v6 4/9] crypto: add ASN.1 DER decoder, zhenwei pi, 2022/05/13
- [PATCH v6 5/9] crypto: Implement RSA algorithm by hogweed, zhenwei pi, 2022/05/13
- [PATCH v6 6/9] crypto: Implement RSA algorithm by gcrypt, zhenwei pi, 2022/05/13
- [PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher, zhenwei pi, 2022/05/13
- Re: [PATCH v6 7/9] test/crypto: Add test suite for crypto akcipher,
Daniel P . Berrangé <=
- [PATCH v6 8/9] tests/crypto: Add test suite for RSA keys, zhenwei pi, 2022/05/13
- [PATCH v6 9/9] crypto: Introduce RSA algorithm, zhenwei pi, 2022/05/13