| Index: mtm/mtm_capability.c
|
| diff --git a/mtm/mtm_capability.c b/mtm/mtm_capability.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..af7c90f772d70c7b36c1e37c888851ba0c46b67d
|
| --- /dev/null
|
| +++ b/mtm/mtm_capability.c
|
| @@ -0,0 +1,140 @@
|
| +/* Software-based Mobile Trusted Module (MTM) 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
|
| + * by the Free Software Foundation; either version 2 of the License,
|
| + * or (at your option) any later version.
|
| + *
|
| + * This module is distributed in the hope that it will be useful,
|
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| + * GNU General Public License for more details.
|
| + *
|
| + * $Id$
|
| + */
|
| +
|
| +#include "mtm_structures.h"
|
| +#include "mtm_marshalling.h"
|
| +#include "mtm_data.h"
|
| +#include "tpm/tpm_data.h"
|
| +#include "tpm/tpm_commands.h"
|
| +
|
| +static inline TPM_RESULT return_UINT32(UINT32 *respSize, BYTE **resp, UINT32 value)
|
| +{
|
| + UINT32 len = *respSize = 4;
|
| + BYTE *ptr = *resp = tpm_malloc(*respSize);
|
| + if (ptr == NULL || tpm_marshal_UINT32(&ptr, &len, value)) {
|
| + tpm_free(*resp);
|
| + return TPM_FAIL;
|
| + }
|
| + return TPM_SUCCESS;
|
| +}
|
| +
|
| +static inline TPM_RESULT return_BOOL(UINT32 *respSize, BYTE **resp, BOOL value)
|
| +{
|
| + UINT32 len = *respSize = 1;
|
| + BYTE *ptr = *resp = tpm_malloc(*respSize);
|
| + if (ptr == NULL || tpm_marshal_BOOL(&ptr, &len, value)) {
|
| + tpm_free(*resp);
|
| + return TPM_FAIL;
|
| + }
|
| + return TPM_SUCCESS;
|
| +}
|
| +
|
| +#define return_BYTE return_BOOL
|
| +
|
| +static TPM_RESULT cap_ord(UINT32 subCapSize, BYTE *subCap,
|
| + UINT32 *respSize, BYTE **resp)
|
| +{
|
| + TPM_COMMAND_CODE ord;
|
| + if (tpm_unmarshal_TPM_COMMAND_CODE(&subCap, &subCapSize, &ord))
|
| + return TPM_BAD_MODE;
|
| + switch (ord) {
|
| + case MTM_ORD_InstallRIM:
|
| + case MTM_ORD_LoadVerificationKey:
|
| + case MTM_ORD_LoadVerificationRootKeyDisable:
|
| + case MTM_ORD_VerifyRIMCert:
|
| + case MTM_ORD_VerifyRIMCertAndExtend:
|
| + case MTM_ORD_IncrementBootstrapCounter:
|
| + case MTM_ORD_SetVerifiedPCRSelection:
|
| + return return_BOOL(respSize, resp, TRUE);
|
| + default:
|
| + return return_BOOL(respSize, resp, FALSE);
|
| + }
|
| +}
|
| +
|
| +static TPM_RESULT cap_mtm_permanent_data(UINT32 subCapSize, BYTE *subCap,
|
| + UINT32 *respSize, BYTE **resp)
|
| +{
|
| + UINT32 subCapVal, len;
|
| + BYTE* ptr;
|
| +
|
| +/* unmarshal subCap */
|
| + if (tpm_unmarshal_UINT32(&subCap, &subCapSize, &subCapVal) != 0)
|
| + return TPM_BAD_PARAMETER;
|
| + switch (subCapVal) {
|
| +
|
| + case 1:
|
| + return TPM_FAIL;
|
| + break;
|
| +
|
| + case 2:
|
| + *respSize = len = sizeof_TPM_PCR_SELECTION(mtmData.permanent.data.verifiedPCRs);
|
| + *resp = ptr = tpm_malloc(*respSize);
|
| + if (*resp == NULL
|
| + || tpm_marshal_TPM_PCR_SELECTION(&ptr, &len, &mtmData.permanent.data.verifiedPCRs)) {
|
| + tpm_free(*resp);
|
| + return TPM_FAIL;
|
| + }
|
| +
|
| + case 3:
|
| + return return_UINT32(respSize, resp,
|
| + tpmData.permanent.data.counters[MTM_COUNTER_SELECT_BOOTSTRAP].counter);
|
| +
|
| + case 4:
|
| + return return_UINT32(respSize, resp, mtmData.permanent.data.counterRimProtectId);
|
| +
|
| + case 5:
|
| + return return_UINT32(respSize, resp, mtmData.permanent.data.counterStorageProtectId);
|
| +
|
| + case 6:
|
| + return return_BYTE(respSize, resp, mtmData.permanent.data.specMajor);
|
| +
|
| + case 7:
|
| + return return_BYTE(respSize, resp, mtmData.permanent.data.specMinor);
|
| +
|
| + case 8:
|
| + return return_BYTE(respSize, resp, mtmData.permanent.data.loadVerificationKeyMethods);
|
| +
|
| + default:
|
| + return TPM_BAD_PARAMETER;
|
| +
|
| + }
|
| + return TPM_SUCCESS;
|
| +}
|
| +
|
| +TPM_RESULT MTM_GetCapability(TPM_CAPABILITY_AREA capArea, UINT32 subCapSize,
|
| + BYTE *subCap, UINT32 *respSize, BYTE **resp)
|
| +{
|
| + info("MTM_GetCapability()");
|
| + switch (capArea) {
|
| +
|
| + case TPM_CAP_ORD:
|
| + debug("[MTM_CAP_ORD]");
|
| + TPM_RESULT res = cap_ord(subCapSize, subCap, respSize, resp);
|
| + if (res == TPM_SUCCESS && resp[0] == FALSE) {
|
| + res = TPM_GetCapability(capArea, subCapSize, subCap, respSize, resp);
|
| + }
|
| + return res;
|
| +
|
| + case TPM_CAP_MTM_PERMANENT_DATA:
|
| + debug("[TPM_CAP_MTM_PERMANENT_DATA]");
|
| + return cap_mtm_permanent_data(subCapSize, subCap, respSize, resp);
|
| +
|
| + default:
|
| + return TPM_GetCapability(capArea, subCapSize, subCap, respSize, resp);
|
| +
|
| + }
|
| +}
|
| +
|
|
|