Index: tpm/tpm_data.c |
diff --git a/tpm/tpm_data.c b/tpm/tpm_data.c |
index afff328f75cd45639a9bc4e1df87cee827e55eed..50c969707782990ff9af1bfa48cdce54d8f9884a 100644 |
--- a/tpm/tpm_data.c |
+++ b/tpm/tpm_data.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,15 +11,22 @@ |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
- * $Id$ |
+ * $Id: tpm_data.c 372 2010-02-15 12:52:00Z mast $ |
*/ |
#include "tpm_emulator.h" |
#include "tpm_structures.h" |
#include "tpm_marshalling.h" |
+#include "tpm_commands.h" |
#include "tpm_data.h" |
TPM_DATA tpmData; |
+UINT32 tpmConf; |
+ |
+#ifdef MTM_EMULATOR |
+#include "mtm/mtm_data.h" |
+#include "mtm/mtm_marshalling.h" |
+#endif |
static TPM_VERSION tpm_version = { 1, 2, VERSION_MAJOR, VERSION_MINOR }; |
@@ -72,7 +78,6 @@ static void init_timeouts(void) |
void tpm_init_data(void) |
{ |
-#ifndef TPM_GENERATE_EK |
/* endorsement key */ |
uint8_t ek_n[] = "\xa8\xdb\xa9\x42\xa8\xf3\xb8\x06\x85\x90\x76\x93\xad\xf7" |
"\x74\xec\x3f\xd3\x3d\x9d\xe8\x2e\xff\x15\xed\x0e\xce\x5f\x93" |
@@ -111,7 +116,6 @@ void tpm_init_data(void) |
"\xd1\xc0\x8b\x5b\xa2\x2e\xa7\x15\xca\x50\x75\x10\x48\x9c\x2b" |
"\x18\xb9\x67\x8f\x5d\x64\xc3\x28\x9f\x2f\x16\x2f\x08\xda\x47" |
"\xec\x86\x43\x0c\x80\x99\x07\x34\x0f"; |
-#endif |
int i; |
info("initializing TPM data to default values"); |
/* reset all data to NULL, FALSE or 0 */ |
@@ -150,44 +154,40 @@ void tpm_init_data(void) |
for (i = 24; i < TPM_NUM_PCR; i++) { |
init_pcr_attr(i, TRUE, 0x00, 0x00); |
} |
-#ifdef TPM_GENERATE_EK |
- /* generate a new endorsement key */ |
- tpm_rsa_generate_key(&tpmData.permanent.data.endorsementKey, 2048); |
-#else |
- /* setup endorsement key */ |
- tpm_rsa_import_key(&tpmData.permanent.data.endorsementKey, |
- RSA_MSB_FIRST, ek_n, 256, ek_e, 3, ek_p, ek_q); |
-#endif |
-#ifdef TPM_GENERATE_SEED_DAA |
- /* generate the DAA seed */ |
- tpm_get_random_bytes(tpmData.permanent.data.tpmDAASeed.nonce, |
- sizeof(tpmData.permanent.data.tpmDAASeed.nonce)); |
-#else |
- /* setup DAA seed */ |
- memcpy(tpmData.permanent.data.tpmDAASeed.nonce, |
- "\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" |
- "\x00\x00\x00\x77", sizeof(TPM_NONCE)); |
-#endif |
+ if (tpmConf & TPM_CONF_GENERATE_EK) { |
+ /* generate a new endorsement key */ |
+ tpm_rsa_generate_key(&tpmData.permanent.data.endorsementKey, 2048); |
+ } else { |
+ /* setup endorsement key */ |
+ tpm_rsa_import_key(&tpmData.permanent.data.endorsementKey, |
+ RSA_MSB_FIRST, ek_n, 256, ek_e, 3, ek_p, ek_q); |
+ } |
+ if (tpmConf & TPM_CONF_GENERATE_SEED_DAA) { |
+ /* generate the DAA seed */ |
+ tpm_get_random_bytes(tpmData.permanent.data.tpmDAASeed.nonce, |
+ sizeof(tpmData.permanent.data.tpmDAASeed.nonce)); |
+ } else { |
+ /* setup DAA seed */ |
+ memcpy(tpmData.permanent.data.tpmDAASeed.nonce, |
+ "\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" |
+ "\x00\x00\x00\x77", sizeof(TPM_NONCE)); |
+ } |
memcpy(tpmData.permanent.data.ekReset.nonce, "\xde\xad\xbe\xef", 4); |
/* initialize predefined non-volatile storage */ |
init_nv_storage(); |
/* set the timeout and duration values */ |
init_timeouts(); |
+#ifdef MTM_EMULATOR |
+ mtm_init_data(); |
+#endif |
} |
void tpm_release_data(void) |
{ |
- unsigned int i; |
- /* release the EK, SRK as well as all other rsa keys */ |
- if (tpmData.permanent.data.endorsementKey.size > 0) |
- tpm_rsa_release_private_key(&tpmData.permanent.data.endorsementKey); |
- if (tpmData.permanent.data.srk.payload) |
- free_TPM_KEY_DATA(tpmData.permanent.data.srk); |
- if (tpmData.permanent.data.manuMaintPub.valid) |
- free_TPM_PUBKEY_DATA(tpmData.permanent.data.manuMaintPub); |
- for (i = 0; i < TPM_MAX_KEYS; i++) |
- if (tpmData.permanent.data.keys[i].payload) |
- free_TPM_KEY_DATA(tpmData.permanent.data.keys[i]); |
+ free_TPM_DATA(tpmData); |
+#ifdef MTM_EMULATOR |
+ free_MTM_DATA(mtmData); |
+#endif |
} |
int tpm_store_permanent_data(void) |
@@ -198,22 +198,21 @@ int tpm_store_permanent_data(void) |
/* marshal data */ |
buf_length = len = sizeof_TPM_VERSION(tpmData.permanent.data.version) |
- + sizeof_TPM_PERMANENT_FLAGS(tpmData.permanent.flags) + 2 |
- + sizeof_TPM_PERMANENT_DATA(&tpmData.permanent.data) |
- + sizeof_TPM_STCLEAR_FLAGS(tpmData.stclear.flags) |
- + sizeof_TPM_STCLEAR_DATA(tpmData.stclear.data) |
- + sizeof_TPM_STANY_DATA(tpmData.stany.data); |
+#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) |
- || tpm_marshal_TPM_PERMANENT_FLAGS(&ptr, &len, &tpmData.permanent.flags) |
- || tpm_marshal_BOOL(&ptr, &len, tpmData.permanent.flags.selfTestSucceeded) |
- || tpm_marshal_BOOL(&ptr, &len, tpmData.permanent.flags.owned) |
- || tpm_marshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data) |
- || tpm_marshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags) |
- || tpm_marshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data) |
- || tpm_marshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data)) { |
+#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; |
} |
@@ -240,13 +239,10 @@ int tpm_restore_permanent_data(void) |
/* unmarshal data */ |
if (tpm_unmarshal_TPM_VERSION(&ptr, &len, &ver) |
|| memcmp(&ver, &tpm_version, sizeof(TPM_VERSION)) |
- || tpm_unmarshal_TPM_PERMANENT_FLAGS(&ptr, &len, &tpmData.permanent.flags) |
- || tpm_unmarshal_BOOL(&ptr, &len, &tpmData.permanent.flags.selfTestSucceeded) |
- || tpm_unmarshal_BOOL(&ptr, &len, &tpmData.permanent.flags.owned) |
- || tpm_unmarshal_TPM_PERMANENT_DATA(&ptr, &len, &tpmData.permanent.data) |
- || tpm_unmarshal_TPM_STCLEAR_FLAGS(&ptr, &len, &tpmData.stclear.flags) |
- || tpm_unmarshal_TPM_STCLEAR_DATA(&ptr, &len, &tpmData.stclear.data) |
- || tpm_unmarshal_TPM_STANY_DATA(&ptr, &len, &tpmData.stany.data) |
+ || 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; |