From: "Daniel P. Berrangé" <berrange@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Laszlo Ersek <lersek@redhat.com>,
qemu-devel@nongnu.org, Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [PATCH v9 4/5] crypto: Add tls-cipher-suites object
Date: Tue, 16 Jun 2020 17:32:54 +0100 [thread overview]
Message-ID: <20200616163254.GQ550360@redhat.com> (raw)
In-Reply-To: <20200615103457.25282-5-philmd@redhat.com>
On Mon, Jun 15, 2020 at 12:34:56PM +0200, Philippe Mathieu-Daudé wrote:
> On the host OS, various aspects of TLS operation are configurable.
> In particular it is possible for the sysadmin to control the TLS
> cipher/protocol algorithms that applications are permitted to use.
>
> * Any given crypto library has a built-in default priority list
> defined by the distro maintainer of the library package (or by
> upstream).
>
> * The "crypto-policies" RPM (or equivalent host OS package)
> provides a config file such as "/etc/crypto-policies/config",
> where the sysadmin can set a high level (library-independent)
> policy.
>
> The "update-crypto-policies --set" command (or equivalent) is
> used to translate the global policy to individual library
> representations, producing files such as
> "/etc/crypto-policies/back-ends/*.config". The generated files,
> if present, are loaded by the various crypto libraries to
> override their own built-in defaults.
>
> For example, the GNUTLS library may read
> "/etc/crypto-policies/back-ends/gnutls.config".
>
> * A management application (or the QEMU user) may overide the
> system-wide crypto-policies config via their own config, if
> they need to diverge from the former.
>
> Thus the priority order is "QEMU user config" > "crypto-policies
> system config" > "library built-in config".
>
> Introduce the "tls-cipher-suites" object for exposing the ordered
> list of permitted TLS cipher suites from the host side to the
> guest firmware, via fw_cfg. The list is represented as an array
> of IANA_TLS_CIPHER objects. The firmware uses the IANA_TLS_CIPHER
> array for configuring guest-side TLS, for example in UEFI HTTPS
> Boot.
>
> The priority at which the host-side policy is retrieved is given
> by the "priority" property of the new object type. For example,
> "priority=@SYSTEM" may be used to refer to
> "/etc/crypto-policies/back-ends/gnutls.config" (given that QEMU
> uses GNUTLS).
>
> [Description from Daniel P. Berrangé, edited by Laszlo Ersek.]
>
> Example of use to dump the cipher suites:
>
> $ qemu-system-x86_64 -S \
> -object tls-cipher-suites,id=mysuite,priority=@SYSTEM \
> -trace qcrypto\*
>
> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> v9: Replaced 'backends' -> 'frontends' (lersek)
> ---
> include/crypto/tls-cipher-suites.h | 38 +++++++++
> crypto/tls-cipher-suites.c | 127 +++++++++++++++++++++++++++++
> crypto/Makefile.objs | 1 +
> crypto/trace-events | 5 ++
> qemu-options.hx | 19 +++++
> 5 files changed, 190 insertions(+)
> create mode 100644 include/crypto/tls-cipher-suites.h
> create mode 100644 crypto/tls-cipher-suites.c
>
> diff --git a/include/crypto/tls-cipher-suites.h b/include/crypto/tls-cipher-suites.h
> new file mode 100644
> index 0000000000..3848393a20
> --- /dev/null
> +++ b/include/crypto/tls-cipher-suites.h
> @@ -0,0 +1,38 @@
> +/*
> + * QEMU TLS Cipher Suites Registry (RFC8447)
> + *
> + * Copyright (c) 2019 Red Hat, Inc.
> + *
> + * Author: Philippe Mathieu-Daudé <philmd@redhat.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#ifndef QCRYPTO_TLSCIPHERSUITES_H
> +#define QCRYPTO_TLSCIPHERSUITES_H
> +
> +#include "qom/object.h"
> +#include "crypto/tlscreds.h"
> +
> +#define TYPE_QCRYPTO_TLS_CIPHER_SUITES "tls-cipher-suites"
> +#define QCRYPTO_TLS_CIPHER_SUITES(obj) \
> + OBJECT_CHECK(QCryptoTLSCipherSuites, (obj), TYPE_QCRYPTO_TLS_CIPHER_SUITES)
> +
> +/*
> + * IANA registered TLS ciphers:
> + * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4
> + */
> +typedef struct {
> + uint8_t data[2];
> +} QEMU_PACKED IANA_TLS_CIPHER;
> +
> +typedef struct QCryptoTLSCipherSuites {
> + /* <private> */
> + QCryptoTLSCreds parent_obj;
> +
> + /* <public> */
> + IANA_TLS_CIPHER *cipher_list;
> + unsigned cipher_count;
There's no benefit to storing in a IANA_TLS_CIPHER struct
that I can see. If you use a GByteArray for storing the
data to match my suggestion from the previous patch, then.....
> +} QCryptoTLSCipherSuites;
> +
> +#endif /* QCRYPTO_TLSCIPHERSUITES_H */
> diff --git a/crypto/tls-cipher-suites.c b/crypto/tls-cipher-suites.c
> new file mode 100644
> index 0000000000..f02a041f9a
> --- /dev/null
> +++ b/crypto/tls-cipher-suites.c
> @@ -0,0 +1,127 @@
> +/*
> + * QEMU TLS Cipher Suites
> + *
> + * Copyright (c) 2019 Red Hat, Inc.
> + *
> + * Author: Philippe Mathieu-Daudé <philmd@redhat.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "qom/object_interfaces.h"
> +#include "qemu/error-report.h"
> +#include "crypto/tlscreds.h"
> +#include "crypto/tls-cipher-suites.h"
> +#include "trace.h"
> +
> +static void parse_cipher_suites(QCryptoTLSCipherSuites *s,
> + const char *priority_name, Error **errp)
> +{
> + int ret;
> + const char *err;
> + gnutls_priority_t pcache;
> + enum { M_ENUMERATE, M_GENERATE, M_DONE } mode;
> +
> + assert(priority_name);
> + trace_qcrypto_tls_cipher_suite_priority(priority_name);
> + ret = gnutls_priority_init(&pcache, priority_name, &err);
> + if (ret < 0) {
> + error_setg(errp, "Syntax error using priority '%s': %s",
> + priority_name, gnutls_strerror(ret));
> + return;
> + }
> +
> + for (mode = M_ENUMERATE; mode < M_DONE; mode++) {
> + size_t i;
....this extra loop is not neccessary....
> +
> + for (i = 0;; i++) {
> + int ret;
> + unsigned idx;
> + const char *name;
> + IANA_TLS_CIPHER cipher;
> + gnutls_protocol_t protocol;
> +
> + ret = gnutls_priority_get_cipher_suite_index(pcache, i, &idx);
> + if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) {
> + break;
> + }
> + if (ret == GNUTLS_E_UNKNOWN_CIPHER_SUITE) {
> + continue;
> + }
> +
> + name = gnutls_cipher_suite_info(idx, (unsigned char *)&cipher,
> + NULL, NULL, NULL, &protocol);
> + if (name == NULL) {
> + continue;
> + }
> +
> + if (mode == M_GENERATE) {
> + const char *version;
> +
> + version = gnutls_protocol_get_name(protocol);
> + trace_qcrypto_tls_cipher_suite_info(cipher.data[0],
> + cipher.data[1],
> + version, name);
> + s->cipher_list[s->cipher_count] = cipher;
...you can just call g_byte_array_append() here. GByteArray will
efficiently grow as needed - it won't do O(N) re-allocs.
> + }
> + s->cipher_count++;
> + }
> +
> + if (mode == M_ENUMERATE) {
> + if (s->cipher_count == 0) {
> + break;
> + }
> + s->cipher_list = g_new(IANA_TLS_CIPHER, s->cipher_count);
> + s->cipher_count = 0;
> + }
> + }
> + trace_qcrypto_tls_cipher_suite_count(s->cipher_count);
> + gnutls_priority_deinit(pcache);
> +}
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 :|
next prev parent reply other threads:[~2020-06-16 16:34 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-15 10:34 [PATCH v9 0/5] fw_cfg: Add FW_CFG_DATA_GENERATOR; crypto: Add tls-cipher-suites Philippe Mathieu-Daudé
2020-06-15 10:34 ` [PATCH v9 1/5] hw/nvram/fw_cfg: Add the FW_CFG_DATA_GENERATOR interface Philippe Mathieu-Daudé
2020-06-16 15:31 ` Daniel P. Berrangé
2020-06-20 17:52 ` Richard Henderson
2020-06-22 13:54 ` Philippe Mathieu-Daudé
2020-06-22 14:08 ` Daniel P. Berrangé
2020-06-15 10:34 ` [PATCH v9 2/5] softmmu/vl: Let -fw_cfg option take a 'gen_id' argument Philippe Mathieu-Daudé
2020-06-15 10:34 ` [PATCH v9 3/5] softmmu/vl: Allow -fw_cfg 'gen_id' option to use the 'etc/' namespace Philippe Mathieu-Daudé
2020-06-15 10:34 ` [PATCH v9 4/5] crypto: Add tls-cipher-suites object Philippe Mathieu-Daudé
2020-06-16 16:32 ` Daniel P. Berrangé [this message]
2020-06-15 10:34 ` [PATCH v9 5/5] crypto/tls-cipher-suites: Produce fw_cfg consumable blob Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200616163254.GQ550360@redhat.com \
--to=berrange@redhat.com \
--cc=kraxel@redhat.com \
--cc=lersek@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.