[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 19/58] qom: implement property helper for sha384
From: |
Daniel P . Berrangé |
Subject: |
Re: [PATCH v2 19/58] qom: implement property helper for sha384 |
Date: |
Mon, 21 Aug 2023 10:25:35 +0100 |
User-agent: |
Mutt/2.2.9 (2022-11-12) |
On Fri, Aug 18, 2023 at 05:50:02AM -0400, Xiaoyao Li wrote:
> From: Isaku Yamahata <isaku.yamahata@intel.com>
>
> Implement property_add_sha384() which converts hex string <-> uint8_t[48]
> It will be used for TDX which uses sha384 for measurement.
I think it is likely a better idea to use base64 for the encoding
the binary hash - we use base64 for all the sev-guest properties
that were binary data.
At which points the property set/get logic is much simpler as it
is just needing a call to g_base64_encode / g_base64_decode and
length validation for the decode case.
>
> Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
> include/qom/object.h | 17 ++++++++++
> qom/object.c | 76 ++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 93 insertions(+)
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index ef7258a5e149..70399a5b1940 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1887,6 +1887,23 @@ ObjectProperty *object_property_add_alias(Object *obj,
> const char *name,
> ObjectProperty *object_property_add_const_link(Object *obj, const char *name,
> Object *target);
>
> +
> +/**
> + * object_property_add_sha384:
> + * @obj: the object to add a property to
> + * @name: the name of the property
> + * @v: pointer to value
> + * @flags: bitwise-or'd ObjectPropertyFlags
> + *
> + * Add an sha384 property in memory. This function will add a
> + * property of type 'sha384'.
> + *
> + * Returns: The newly added property on success, or %NULL on failure.
> + */
> +ObjectProperty * object_property_add_sha384(Object *obj, const char *name,
> + const uint8_t *v,
> + ObjectPropertyFlags flags);
> +
> /**
> * object_property_set_description:
> * @obj: the object owning the property
> diff --git a/qom/object.c b/qom/object.c
> index e25f1e96db1e..e71ce46ed576 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -15,6 +15,7 @@
> #include "qapi/error.h"
> #include "qom/object.h"
> #include "qom/object_interfaces.h"
> +#include "qemu/ctype.h"
> #include "qemu/cutils.h"
> #include "qemu/memalign.h"
> #include "qapi/visitor.h"
> @@ -2781,6 +2782,81 @@ object_property_add_alias(Object *obj, const char
> *name,
> return op;
> }
>
> +#define SHA384_DIGEST_SIZE 48
> +static void property_get_sha384(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp)
> +{
> + uint8_t *value = (uint8_t *)opaque;
> + char str[SHA384_DIGEST_SIZE * 2 + 1];
> + char *str_ = (char*)str;
> + size_t i;
> +
> + for (i = 0; i < SHA384_DIGEST_SIZE; i++) {
> + char *buf;
> + buf = &str[i * 2];
> +
> + sprintf(buf, "%02hhx", value[i]);
> + }
> + str[SHA384_DIGEST_SIZE * 2] = '\0';
> +
> + visit_type_str(v, name, &str_, errp);
> +}
> +
> +static void property_set_sha384(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp)
> +{
> + uint8_t *value = (uint8_t *)opaque;
> + char* str;
> + size_t len;
> + size_t i;
> +
> + if (!visit_type_str(v, name, &str, errp)) {
> + goto err;
> + }
> +
> + len = strlen(str);
> + if (len != SHA384_DIGEST_SIZE * 2) {
> + error_setg(errp, "invalid length for sha348 hex string %s. "
> + "it must be 48 * 2 hex", name);
> + goto err;
> + }
> +
> + for (i = 0; i < SHA384_DIGEST_SIZE; i++) {
> + if (!qemu_isxdigit(str[i * 2]) || !qemu_isxdigit(str[i * 2 + 1])) {
> + error_setg(errp, "invalid char for sha318 hex string %s at %c%c",
> + name, str[i * 2], str[i * 2 + 1]);
> + goto err;
> + }
> +
> + if (sscanf(str + i * 2, "%02hhx", &value[i]) != 1) {
> + error_setg(errp, "invalid format for sha318 hex string %s",
> name);
> + goto err;
> + }
> + }
> +
> +err:
> + g_free(str);
> +}
> +
> +ObjectProperty *
> +object_property_add_sha384(Object *obj, const char *name,
> + const uint8_t *v, ObjectPropertyFlags flags)
> +{
> + ObjectPropertyAccessor *getter = NULL;
> + ObjectPropertyAccessor *setter = NULL;
> +
> + if ((flags & OBJ_PROP_FLAG_READ) == OBJ_PROP_FLAG_READ) {
> + getter = property_get_sha384;
> + }
> +
> + if ((flags & OBJ_PROP_FLAG_WRITE) == OBJ_PROP_FLAG_WRITE) {
> + setter = property_set_sha384;
> + }
> +
> + return object_property_add(obj, name, "sha384",
> + getter, setter, NULL, (void *)v);
> +}
> +
> void object_property_set_description(Object *obj, const char *name,
> const char *description)
> {
> --
> 2.34.1
>
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 :|
- Re: [PATCH v2 14/58] i386/tdx: Initialize TDX before creating TD vcpus, (continued)
[PATCH v2 19/58] qom: implement property helper for sha384, Xiaoyao Li, 2023/08/18
- Re: [PATCH v2 19/58] qom: implement property helper for sha384,
Daniel P . Berrangé <=
[PATCH v2 20/58] i386/tdx: Allows mrconfigid/mrowner/mrownerconfig for TDX_INIT_VM, Xiaoyao Li, 2023/08/18
[PATCH v2 21/58] i386/tdx: Implement user specified tsc frequency, Xiaoyao Li, 2023/08/18
[PATCH v2 25/58] kvm/tdx: Don't complain when converting vMMIO region to shared, Xiaoyao Li, 2023/08/18
[PATCH v2 28/58] i386/tdx: Parse TDVF metadata for TDX VM, Xiaoyao Li, 2023/08/18
[PATCH v2 26/58] kvm/tdx: Ignore memory conversion to shared of unassigned region, Xiaoyao Li, 2023/08/18