static TPM_RESULT execute_TPM_PCRRead(TPM_REQUEST *req, TPM_RESPONSE *rsp) { BYTE *ptr; UINT32 len; TPM_PCRINDEX pcrIndex; TPM_PCRVALUE outDigest; TPM_RESULT res; /* unmarshal input */ ptr = req->param; len = req->paramSize; if (tpm_unmarshal_TPM_PCRINDEX(&ptr, &len, &pcrIndex) || len != 0) return TPM_BAD_PARAMETER; /* execute command */ res = TPM_PCRRead(pcrIndex, &outDigest); if (res != TPM_SUCCESS) return res; /* marshal output */ rsp->paramSize = len = 20; rsp->param = ptr = ExtendBuf; if (ptr == NULL || tpm_marshal_TPM_PCRVALUE(&ptr, &len, &outDigest)) { free(rsp->param); res = TPM_FAIL; } return res; }
static TPM_RESULT execute_MTM_VerifyRIMCertAndExtend(TPM_REQUEST *req, TPM_RESPONSE *rsp) { BYTE *ptr; UINT32 len; UINT32 rimCertSize; TPM_RIM_CERTIFICATE rimCert; TPM_VERIFICATION_KEY_HANDLE rimKey; TPM_PCRVALUE outDigest; TPM_RESULT res; /* compute parameter digest */ tpm_compute_in_param_digest(req); /* unmarshal input */ ptr = req->param; len = req->paramSize; if (tpm_unmarshal_UINT32(&ptr, &len, &rimCertSize) || tpm_unmarshal_TPM_RIM_CERTIFICATE(&ptr, &len, &rimCert) || tpm_unmarshal_TPM_VERIFICATION_KEY_HANDLE(&ptr, &len, &rimKey) || len != 0) return TPM_BAD_PARAMETER; /* execute command */ res = MTM_VerifyRIMCertAndExtend(&rimCert, rimKey, &outDigest); /* marshal output */ rsp->paramSize = len = 20; rsp->param = ptr = tpm_malloc(len); if (ptr == NULL || tpm_marshal_TPM_PCRVALUE(&ptr, &len, &outDigest)) { tpm_free(rsp->param); res = TPM_FAIL; } return res; }