コード例 #1
0
/* manufacturer specific */
static TPM_RESULT cap_mfr(UINT32 *respSize, BYTE **resp)
{
  UINT32 len = *respSize = 4;
  BYTE *ptr = *resp = tpm_malloc(*respSize);
  if (ptr == NULL || tpm_marshal_TPM_VERSION(&ptr, &len, 
      &tpmData.permanent.data.version)) {
    tpm_free(*resp);
    return TPM_FAIL;
  }
  return TPM_SUCCESS;
}
コード例 #2
0
ファイル: tpm_data.c プロジェクト: Aorimn/tpm-emulator
int tpm_store_permanent_data(void)
{
  uint8_t *buf, *ptr;
  size_t buf_length;
  uint32_t len;

  /* marshal data */
  buf_length = len = sizeof_TPM_VERSION(tpmData.permanent.data.version)
#ifdef MTM_EMULATOR
                     + sizeof_TPM_DATA(tpmData) + sizeof_MTM_DATA(mtmData);
#else
                     + sizeof_TPM_DATA(tpmData);
#endif
  debug("size of permanent data: %d", buf_length);
  buf = ptr = tpm_malloc(buf_length);
  if (buf == NULL
      || tpm_marshal_TPM_VERSION(&ptr, &len, &tpmData.permanent.data.version)
#ifdef MTM_EMULATOR
      || tpm_marshal_TPM_DATA(&ptr, &len, &tpmData)
      || tpm_marshal_MTM_DATA(&ptr, &len, &mtmData)) {
#else
      || tpm_marshal_TPM_DATA(&ptr, &len, &tpmData)) {
#endif
    tpm_free(buf);
    return -1;
  }
  if (len != 0) debug("warning: buffer was too large, %d bytes left", len);
  if (tpm_write_to_storage(buf, buf_length - len)) {
    tpm_free(buf);
    return -1; 
  }
  tpm_free(buf);
  return 0;
}

int tpm_restore_permanent_data(void)
{
  uint8_t *buf, *ptr;
  size_t buf_length;
  uint32_t len;
  TPM_VERSION ver;

  /* read data */
  if (tpm_read_from_storage(&buf, &buf_length)) return -1;
  ptr = buf;
  len = buf_length;
  /* unmarshal data */
  if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver)
      || memcmp(&ver, &tpm_version, sizeof(TPM_VERSION))
      || tpm_unmarshal_TPM_DATA(&ptr, &len, &tpmData)
#ifdef MTM_EMULATOR
      || tpm_unmarshal_MTM_DATA(&ptr, &len, &mtmData)
#endif
      || len > 0) {
    tpm_free(buf);
    return -1;
  }
  tpm_free(buf);
  tpmData.permanent.flags.dataRestored = TRUE;
  return 0;
}