[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v2 30/44] qom: implement property helper for sha384
From: |
isaku . yamahata |
Subject: |
[RFC PATCH v2 30/44] qom: implement property helper for sha384 |
Date: |
Wed, 7 Jul 2021 17:55:00 -0700 |
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.
Signed-off-by: Isaku Yamahata <isaku.yamahata@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 6721cd312e..594d0ec52c 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1853,6 +1853,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 6a01d56546..e33a0b8c5d 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 "qapi/visitor.h"
#include "qapi/string-input-visitor.h"
@@ -2749,6 +2750,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.25.1
- [RFC PATCH v2 00/44] TDX support, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 02/44] kvm: Switch KVM_CAP_READONLY_MEM to a per-VM ioctl(), isaku . yamahata, 2021/07/07
- [RFC PATCH v2 29/44] target/i386: Add machine option to disable PIC/8259, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 30/44] qom: implement property helper for sha384,
isaku . yamahata <=
- [RFC PATCH v2 31/44] target/i386/tdx: Allows mrconfigid/mrowner/mrownerconfig for TDX_INIT_VM, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 03/44] i386/kvm: Move architectural CPUID leaf generation to separarte helper, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 01/44] target/i386: Expose x86_cpu_get_supported_feature_word() for TDX, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 13/44] i386/tdx: Frame in tdx_get_supported_cpuid with KVM_TDX_CAPABILITIES, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 33/44] qmp: add query-tdx-capabilities query-tdx command, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 10/44] hw/i386: Initialize TDX via KVM ioctl() when kvm_type is TDX, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 09/44] target/i386: kvm: don't synchronize guest tsc for TD guest, isaku . yamahata, 2021/07/07
- [RFC PATCH v2 32/44] tdx: add kvm_tdx_enabled() accessor for later use, isaku . yamahata, 2021/07/07