Message ID | 20230413034108.1902712-4-sathyanarayanan.kuppuswamy@linux.intel.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp763990vqo; Wed, 12 Apr 2023 20:49:47 -0700 (PDT) X-Google-Smtp-Source: AKy350Z/fFyEQ/A14hqpu87fxl97wFSOi09WKi2Q2UoGGLdTcAk3woy3UKceGESDD+qqUpO1LIEb X-Received: by 2002:a05:6402:7c1:b0:4fa:fcee:1727 with SMTP id u1-20020a05640207c100b004fafcee1727mr1105115edy.13.1681357787569; Wed, 12 Apr 2023 20:49:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681357787; cv=none; d=google.com; s=arc-20160816; b=p1Gkvq/ZYKsHbt5BLKS9QgNvEXuwnOT6cREyoWybccDvY0kZ8JBlo6sMlUvZ8BL9td cW/r/gpiymAglJ4IpdrppwuWtOt6qQ5ihNha7uPOz4bPg3Fj+IA77pF1HPWlDRA+6CsC 9y1yPAHSbLeJoSo03/9sl2IwdKXMwEYqsjNL+r/PXM3P26ngc+5QjBUG/+JD0EDxXLc7 nlM0wFcXIa78DxxYqiQz2TBWM5Swd9BGO6R4UwTUj+mFv1bDkRckqhtDLUewYdgRDITl GrhNhR/HSbwaX/Rgohi2W/Jww1Nj6W4afKTKYfEVfnAEjqFIn/FXbs/gmXGMe3UA/PyX xNYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=eSV1JKvT7Zqy0iROFyMsoZ/xdMIr8GFG2V25GNWuE0k=; b=iZvo08GGXiBlC0F9zU7EkjYoEJ9AZ/UgYXsFACH+8EVS7+NLwUHxELyDnLUbxxJdO9 oaWXpF6UyS8qL4C6AtSM1E5+NYDegImQMT08zW4ieRlqncs4c1yYS4j1uiaaVxXLFfvv /DsbnFxhNfCGyDdDLRq/upafUwM6a3r/8D8VB2voY0oG5iZcGH8y9KXCPgOK0PHGKEhZ 9T4NOTJmWY+zN8UgZ9QkcRO4+6mqRSlvMBxoErb7Jafb5/BLzWcC2o8t8Zbu806AC5Gq qTwbrfQIDa9P/aDyDo7ft+kdjWnc5w0FMIoyBvRjFKcYBlXsKJ7oqg9Zihq7DE6dn+6e tSEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="M9wc3r5/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r18-20020aa7da12000000b00504882a026fsi706176eds.78.2023.04.12.20.49.24; Wed, 12 Apr 2023 20:49:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="M9wc3r5/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229910AbjDMDmY (ORCPT <rfc822;peter110.wang@gmail.com> + 99 others); Wed, 12 Apr 2023 23:42:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52730 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229737AbjDMDmD (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 12 Apr 2023 23:42:03 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FD8B26B3; Wed, 12 Apr 2023 20:42:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681357322; x=1712893322; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JX88hhsS2KW2V7rBG3yf8RrisVNrFnqE6hp/x0xTETo=; b=M9wc3r5/ctgNYiPMRERTBSyI84kXSHOXoXDuH28tygnVz3SLy127jdR0 YKTrO9I2Dei1kPBTPb64zhjQUVE0LVqV2e/hq3CNSG//0jhKzEn6Ks9gP zYDK02KT9LrwP39x1I5G07Gz1xWcyPyXyr3YSVY3cLrVgwsGArk+XypbN Mc5FQOlK6MMfcLqwLYruqGxorIiOGUIo9Vcij7n/UdTqS/nkydE2Eb19O rwAWj/b0gbzrS/RpIqedyno9BT8Sc6OaaJP0R2KdCL+cDAMdCbHmCaAz/ V/3Lsw37rvGwzOThdLytpd3gktpUfa+yQoPMIBjZ8cKM8oa/AI2lYqLkn g==; X-IronPort-AV: E=McAfee;i="6600,9927,10678"; a="323699380" X-IronPort-AV: E=Sophos;i="5.98,339,1673942400"; d="scan'208";a="323699380" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Apr 2023 20:42:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10678"; a="813222568" X-IronPort-AV: E=Sophos;i="5.98,339,1673942400"; d="scan'208";a="813222568" Received: from dayerton-mobl.amr.corp.intel.com (HELO skuppusw-desk1.amr.corp.intel.com) ([10.209.52.214]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Apr 2023 20:42:00 -0700 From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>, Dave Hansen <dave.hansen@linux.intel.com>, x86@kernel.org, Shuah Khan <shuah@kernel.org>, Jonathan Corbet <corbet@lwn.net> Cc: "H . Peter Anvin" <hpa@zytor.com>, Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>, "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>, Tony Luck <tony.luck@intel.com>, Wander Lairson Costa <wander@redhat.com>, Erdem Aktas <erdemaktas@google.com>, Dionna Amalie Glaze <dionnaglaze@google.com>, Chong Cai <chongc@google.com>, Qinkun Bao <qinkun@apache.org>, Guorui Yu <GuoRui.Yu@linux.alibaba.com>, Du Fan <fan.du@intel.com>, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org Subject: [PATCH v2 3/3] selftests/tdx: Test GetQuote TDX attestation feature Date: Wed, 12 Apr 2023 20:41:08 -0700 Message-Id: <20230413034108.1902712-4-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230413034108.1902712-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20230413034108.1902712-1-sathyanarayanan.kuppuswamy@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_PASS, SPF_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763031423399682683?= X-GMAIL-MSGID: =?utf-8?q?1763031423399682683?= |
Series |
TDX Guest Quote generation support
|
|
Commit Message
Kuppuswamy Sathyanarayanan
April 13, 2023, 3:41 a.m. UTC
In TDX guest, the second stage of the attestation process is Quote generation. This process is required to convert the locally generated TDREPORT into a remotely verifiable Quote. It involves sending the TDREPORT data to a Quoting Enclave (QE) which will verify the integerity of the TDREPORT and sign it with an attestation key. Intel's TDX attestation driver exposes TDX_CMD_GET_QUOTE IOCTL to allow user agent get the TD Quote. Add a kernel selftest module to verify the Quote generation feature. TD Quote generation involves following steps: * Get the TDREPORT data using TDX_CMD_GET_REPORT IOCTL. * Embed the TDREPORT data in quote buffer and request for quote generation via TDX_CMD_GET_QUOTE IOCTL request. * Upon completion of the GetQuote request, check for non zero value in the status field of Quote header to make sure the generated quote is valid. Reviewed-by: Tony Luck <tony.luck@intel.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> --- tools/testing/selftests/tdx/tdx_guest_test.c | 68 ++++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-)
Comments
On Wed, Apr 12, 2023 at 8:42 PM Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> wrote: > > In TDX guest, the second stage of the attestation process is Quote > generation. This process is required to convert the locally generated > TDREPORT into a remotely verifiable Quote. It involves sending the > TDREPORT data to a Quoting Enclave (QE) which will verify the > integerity of the TDREPORT and sign it with an attestation key. nit: integrity > > Intel's TDX attestation driver exposes TDX_CMD_GET_QUOTE IOCTL to > allow user agent get the TD Quote. nit: to get > > Add a kernel selftest module to verify the Quote generation feature. > > TD Quote generation involves following steps: > > * Get the TDREPORT data using TDX_CMD_GET_REPORT IOCTL. > * Embed the TDREPORT data in quote buffer and request for quote > generation via TDX_CMD_GET_QUOTE IOCTL request. > * Upon completion of the GetQuote request, check for non zero value > in the status field of Quote header to make sure the generated > quote is valid. > > Reviewed-by: Tony Luck <tony.luck@intel.com> > Reviewed-by: Andi Kleen <ak@linux.intel.com> > Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> > Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > --- > tools/testing/selftests/tdx/tdx_guest_test.c | 68 ++++++++++++++++++-- > 1 file changed, 62 insertions(+), 6 deletions(-) > > diff --git a/tools/testing/selftests/tdx/tdx_guest_test.c b/tools/testing/selftests/tdx/tdx_guest_test.c > index 81d8cb88ea1a..2eccde54185b 100644 > --- a/tools/testing/selftests/tdx/tdx_guest_test.c > +++ b/tools/testing/selftests/tdx/tdx_guest_test.c > @@ -18,6 +18,7 @@ > #define TDX_GUEST_DEVNAME "/dev/tdx_guest" > #define HEX_DUMP_SIZE 8 > #define DEBUG 0 > +#define QUOTE_SIZE 8192 > > /** > * struct tdreport_type - Type header of TDREPORT_STRUCT. > @@ -128,21 +129,29 @@ static void print_array_hex(const char *title, const char *prefix_str, > printf("\n"); > } > > +/* Helper function to get TDREPORT */ > +long get_tdreport0(int devfd, struct tdx_report_req *req) > +{ > + int i; > + > + /* Generate sample report data */ > + for (i = 0; i < TDX_REPORTDATA_LEN; i++) > + req->reportdata[i] = i; > + Shouldn't req be zeroed before populating reportdata? We wouldn't want uninitialized memory to leave the guest. I know this is just a test, but it's best to model good practices for anyone that might copy/paste. > + return ioctl(devfd, TDX_CMD_GET_REPORT0, req); > +} > + > TEST(verify_report) > { > struct tdx_report_req req; > struct tdreport *tdreport; > - int devfd, i; > + int devfd; > > devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); > ASSERT_LT(0, devfd); > > - /* Generate sample report data */ > - for (i = 0; i < TDX_REPORTDATA_LEN; i++) > - req.reportdata[i] = i; > - > /* Get TDREPORT */ > - ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_REPORT0, &req)); > + ASSERT_EQ(0, get_tdreport0(devfd, &req)); > > if (DEBUG) { > print_array_hex("\n\t\tTDX report data\n", "", > @@ -160,4 +169,51 @@ TEST(verify_report) > ASSERT_EQ(0, close(devfd)); > } > > +TEST(verify_quote) > +{ > + struct tdx_quote_hdr *quote_hdr; > + struct tdx_report_req rep_req; > + struct tdx_quote_req req; > + __u64 quote_buf_size; > + __u8 *quote_buf; > + int devfd; > + > + /* Open attestation device */ > + devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); > + > + ASSERT_LT(0, devfd); > + > + /* Add size for quote header */ > + quote_buf_size = sizeof(*quote_hdr) + QUOTE_SIZE; > + > + /* Allocate quote buffer */ > + quote_buf = malloc(quote_buf_size); > + ASSERT_NE(NULL, quote_buf); > + > + quote_hdr = (struct tdx_quote_hdr *)quote_buf; > + > + /* Initialize GetQuote header */ > + quote_hdr->version = 1; > + quote_hdr->status = GET_QUOTE_SUCCESS; > + quote_hdr->in_len = TDX_REPORT_LEN; > + quote_hdr->out_len = 0; > + > + /* Get TDREPORT data */ > + ASSERT_EQ(0, get_tdreport0(devfd, &rep_req)); > + > + /* Fill GetQuote request */ > + memcpy(quote_hdr->data, rep_req.tdreport, TDX_REPORT_LEN); > + req.buf = (__u64)quote_buf; > + req.len = quote_buf_size; > + > + ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_QUOTE, &req)); > + > + /* Check whether GetQuote request is successful */ > + EXPECT_EQ(0, quote_hdr->status); > + > + free(quote_buf); > + > + ASSERT_EQ(0, close(devfd)); > +} > + > TEST_HARNESS_MAIN > -- > 2.34.1 >
Hi, On 4/26/23 8:47 AM, Dionna Amalie Glaze wrote: > On Wed, Apr 12, 2023 at 8:42 PM Kuppuswamy Sathyanarayanan > <sathyanarayanan.kuppuswamy@linux.intel.com> wrote: >> >> In TDX guest, the second stage of the attestation process is Quote >> generation. This process is required to convert the locally generated >> TDREPORT into a remotely verifiable Quote. It involves sending the >> TDREPORT data to a Quoting Enclave (QE) which will verify the >> integerity of the TDREPORT and sign it with an attestation key. > > nit: integrity > >> >> Intel's TDX attestation driver exposes TDX_CMD_GET_QUOTE IOCTL to >> allow user agent get the TD Quote. > > nit: to get >> >> Add a kernel selftest module to verify the Quote generation feature. >> >> TD Quote generation involves following steps: >> >> * Get the TDREPORT data using TDX_CMD_GET_REPORT IOCTL. >> * Embed the TDREPORT data in quote buffer and request for quote >> generation via TDX_CMD_GET_QUOTE IOCTL request. >> * Upon completion of the GetQuote request, check for non zero value >> in the status field of Quote header to make sure the generated >> quote is valid. >> >> Reviewed-by: Tony Luck <tony.luck@intel.com> >> Reviewed-by: Andi Kleen <ak@linux.intel.com> >> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> >> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> >> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> >> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> >> --- >> tools/testing/selftests/tdx/tdx_guest_test.c | 68 ++++++++++++++++++-- >> 1 file changed, 62 insertions(+), 6 deletions(-) >> >> diff --git a/tools/testing/selftests/tdx/tdx_guest_test.c b/tools/testing/selftests/tdx/tdx_guest_test.c >> index 81d8cb88ea1a..2eccde54185b 100644 >> --- a/tools/testing/selftests/tdx/tdx_guest_test.c >> +++ b/tools/testing/selftests/tdx/tdx_guest_test.c >> @@ -18,6 +18,7 @@ >> #define TDX_GUEST_DEVNAME "/dev/tdx_guest" >> #define HEX_DUMP_SIZE 8 >> #define DEBUG 0 >> +#define QUOTE_SIZE 8192 >> >> /** >> * struct tdreport_type - Type header of TDREPORT_STRUCT. >> @@ -128,21 +129,29 @@ static void print_array_hex(const char *title, const char *prefix_str, >> printf("\n"); >> } >> >> +/* Helper function to get TDREPORT */ >> +long get_tdreport0(int devfd, struct tdx_report_req *req) >> +{ >> + int i; >> + >> + /* Generate sample report data */ >> + for (i = 0; i < TDX_REPORTDATA_LEN; i++) >> + req->reportdata[i] = i; >> + > > Shouldn't req be zeroed before populating reportdata? We wouldn't want > uninitialized memory to leave the guest. I know this is just a test, There are only two members in struct tdx_report_req (reportdata and tdreport). The reportdata has already been updated here, and the tdreport will be updated by the kernel on output. Since TDX_CMD_GET_REPORT0 IOCTL handler uses an intermediate kernel buffer to the TDREPORT and copies the generated report back to this user buffer, this uninitialized tdreport data never leaves the guest. IMO, we don't need to zero it. However, because it is harmless, I am fine with including it. > but it's best to model good practices for anyone that might > copy/paste. > >> + return ioctl(devfd, TDX_CMD_GET_REPORT0, req); >> +} >> + >> TEST(verify_report) >> { >> struct tdx_report_req req; >> struct tdreport *tdreport; >> - int devfd, i; >> + int devfd; >> >> devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); >> ASSERT_LT(0, devfd); >> >> - /* Generate sample report data */ >> - for (i = 0; i < TDX_REPORTDATA_LEN; i++) >> - req.reportdata[i] = i; >> - >> /* Get TDREPORT */ >> - ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_REPORT0, &req)); >> + ASSERT_EQ(0, get_tdreport0(devfd, &req)); >> >> if (DEBUG) { >> print_array_hex("\n\t\tTDX report data\n", "", >> @@ -160,4 +169,51 @@ TEST(verify_report) >> ASSERT_EQ(0, close(devfd)); >> } >> >> +TEST(verify_quote) >> +{ >> + struct tdx_quote_hdr *quote_hdr; >> + struct tdx_report_req rep_req; >> + struct tdx_quote_req req; >> + __u64 quote_buf_size; >> + __u8 *quote_buf; >> + int devfd; >> + >> + /* Open attestation device */ >> + devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); >> + >> + ASSERT_LT(0, devfd); >> + >> + /* Add size for quote header */ >> + quote_buf_size = sizeof(*quote_hdr) + QUOTE_SIZE; >> + >> + /* Allocate quote buffer */ >> + quote_buf = malloc(quote_buf_size); >> + ASSERT_NE(NULL, quote_buf); >> + >> + quote_hdr = (struct tdx_quote_hdr *)quote_buf; >> + >> + /* Initialize GetQuote header */ >> + quote_hdr->version = 1; >> + quote_hdr->status = GET_QUOTE_SUCCESS; >> + quote_hdr->in_len = TDX_REPORT_LEN; >> + quote_hdr->out_len = 0; >> + >> + /* Get TDREPORT data */ >> + ASSERT_EQ(0, get_tdreport0(devfd, &rep_req)); >> + >> + /* Fill GetQuote request */ >> + memcpy(quote_hdr->data, rep_req.tdreport, TDX_REPORT_LEN); >> + req.buf = (__u64)quote_buf; >> + req.len = quote_buf_size; >> + >> + ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_QUOTE, &req)); >> + >> + /* Check whether GetQuote request is successful */ >> + EXPECT_EQ(0, quote_hdr->status); >> + >> + free(quote_buf); >> + >> + ASSERT_EQ(0, close(devfd)); >> +} >> + >> TEST_HARNESS_MAIN >> -- >> 2.34.1 >> > >
On 4/26/23 08:47, Dionna Amalie Glaze wrote: >> +/* Helper function to get TDREPORT */ >> +long get_tdreport0(int devfd, struct tdx_report_req *req) >> +{ >> + int i; >> + >> + /* Generate sample report data */ >> + for (i = 0; i < TDX_REPORTDATA_LEN; i++) >> + req->reportdata[i] = i; >> + > Shouldn't req be zeroed before populating reportdata? We wouldn't want > uninitialized memory to leave the guest. I know this is just a test, > but it's best to model good practices for anyone that might > copy/paste. It's leaving the guest and going to the TDX module. What's the problem there?
On 4/27/23 12:10, Sathyanarayanan Kuppuswamy wrote: >> Shouldn't req be zeroed before populating reportdata? We wouldn't want >> uninitialized memory to leave the guest. I know this is just a test, > There are only two members in struct tdx_report_req (reportdata and tdreport). > The reportdata has already been updated here, and the tdreport will be updated > by the kernel on output. Since TDX_CMD_GET_REPORT0 IOCTL handler uses an > intermediate kernel buffer to the TDREPORT and copies the generated report back > to this user buffer, this uninitialized tdreport data never leaves the guest. Is that really even relevant? I mean, we could implement the whole thing with get_user_pages() and then just pass the physical address of the reportdata and tdreport down to the TDX module. It doesn't matter either way. The data is going from guest userspace to the guest kernel to the TDX module, all of which are trusted. It's a selftest. I'd just leave it alone.
diff --git a/tools/testing/selftests/tdx/tdx_guest_test.c b/tools/testing/selftests/tdx/tdx_guest_test.c index 81d8cb88ea1a..2eccde54185b 100644 --- a/tools/testing/selftests/tdx/tdx_guest_test.c +++ b/tools/testing/selftests/tdx/tdx_guest_test.c @@ -18,6 +18,7 @@ #define TDX_GUEST_DEVNAME "/dev/tdx_guest" #define HEX_DUMP_SIZE 8 #define DEBUG 0 +#define QUOTE_SIZE 8192 /** * struct tdreport_type - Type header of TDREPORT_STRUCT. @@ -128,21 +129,29 @@ static void print_array_hex(const char *title, const char *prefix_str, printf("\n"); } +/* Helper function to get TDREPORT */ +long get_tdreport0(int devfd, struct tdx_report_req *req) +{ + int i; + + /* Generate sample report data */ + for (i = 0; i < TDX_REPORTDATA_LEN; i++) + req->reportdata[i] = i; + + return ioctl(devfd, TDX_CMD_GET_REPORT0, req); +} + TEST(verify_report) { struct tdx_report_req req; struct tdreport *tdreport; - int devfd, i; + int devfd; devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); ASSERT_LT(0, devfd); - /* Generate sample report data */ - for (i = 0; i < TDX_REPORTDATA_LEN; i++) - req.reportdata[i] = i; - /* Get TDREPORT */ - ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_REPORT0, &req)); + ASSERT_EQ(0, get_tdreport0(devfd, &req)); if (DEBUG) { print_array_hex("\n\t\tTDX report data\n", "", @@ -160,4 +169,51 @@ TEST(verify_report) ASSERT_EQ(0, close(devfd)); } +TEST(verify_quote) +{ + struct tdx_quote_hdr *quote_hdr; + struct tdx_report_req rep_req; + struct tdx_quote_req req; + __u64 quote_buf_size; + __u8 *quote_buf; + int devfd; + + /* Open attestation device */ + devfd = open(TDX_GUEST_DEVNAME, O_RDWR | O_SYNC); + + ASSERT_LT(0, devfd); + + /* Add size for quote header */ + quote_buf_size = sizeof(*quote_hdr) + QUOTE_SIZE; + + /* Allocate quote buffer */ + quote_buf = malloc(quote_buf_size); + ASSERT_NE(NULL, quote_buf); + + quote_hdr = (struct tdx_quote_hdr *)quote_buf; + + /* Initialize GetQuote header */ + quote_hdr->version = 1; + quote_hdr->status = GET_QUOTE_SUCCESS; + quote_hdr->in_len = TDX_REPORT_LEN; + quote_hdr->out_len = 0; + + /* Get TDREPORT data */ + ASSERT_EQ(0, get_tdreport0(devfd, &rep_req)); + + /* Fill GetQuote request */ + memcpy(quote_hdr->data, rep_req.tdreport, TDX_REPORT_LEN); + req.buf = (__u64)quote_buf; + req.len = quote_buf_size; + + ASSERT_EQ(0, ioctl(devfd, TDX_CMD_GET_QUOTE, &req)); + + /* Check whether GetQuote request is successful */ + EXPECT_EQ(0, quote_hdr->status); + + free(quote_buf); + + ASSERT_EQ(0, close(devfd)); +} + TEST_HARNESS_MAIN