[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/4] vtpm: passthru requests to manager



On 03/14/2014 12:48 PM, Ian Campbell wrote:
On Wed, 2014-03-12 at 14:41 -0400, Daniel De Graaf wrote:
When sending commands to a vTPM, commands with the VTPM_TAG_REQ2 tag are
passed directly to the TPM Manager since they are used in the management
interface to the TPM Manager. The VTPM_TAG_REQ tag is translated to
TPM_TAG_RQU_COMMAND to allow access to the physical TPM for certain
ordinals (PCRRead, Extend, and GetRandom).

Is this translation sufficient to prevent other types of access getting
passed through? (I presume the intention is not to let the guest access
arbitrary pTPM functionality)

The restriction on what commands are actually passed down to the physical
TPM is handled by the TPM Manager, not the vTPM.  Currently, only three
commands are permitted for pass-through: GetRandom, PcrRead, and (only for
a suitably privileged vTPM) Extend.


Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
  stubdom/vtpm/vtpm.c | 40 +++++++++++++++++++++++++++++++++++++++-
  1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/stubdom/vtpm/vtpm.c b/stubdom/vtpm/vtpm.c
index f67de18..61982c2 100644
--- a/stubdom/vtpm/vtpm.c
+++ b/stubdom/vtpm/vtpm.c
@@ -33,6 +33,7 @@
  #include "vtpm_cmd.h"
  #include "vtpm_pcrs.h"
  #include "vtpmblk.h"
+#include "vtpm_manager.h"

  #define TPM_LOG_INFO LOG_INFO
  #define TPM_LOG_ERROR LOG_ERR
@@ -117,6 +118,40 @@ int init_random(void) {
     return 0;
  }

+int check_passthru(tpmcmd_t* tpmcmd) {
+   TPM_TAG tag;
+   UINT32 len = 10;
+   BYTE* ptr;
+   size_t size;
+
+   if(tpmcmd->req_len < 10) {
+      return false;
+   }
+
+   ptr = tpmcmd->req;
+   tpm_unmarshal_UINT16(&ptr, &len, &tag);
+
+   if (tag == VTPM_TAG_REQ2) {
+      info("VTPM passthru: %d bytes", (int)tpmcmd->req_len);
+      tpmfront_cmd(tpmfront_dev, tpmcmd->req, tpmcmd->req_len, &tpmcmd->resp, 
&size);
+      tpmcmd->resp_len = size;
+      info("VTPM passthru return: %d bytes", (int)size);
+      return true;
+   }
+
+   if (tag == VTPM_TAG_REQ) {
+      info("VTPM pTPM-cmd: %d bytes", (int)tpmcmd->req_len);
+      ptr = tpmcmd->req;
+      tpm_marshal_UINT16(&ptr, &len, TPM_TAG_RQU_COMMAND);
+      tpmfront_cmd(tpmfront_dev, tpmcmd->req, tpmcmd->req_len, &tpmcmd->resp, 
&size);
+      tpmcmd->resp_len = size;
+      info("VTPM pTPM-cmd return: %d bytes", (int)size);
+      return true;
+   }
+
+   return false;
+}
+
  int check_ordinal(tpmcmd_t* tpmcmd) {
     TPM_COMMAND_CODE ord;
     UINT32 len = 4;
@@ -209,6 +244,9 @@ static void main_loop(void) {
              error("Invalid locality (%d) for client in tpm_handle_command", 
tpmcmd->locality);
              create_error_response(tpmcmd, TPM_FAIL);
         }
+         /* Check for TPM Manager passthrough command */
+         else if(check_passthru(tpmcmd)) {
+        }
           /* Check for disabled ordinals */
           else if(!check_ordinal(tpmcmd)) {
              create_error_response(tpmcmd, TPM_BAD_ORDINAL);
@@ -231,7 +269,7 @@ static void main_loop(void) {
     }

  abort_postpcrs:
-   info("VTPM Shutting down\n");
+   info("VTPM Shutting down");

     tpm_emulator_shutdown();
  }





--
Daniel De Graaf
National Security Agency

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.