stubdom/vtpm: Support locality field

The vTPM protocol now contains a field allowing the locality of a
command to be specified; pass this to the TPM when processing a packet.
While the locality is not currently checked for validity, a binding
between locality and some distinguishing feature of the client domain
(such as the XSM label) will need to be defined in order to properly
support a multi-client vTPM.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Acked-by: Matthew Fioravante <matthew.fioravante@jhuapl.edu>
This commit is contained in:
Daniel De Graaf authored and Ian Campbell committed 2013-04-12 14:28:17 +01:00
1 parent c9e6dcb08b
commit 57c265546e
3 files changed
+52 -1

No files matched your search

+1
View File
@@ -210,6 +210,7 @@ tpm_emulator-$(XEN_TARGET_ARCH): tpm_emulator-$(TPMEMU_VERSION).tar.gz
mv tpm_emulator-$(TPMEMU_VERSION) $@ mv tpm_emulator-$(TPMEMU_VERSION) $@
patch -d $@ -p1 < tpmemu-$(TPMEMU_VERSION).patch; patch -d $@ -p1 < tpmemu-$(TPMEMU_VERSION).patch;
patch -d $@ -p1 < vtpm-bufsize.patch patch -d $@ -p1 < vtpm-bufsize.patch
patch -d $@ -p1 < vtpm-locality.patch
mkdir $@/build mkdir $@/build
cd $@/build; CC=${CC} $(CMAKE) .. -DCMAKE_C_FLAGS:STRING="-std=c99 -DTPM_NO_EXTERN $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-declaration-after-statement" cd $@/build; CC=${CC} $(CMAKE) .. -DCMAKE_C_FLAGS:STRING="-std=c99 -DTPM_NO_EXTERN $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-declaration-after-statement"
touch $@ touch $@
+50
View File
@@ -0,0 +1,50 @@
diff --git a/tpm/tpm_capability.c b/tpm/tpm_capability.c
index 60bbb90..f8f7f0f 100644
--- a/tpm/tpm_capability.c
+++ b/tpm/tpm_capability.c
@@ -949,6 +949,8 @@ static TPM_RESULT set_vendor(UINT32 subCap, BYTE *setValue,
UINT32 setValueSize, BOOL ownerAuth,
BOOL deactivated, BOOL disabled)
{
+ if (tpmData.stany.flags.localityModifier != 8)
+ return TPM_BAD_PARAMETER;
/* set the capability area with the specified data, on failure
deactivate the TPM */
switch (subCap) {
diff --git a/tpm/tpm_cmd_handler.c b/tpm/tpm_cmd_handler.c
index 288d1ce..9e1cfb4 100644
--- a/tpm/tpm_cmd_handler.c
+++ b/tpm/tpm_cmd_handler.c
@@ -4132,7 +4132,7 @@ void tpm_emulator_shutdown()
tpm_extern_release();
}
-int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size)
+int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size, int locality)
{
TPM_REQUEST req;
TPM_RESPONSE rsp;
@@ -4140,7 +4140,9 @@ int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint3
UINT32 len;
BOOL free_out;
- debug("tpm_handle_command()");
+ debug("tpm_handle_command(%d)", locality);
+ if (locality != -1)
+ tpmData.stany.flags.localityModifier = locality;
/* we need the whole packet at once, otherwise unmarshalling will fail */
if (tpm_unmarshal_TPM_REQUEST((uint8_t**)&in, &in_size, &req) != 0) {
diff --git a/tpm/tpm_emulator.h b/tpm/tpm_emulator.h
index eed749e..4c228bd 100644
--- a/tpm/tpm_emulator.h
+++ b/tpm/tpm_emulator.h
@@ -59,7 +59,7 @@ void tpm_emulator_shutdown(void);
* its usage. In case of an error, all internally allocated memory
* is released and the the state of out and out_size is unspecified.
*/
-int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size);
+int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size, int locality);
#endif /* _TPM_EMULATOR_H_ */
+1 -1
View File
@@ -183,7 +183,7 @@ static void main_loop(void) {
} }
/* If not disabled, do the command */ /* If not disabled, do the command */
else { else {
if((res = tpm_handle_command(tpmcmd->req, tpmcmd->req_len, &tpmcmd->resp, &tpmcmd->resp_len)) != 0) { if((res = tpm_handle_command(tpmcmd->req, tpmcmd->req_len, &tpmcmd->resp, &tpmcmd->resp_len, tpmcmd->locality)) != 0) {
error("tpm_handle_command() failed"); error("tpm_handle_command() failed");
create_error_response(tpmcmd, TPM_FAIL); create_error_response(tpmcmd, TPM_FAIL);
} }
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.