| Index: tpm/tpm_cmd_handler.c | 
| diff --git a/tpm/tpm_cmd_handler.c b/tpm/tpm_cmd_handler.c | 
| index b36d2e955c0f3af33f24474b0d0027bd46152afe..8768151298e381db8fdb52e393faa1a878c68504 100644 | 
| --- a/tpm/tpm_cmd_handler.c | 
| +++ b/tpm/tpm_cmd_handler.c | 
| @@ -1,6 +1,5 @@ | 
| -/* Software-Based Trusted Platform Module (TPM) Emulator for Linux | 
| - * Copyright (C) 2004 Mario Strasser <mast@gmx.net>, | 
| - *                    Swiss Federal Institute of Technology (ETH) Zurich | 
| +/* Software-based Trusted Platform Module (TPM) Emulator | 
| + * Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net> | 
| * | 
| * This module is free software; you can redistribute it and/or modify | 
| * it under the terms of the GNU General Public License as published | 
| @@ -12,7 +11,7 @@ | 
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| * GNU General Public License for more details. | 
| * | 
| - * $Id$ | 
| + * $Id: tpm_cmd_handler.c 377 2010-02-16 14:52:57Z mast $ | 
| */ | 
|  | 
| #include "tpm_marshalling.h" | 
| @@ -22,6 +21,10 @@ | 
| #include "tpm_data.h" | 
| #include "tpm_handles.h" | 
|  | 
| +#ifdef MTM_EMULATOR | 
| +#include "mtm/mtm_commands.h" | 
| +#endif | 
| + | 
| UINT32 tpm_get_in_param_offset(TPM_COMMAND_CODE ordinal) | 
| { | 
| switch (ordinal) { | 
| @@ -361,7 +364,11 @@ static TPM_RESULT execute_TPM_GetCapability(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| || tpm_unmarshal_BLOB(&ptr, &len, &subCap, subCapSize) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  res = MTM_GetCapability(capArea, subCapSize, subCap, &respSize, &resp); | 
| +#else | 
| res = TPM_GetCapability(capArea, subCapSize, subCap, &respSize, &resp); | 
| +#endif | 
| if (res != TPM_SUCCESS) return res; | 
| /* marshal output */ | 
| rsp->paramSize = len = 4 + respSize; | 
| @@ -1839,7 +1846,11 @@ static TPM_RESULT execute_TPM_Extend(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| || tpm_unmarshal_TPM_DIGEST(&ptr, &len, &inDigest) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  res = MTM_Extend(pcrNum, &inDigest, &outDigest); | 
| +#else | 
| res = TPM_Extend(pcrNum, &inDigest, &outDigest); | 
| +#endif | 
| if (res != TPM_SUCCESS) return res; | 
| /* marshal output */ | 
| rsp->paramSize = len = 20; | 
| @@ -1926,7 +1937,11 @@ static TPM_RESULT execute_TPM_PCR_Reset(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| if (tpm_unmarshal_TPM_PCR_SELECTION(&ptr, &len, &pcrSelection) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  return MTM_PCR_Reset(&pcrSelection); | 
| +#else | 
| return TPM_PCR_Reset(&pcrSelection); | 
| +#endif | 
| } | 
|  | 
| static TPM_RESULT execute_TPM_Quote2(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| @@ -2591,7 +2606,11 @@ static TPM_RESULT execute_TPM_FlushSpecific(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| || tpm_unmarshal_TPM_RESOURCE_TYPE(&ptr, &len, &resourceType) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  return MTM_FlushSpecific(handle, resourceType); | 
| +#else | 
| return TPM_FlushSpecific(handle, resourceType); | 
| +#endif | 
| } | 
|  | 
| static TPM_RESULT execute_TPM_GetTicks(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| @@ -2868,7 +2887,11 @@ static TPM_RESULT execute_TPM_ReleaseCounter(TPM_REQUEST *req, TPM_RESPONSE *rsp | 
| if (tpm_unmarshal_TPM_COUNT_ID(&ptr, &len, &countID) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  return MTM_ReleaseCounter(countID, &req->auth1); | 
| +#else | 
| return TPM_ReleaseCounter(countID, &req->auth1); | 
| +#endif | 
| } | 
|  | 
| static TPM_RESULT execute_TPM_ReleaseCounterOwner(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| @@ -2884,7 +2907,11 @@ static TPM_RESULT execute_TPM_ReleaseCounterOwner(TPM_REQUEST *req, TPM_RESPONSE | 
| if (tpm_unmarshal_TPM_COUNT_ID(&ptr, &len, &countID) | 
| || len != 0) return TPM_BAD_PARAMETER; | 
| /* execute command */ | 
| +#ifdef MTM_EMULATOR | 
| +  return MTM_ReleaseCounterOwner(countID, &req->auth1); | 
| +#else | 
| return TPM_ReleaseCounterOwner(countID, &req->auth1); | 
| +#endif | 
| } | 
|  | 
| static TPM_RESULT execute_TPM_DAA_Join(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| @@ -4033,6 +4060,10 @@ void tpm_execute_command(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| break; | 
|  | 
| default: | 
| +#ifdef MTM_EMULATOR | 
| +      res = mtm_execute_command(req, rsp); | 
| +      if (res != TPM_BAD_ORDINAL) break; | 
| +#endif | 
| info("The ordinal (0x%02x) was unknown or inconsistent", req->ordinal); | 
| tpm_setup_error_response(TPM_BAD_ORDINAL, rsp); | 
| return; | 
| @@ -4050,11 +4081,11 @@ void tpm_execute_command(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| info("TPM command succeeded"); | 
| rsp->size += rsp->paramSize; | 
| if (rsp->tag != TPM_TAG_RSP_COMMAND) tpm_setup_rsp_auth(req->ordinal, rsp); | 
| -#ifdef TPM_STRONG_PERSISTENCE | 
| -    if (tpm_store_permanent_data() != 0) { | 
| -      error("tpm_store_permanent_data() failed"); | 
| -    } | 
| -#endif | 
| +    if (tpmConf & TPM_CONF_STRONG_PERSISTENCE) { | 
| +      if (tpm_store_permanent_data() != 0) { | 
| +        error("tpm_store_permanent_data() failed"); | 
| +      } | 
| +    } | 
| } | 
| /* terminate authorization sessions if necessary */ | 
| if (rsp->auth1 != NULL && !rsp->auth1->continueAuthSession) | 
| @@ -4071,9 +4102,13 @@ void tpm_execute_command(TPM_REQUEST *req, TPM_RESPONSE *rsp) | 
| } | 
| } | 
|  | 
| -void tpm_emulator_init(uint32_t startup) | 
| +void tpm_emulator_init(uint32_t startup, uint32_t conf) | 
| { | 
| -  debug("tpm_emulator_init()"); | 
| +  debug("tpm_emulator_init(%d, 0x%08x)", startup, conf); | 
| +  tpmConf = conf; | 
| +#ifdef MTM_EMULATOR | 
| +  info("MTM support enabled"); | 
| +#endif | 
| /* try to restore data, if it fails use default values */ | 
| if (tpm_restore_permanent_data() != 0) tpm_init_data(); | 
| TPM_Init(startup); | 
|  |