| OLD | NEW |
| 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 */ | 4 */ |
| 5 | 5 |
| 6 /* This program mimicks the TPM usage from read-only firmware. It exercises | 6 /* This program mimicks the TPM usage from read-only firmware. It exercises |
| 7 * the TPM functionality needed in the read-only firmware. It is meant to be | 7 * the TPM functionality needed in the read-only firmware. It is meant to be |
| 8 * integrated with the rest of the read-only firmware. It is also provided as | 8 * integrated with the rest of the read-only firmware. It is also provided as |
| 9 * a test. | 9 * a test. |
| 10 */ | 10 */ |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 | 28 |
| 29 /* This is called once at initialization time. It may be called again from | 29 /* This is called once at initialization time. It may be called again from |
| 30 * recovery mode to rebuild the spaces if something incomprehensible happened | 30 * recovery mode to rebuild the spaces if something incomprehensible happened |
| 31 * and the spaces are gone or messed up. This is called after TPM_Startup and | 31 * and the spaces are gone or messed up. This is called after TPM_Startup and |
| 32 * before the spaces are write-locked, so there is a chance that they can be | 32 * before the spaces are write-locked, so there is a chance that they can be |
| 33 * recreated (but who knows---if anything can happen, there are plenty of ways | 33 * recreated (but who knows---if anything can happen, there are plenty of ways |
| 34 * of making this FUBAR). | 34 * of making this FUBAR). |
| 35 */ | 35 */ |
| 36 void InitializeSpaces(void) { | 36 void InitializeSpaces(void) { |
| 37 uint32_t zero = 0; | 37 uint32_t zero = 0; |
| 38 uint32_t perm = TPM_NV_PER_WRITE_STCLEAR; |
| 38 | 39 |
| 40 printf("Initializing spaces\n"); |
| 39 TlclSetNvLocked(); /* useful only the first time */ | 41 TlclSetNvLocked(); /* useful only the first time */ |
| 40 | 42 |
| 41 TlclDefineSpace(INDEX0, TPM_NV_PER_WRITE_STCLEAR, 4); | 43 TlclDefineSpace(INDEX0, perm, 4); |
| 42 TlclWrite(INDEX0, (uint8_t *) &zero, 4); | 44 TlclWrite(INDEX0, (uint8_t *) &zero, 4); |
| 43 TlclDefineSpace(INDEX1, TPM_NV_PER_WRITE_STCLEAR, 4); | 45 TlclDefineSpace(INDEX1, perm, 4); |
| 44 TlclWrite(INDEX1, (uint8_t *) &zero, 4); | 46 TlclWrite(INDEX1, (uint8_t *) &zero, 4); |
| 45 TlclDefineSpace(INDEX2, TPM_NV_PER_WRITE_STCLEAR, 4); | 47 TlclDefineSpace(INDEX2, perm, 4); |
| 46 TlclWrite(INDEX2, (uint8_t *) &zero, 4); | 48 TlclWrite(INDEX2, (uint8_t *) &zero, 4); |
| 47 TlclDefineSpace(INDEX3, TPM_NV_PER_WRITE_STCLEAR, 4); | 49 TlclDefineSpace(INDEX3, perm, 4); |
| 48 TlclWrite(INDEX3, (uint8_t *) &zero, 4); | 50 TlclWrite(INDEX3, (uint8_t *) &zero, 4); |
| 49 | 51 |
| 50 TlclDefineSpace(INDEX_INITIALIZED, TPM_NV_PER_READ_STCLEAR, 1); | 52 perm = TPM_NV_PER_READ_STCLEAR | TPM_NV_PER_WRITE_STCLEAR | |
| 51 TlclReadLock(INDEX_INITIALIZED); | 53 TPM_NV_PER_PPWRITE; |
| 54 TlclDefineSpace(INDEX_INITIALIZED, perm, 1); |
| 52 } | 55 } |
| 53 | 56 |
| 54 | 57 |
| 55 void EnterRecoveryMode(void) { | 58 void EnterRecoveryMode(void) { |
| 56 printf("entering recovery mode"); | 59 printf("entering recovery mode"); |
| 57 exit(0); | 60 exit(0); |
| 58 } | 61 } |
| 59 | 62 |
| 60 | 63 |
| 61 int main(void) { | 64 int main(void) { |
| 62 uint8_t c; | 65 uint8_t c; |
| 63 uint32_t index_0, index_1, index_2, index_3; | 66 uint32_t index_0, index_1, index_2, index_3; |
| 64 | 67 |
| 65 TlclLibinit(); | 68 TlclLibinit(); |
| 66 | 69 |
| 67 #if 0 | 70 #if 0 |
| 68 TlclStartup(); | 71 TlclStartup(); |
| 69 TlclSelftestfull(); | 72 TlclSelftestfull(); |
| 70 #endif | 73 #endif |
| 71 | 74 |
| 72 TlclAssertPhysicalPresence(); | 75 TlclAssertPhysicalPresence(); |
| 73 | 76 |
| 74 /* Checks if initialization has completed. | 77 /* Checks if initialization has completed by trying to read-lock a space |
| 78 * that's created at the end of initialization. |
| 75 */ | 79 */ |
| 76 if (TlclRead(INDEX_INITIALIZED, &c, 1) != TPM_E_DISABLED_CMD) { | 80 if (TlclRead(INDEX_INITIALIZED, &c, 0) == TPM_E_BADINDEX) { |
| 77 /* The initialization did not complete. | 81 /* The initialization did not complete. |
| 78 */ | 82 */ |
| 79 InitializeSpaces(); | 83 InitializeSpaces(); |
| 80 } | 84 } |
| 81 | 85 |
| 82 /* Checks if spaces are OK or messed up. | 86 /* Checks if spaces are OK or messed up. |
| 83 */ | 87 */ |
| 84 if (TlclRead(INDEX0, (uint8_t *) &index_0, sizeof(index_0)) != TPM_SUCCESS || | 88 if (TlclRead(INDEX0, (uint8_t*) &index_0, sizeof(index_0)) != TPM_SUCCESS || |
| 85 TlclRead(INDEX1, (uint8_t *) &index_1, sizeof(index_1)) != TPM_SUCCESS || | 89 TlclRead(INDEX1, (uint8_t*) &index_1, sizeof(index_1)) != TPM_SUCCESS || |
| 86 TlclRead(INDEX2, (uint8_t *) &index_2, sizeof(index_2)) != TPM_SUCCESS || | 90 TlclRead(INDEX2, (uint8_t*) &index_2, sizeof(index_2)) != TPM_SUCCESS || |
| 87 TlclRead(INDEX3, (uint8_t *) &index_3, sizeof(index_3)) != TPM_SUCCESS) { | 91 TlclRead(INDEX3, (uint8_t*) &index_3, sizeof(index_3)) != TPM_SUCCESS) { |
| 88 EnterRecoveryMode(); | 92 EnterRecoveryMode(); |
| 89 } | 93 } |
| 90 | 94 |
| 95 /* Writes space, and locks it. Then attempts to write again. I really wish |
| 96 * I could use the imperative. |
| 97 */ |
| 98 index_0 += 1; |
| 99 if (TlclWrite(INDEX0, (uint8_t*) &index_0, sizeof(index_0) != TPM_SUCCESS)) { |
| 100 error("could not write index 0\n"); |
| 101 } |
| 102 TlclWriteLock(INDEX0); |
| 103 if (TlclWrite(INDEX0, (uint8_t*) &index_0, sizeof(index_0)) == TPM_SUCCESS) { |
| 104 error("index 0 is not locked\n"); |
| 105 } |
| 106 |
| 91 /* Done for now. | 107 /* Done for now. |
| 92 */ | 108 */ |
| 109 printf("Test completed successfully\n"); |
| 93 exit(0); | 110 exit(0); |
| 94 } | 111 } |
| 95 | |
| OLD | NEW |