/* 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; }
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; }