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 |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 } | 244 } |
245 | 245 |
246 void TlclStartup(void) { | 246 void TlclStartup(void) { |
247 Send(tpm_startup_cmd.buffer); | 247 Send(tpm_startup_cmd.buffer); |
248 } | 248 } |
249 | 249 |
250 void TlclSelftestfull(void) { | 250 void TlclSelftestfull(void) { |
251 Send(tpm_selftestfull_cmd.buffer); | 251 Send(tpm_selftestfull_cmd.buffer); |
252 } | 252 } |
253 | 253 |
| 254 void TlclContinueSelfTest(void) { |
| 255 Send(tpm_continueselftest_cmd.buffer); |
| 256 } |
| 257 |
254 void TlclDefineSpace(uint32_t index, uint32_t perm, uint32_t size) { | 258 void TlclDefineSpace(uint32_t index, uint32_t perm, uint32_t size) { |
255 ToTpmUint32(tpm_nv_definespace_cmd.index, index); | 259 ToTpmUint32(tpm_nv_definespace_cmd.index, index); |
256 ToTpmUint32(tpm_nv_definespace_cmd.perm, perm); | 260 ToTpmUint32(tpm_nv_definespace_cmd.perm, perm); |
257 ToTpmUint32(tpm_nv_definespace_cmd.size, size); | 261 ToTpmUint32(tpm_nv_definespace_cmd.size, size); |
258 Send(tpm_nv_definespace_cmd.buffer); | 262 Send(tpm_nv_definespace_cmd.buffer); |
259 } | 263 } |
260 | 264 |
| 265 uint32_t TlclDefineSpaceResult(uint32_t index, uint32_t perm, uint32_t size) { |
| 266 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; |
| 267 ToTpmUint32(tpm_nv_definespace_cmd.index, index); |
| 268 ToTpmUint32(tpm_nv_definespace_cmd.perm, perm); |
| 269 ToTpmUint32(tpm_nv_definespace_cmd.size, size); |
| 270 SendReceive(tpm_nv_definespace_cmd.buffer, response, sizeof(response)); |
| 271 return TpmReturnCode(response); |
| 272 } |
| 273 |
261 uint32_t TlclWrite(uint32_t index, uint8_t* data, uint32_t length) { | 274 uint32_t TlclWrite(uint32_t index, uint8_t* data, uint32_t length) { |
262 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; | 275 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; |
263 const int total_length = | 276 const int total_length = |
264 kTpmRequestHeaderLength + kWriteInfoLength + length; | 277 kTpmRequestHeaderLength + kWriteInfoLength + length; |
265 | 278 |
266 assert(total_length <= TPM_LARGE_ENOUGH_COMMAND_SIZE); | 279 assert(total_length <= TPM_LARGE_ENOUGH_COMMAND_SIZE); |
267 SetTpmCommandSize(tpm_nv_write_cmd.buffer, total_length); | 280 SetTpmCommandSize(tpm_nv_write_cmd.buffer, total_length); |
268 | 281 |
269 ToTpmUint32(tpm_nv_write_cmd.index, index); | 282 ToTpmUint32(tpm_nv_write_cmd.index, index); |
270 ToTpmUint32(tpm_nv_write_cmd.length, length); | 283 ToTpmUint32(tpm_nv_write_cmd.length, length); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 void TlclReadLock(uint32_t index) { | 318 void TlclReadLock(uint32_t index) { |
306 if (TlclRead(index, NULL, 0) != TPM_SUCCESS) { | 319 if (TlclRead(index, NULL, 0) != TPM_SUCCESS) { |
307 error("failed to read lock space 0x%x\n", index); | 320 error("failed to read lock space 0x%x\n", index); |
308 } | 321 } |
309 } | 322 } |
310 | 323 |
311 void TlclAssertPhysicalPresence(void) { | 324 void TlclAssertPhysicalPresence(void) { |
312 Send(tpm_ppassert_cmd.buffer); | 325 Send(tpm_ppassert_cmd.buffer); |
313 } | 326 } |
314 | 327 |
| 328 uint32_t TlclAssertPhysicalPresenceResult(void) { |
| 329 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; |
| 330 SendReceive(tpm_ppassert_cmd.buffer, response, sizeof(response)); |
| 331 return TpmReturnCode(response); |
| 332 } |
| 333 |
315 uint32_t TlclLockPhysicalPresence(void) { | 334 uint32_t TlclLockPhysicalPresence(void) { |
316 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; | 335 uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; |
317 SendReceive(tpm_pplock_cmd.buffer, response, sizeof(response)); | 336 SendReceive(tpm_pplock_cmd.buffer, response, sizeof(response)); |
318 return TpmReturnCode(response); | 337 return TpmReturnCode(response); |
319 } | 338 } |
320 | 339 |
321 void TlclSetNvLocked(void) { | 340 void TlclSetNvLocked(void) { |
322 TlclDefineSpace(TPM_NV_INDEX_LOCK, 0, 0); | 341 TlclDefineSpace(TPM_NV_INDEX_LOCK, 0, 0); |
323 } | 342 } |
324 | 343 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 (TPM_PERMANENT_FLAGS*) (response + kTpmResponseHeaderLength + sizeof(size)); | 390 (TPM_PERMANENT_FLAGS*) (response + kTpmResponseHeaderLength + sizeof(size)); |
372 *disable = pflags->disable; | 391 *disable = pflags->disable; |
373 *deactivated = pflags->deactivated; | 392 *deactivated = pflags->deactivated; |
374 return result; | 393 return result; |
375 } | 394 } |
376 | 395 |
377 uint32_t TlclSetGlobalLock(void) { | 396 uint32_t TlclSetGlobalLock(void) { |
378 uint32_t x; | 397 uint32_t x; |
379 return TlclWrite(TPM_NV_INDEX0, (uint8_t*) &x, 0); | 398 return TlclWrite(TPM_NV_INDEX0, (uint8_t*) &x, 0); |
380 } | 399 } |
| 400 |
| 401 uint32_t TlclExtend(int pcr_num, uint8_t* in_digest, uint8_t* out_digest) { |
| 402 uint8_t response[kTpmResponseHeaderLength + kPcrDigestLength]; |
| 403 ToTpmUint32(tpm_extend_cmd.pcrNum, pcr_num); |
| 404 memcpy(tpm_extend_cmd.inDigest, in_digest, kPcrDigestLength); |
| 405 SendReceive(tpm_extend_cmd.buffer, response, sizeof(response)); |
| 406 memcpy(out_digest, response + kTpmResponseHeaderLength, kPcrDigestLength); |
| 407 return TpmReturnCode(response); |
| 408 } |
OLD | NEW |