Re: [PATCH v6 14/60] i386/tdx: Support user configurable mrconfigid/mrowner/mrownerconfig

Xiaoyao Li
2024-11-05T11:54:54Z

On 11/5/2024 6:38 PM, Daniel P. Berrangé wrote:
> On Tue, Nov 05, 2024 at 01:23:22AM -0500, Xiaoyao Li wrote:
>> From: Isaku Yamahata <isaku.yamahata@intel.com>
>>
>> Three sha384 hash values, mrconfigid, mrowner and mrownerconfig, of a TD
>> can be provided for TDX attestation. Detailed meaning of them can be
>> found: https://lore.kernel.org/qemu-devel/31d6dbc1-f453-4cef-ab08-4813f4e0ff92@intel.com/
>>
>> Allow user to specify those values via property mrconfigid, mrowner and
>> mrownerconfig. They are all in base64 format.
>>
>> example
>> -object tdx-guest, \
>> mrconfigid=ASNFZ4mrze8BI0VniavN7wEjRWeJq83vASNFZ4mrze8BI0VniavN7wEjRWeJq83v,\
>> mrowner=ASNFZ4mrze8BI0VniavN7wEjRWeJq83vASNFZ4mrze8BI0VniavN7wEjRWeJq83v,\
>> mrownerconfig=ASNFZ4mrze8BI0VniavN7wEjRWeJq83vASNFZ4mrze8BI0VniavN7wEjRWeJq83v
>>
>> Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
>> Co-developed-by: Xiaoyao Li <xiaoyao.li@intel.com>
>> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
>> ---
>> Changes in v6:
>> - refine the doc comment of QAPI properties;
>>
>> Changes in v5:
>> - refine the description of QAPI properties and add description of
>> default value when not specified;
>>
>> Changes in v4:
>> - describe more of there fields in qom.json
>> - free the old value before set new value to avoid memory leak in
>> _setter(); (Daniel)
>>
>> Changes in v3:
>> - use base64 encoding instread of hex-string;
>> ---
>> qapi/qom.json | 16 +++++++-
>> target/i386/kvm/tdx.c | 86 +++++++++++++++++++++++++++++++++++++++++++
>> target/i386/kvm/tdx.h | 3 ++
>> 3 files changed, 104 insertions(+), 1 deletion(-)
>
>> diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
>> index 5a9ce2ada89d..887a5324b439 100644
>> --- a/target/i386/kvm/tdx.c
>> +++ b/target/i386/kvm/tdx.c
>> @@ -13,6 +13,7 @@
>>
>> #include "qemu/osdep.h"
>> #include "qemu/error-report.h"
>> +#include "qemu/base64.h"
>> #include "qapi/error.h"
>> #include "qom/object_interfaces.h"
>>
>> @@ -222,6 +223,7 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
>> X86CPU *x86cpu = X86_CPU(cpu);
>> CPUX86State *env = &x86cpu->env;
>> g_autofree struct kvm_tdx_init_vm *init_vm = NULL;
>> + size_t data_len;
>> int r = 0;
>>
>> QEMU_LOCK_GUARD(&tdx_guest->lock);
>> @@ -232,6 +234,37 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
>> init_vm = g_malloc0(sizeof(struct kvm_tdx_init_vm) +
>> sizeof(struct kvm_cpuid_entry2) * KVM_MAX_CPUID_ENTRIES);
>>
>> +#define SHA384_DIGEST_SIZE 48
>
> Don't define this - as of fairly recently, we now have
> QCRYPTO_HASH_DIGEST_LEN_SHA384 in QEMU's "crypto/hash.h"
> header.

Thanks for the information!

Will update to use it.

>> + if (tdx_guest->mrconfigid) {
>> + g_autofree uint8_t *data = qbase64_decode(tdx_guest->mrconfigid,
>> + strlen(tdx_guest->mrconfigid), &data_len, errp);
>> + if (!data || data_len != SHA384_DIGEST_SIZE) {
>> + error_setg(errp, "TDX: failed to decode mrconfigid");
>> + return -1;
>> + }
>> + memcpy(init_vm->mrconfigid, data, data_len);
>> + }
>> +
>> + if (tdx_guest->mrowner) {
>> + g_autofree uint8_t *data = qbase64_decode(tdx_guest->mrowner,
>> + strlen(tdx_guest->mrowner), &data_len, errp);
>> + if (!data || data_len != SHA384_DIGEST_SIZE) {
>> + error_setg(errp, "TDX: failed to decode mrowner");
>> + return -1;
>> + }
>> + memcpy(init_vm->mrowner, data, data_len);
>> + }
>> +
>> + if (tdx_guest->mrownerconfig) {
>> + g_autofree uint8_t *data = qbase64_decode(tdx_guest->mrownerconfig,
>> + strlen(tdx_guest->mrownerconfig), &data_len, errp);
>> + if (!data || data_len != SHA384_DIGEST_SIZE) {
>> + error_setg(errp, "TDX: failed to decode mrownerconfig");
>> + return -1;
>> + }
>> + memcpy(init_vm->mrownerconfig, data, data_len);
>> + }
>> +
>> r = setup_td_guest_attributes(x86cpu, errp);
>> if (r) {
>> return r;
>
> With regards,
> Daniel