Chromium Code Reviews| 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 /* A lightweight TPM command library. | 6 /* A lightweight TPM command library. |
| 7 * | 7 * |
| 8 * The general idea is that TPM commands are array of bytes whose fields are | 8 * The general idea is that TPM commands are array of bytes whose fields are |
| 9 * mostly compile-time constant. The goal is to build much of the commands at | 9 * mostly compile-time constant. The goal is to build much of the commands at |
| 10 * compile time (or build time) and change some of the fields at run time as | 10 * compile time (or build time) and change some of the fields at run time as |
| 11 * needed. The code in generator.c builds structures containing the commands, | 11 * needed. The code in generator.c builds structures containing the commands, |
| 12 * as well as the offsets of the fields that need to be set at run time. | 12 * as well as the offsets of the fields that need to be set at run time. |
| 13 */ | 13 */ |
| 14 | 14 |
| 15 #include "tlcl.h" | 15 #include "tlcl.h" |
| 16 | 16 |
| 17 #include <errno.h> | 17 #include <errno.h> |
| 18 #include <fcntl.h> | 18 #include <fcntl.h> |
| 19 #include <string.h> | 19 #include <string.h> |
| 20 #include <sys/time.h> | |
| 20 #include <sys/types.h> | 21 #include <sys/types.h> |
| 21 #include <sys/stat.h> | 22 #include <sys/stat.h> |
| 22 #include <tss/tcs.h> | 23 #include <tss/tcs.h> |
| 23 #include <unistd.h> | 24 #include <unistd.h> |
| 24 | 25 |
| 25 #include "structures.h" | 26 #include "structures.h" |
| 26 #include "tlcl_internal.h" | 27 #include "tlcl_internal.h" |
| 27 #if USE_TPM_EMULATOR | 28 #if USE_TPM_EMULATOR |
| 28 #include "tpmemu.h" | 29 #include "tpmemu.h" |
| 29 #endif | 30 #endif |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 | 128 |
| 128 /* Sends a request and receive a response. | 129 /* Sends a request and receive a response. |
| 129 */ | 130 */ |
| 130 static void SendReceive(uint8_t* request, uint8_t* response, int max_length) { | 131 static void SendReceive(uint8_t* request, uint8_t* response, int max_length) { |
| 131 uint32_t response_length = max_length; | 132 uint32_t response_length = max_length; |
| 132 int tag, response_tag; | 133 int tag, response_tag; |
| 133 | 134 |
| 134 #if USE_TPM_EMULATOR | 135 #if USE_TPM_EMULATOR |
| 135 tpmemu_execute(request, TpmCommandSize(request), response, &response_length); | 136 tpmemu_execute(request, TpmCommandSize(request), response, &response_length); |
| 136 #else | 137 #else |
| 138 struct timeval before, after; | |
| 139 gettimeofday(&before, NULL); | |
|
gauravsh
2010/03/13 00:47:47
For better precision I would recommend using clock
| |
| 137 TpmExecute(request, TpmCommandSize(request), response, &response_length); | 140 TpmExecute(request, TpmCommandSize(request), response, &response_length); |
| 141 gettimeofday(&after, NULL); | |
| 138 #endif | 142 #endif |
| 139 | 143 |
| 140 { | 144 { |
| 141 int x = TpmCommandSize(request); | 145 int x = TpmCommandSize(request); |
| 142 int y = response_length; | 146 int y = response_length; |
| 143 printf("request (%d bytes): ", x); | 147 printf("request (%d bytes): ", x); |
| 144 PrintBytes(request, 10); | 148 PrintBytes(request, 10); |
| 145 PrintBytes(request + 10, x - 10); | 149 PrintBytes(request + 10, x - 10); |
| 146 printf("response (%d bytes): ", y); | 150 printf("response (%d bytes): ", y); |
| 147 PrintBytes(response, 10); | 151 PrintBytes(response, 10); |
| 148 PrintBytes(response + 10, y - 10); | 152 PrintBytes(response + 10, y - 10); |
| 153 printf("execution time: %dms\n", | |
| 154 (int) ((after.tv_sec - before.tv_sec) * 1000 + | |
| 155 (after.tv_usec - before.tv_usec) / 1000)); | |
| 149 } | 156 } |
| 150 | 157 |
| 151 /* sanity checks */ | 158 /* sanity checks */ |
| 152 tag = TpmTag(request); | 159 tag = TpmTag(request); |
| 153 response_tag = TpmTag(response); | 160 response_tag = TpmTag(response); |
| 154 assert( | 161 assert( |
| 155 (tag == TPM_TAG_RQU_COMMAND && | 162 (tag == TPM_TAG_RQU_COMMAND && |
| 156 response_tag == TPM_TAG_RSP_COMMAND) || | 163 response_tag == TPM_TAG_RSP_COMMAND) || |
| 157 (tag == TPM_TAG_RQU_AUTH1_COMMAND && | 164 (tag == TPM_TAG_RQU_AUTH1_COMMAND && |
| 158 response_tag == TPM_TAG_RSP_AUTH1_COMMAND) || | 165 response_tag == TPM_TAG_RSP_AUTH1_COMMAND) || |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 259 TlclDefineSpace(TPM_NV_INDEX_LOCK, 0, 0); | 266 TlclDefineSpace(TPM_NV_INDEX_LOCK, 0, 0); |
| 260 } | 267 } |
| 261 | 268 |
| 262 int TlclIsOwned(void) { | 269 int TlclIsOwned(void) { |
| 263 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE + TPM_PUBEK_SIZE]; | 270 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE + TPM_PUBEK_SIZE]; |
| 264 uint32_t result; | 271 uint32_t result; |
| 265 SendReceive(tpm_readpubek_cmd.buffer, response, sizeof(response)); | 272 SendReceive(tpm_readpubek_cmd.buffer, response, sizeof(response)); |
| 266 result = TpmReturnCode(response); | 273 result = TpmReturnCode(response); |
| 267 return (result != TPM_SUCCESS); | 274 return (result != TPM_SUCCESS); |
| 268 } | 275 } |
| OLD | NEW |