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_ */