1 2/* 3 * Licensed Materials - Property of IBM 4 * 5 * trousers - An open source TCG Software Stack 6 * 7 * (C) Copyright International Business Machines Corp. 2004-2006 8 * 9 */ 10 11#include <stdlib.h> 12#include <stdio.h> 13#include <string.h> 14#include <inttypes.h> 15 16#include "trousers/tss.h" 17#include "trousers/trousers.h" 18#include "trousers_types.h" 19#include "spi_utils.h" 20#include "capabilities.h" 21#include "tsplog.h" 22#include "obj.h" 23 24 25TSS_RESULT 26Tspi_TPM_GetEvent(TSS_HTPM hTPM, /* in */ 27 UINT32 ulPcrIndex, /* in */ 28 UINT32 ulEventNumber, /* in */ 29 TSS_PCR_EVENT * pPcrEvent) /* out */ 30{ 31 TSS_HCONTEXT tspContext; 32 TSS_RESULT result; 33 TSS_PCR_EVENT *event = NULL; 34 35 if (pPcrEvent == NULL) 36 return TSPERR(TSS_E_BAD_PARAMETER); 37 38 if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) 39 return result; 40 41 if ((result = RPC_GetPcrEvent(tspContext, ulPcrIndex, &ulEventNumber, &event))) 42 return result; 43 44 memcpy(pPcrEvent, event, sizeof(TSS_PCR_EVENT)); 45 free(event); 46 47 return TSS_SUCCESS; 48} 49 50TSS_RESULT 51Tspi_TPM_GetEvents(TSS_HTPM hTPM, /* in */ 52 UINT32 ulPcrIndex, /* in */ 53 UINT32 ulStartNumber, /* in */ 54 UINT32 * pulEventNumber, /* in, out */ 55 TSS_PCR_EVENT ** prgbPcrEvents) /* out */ 56{ 57 TSS_HCONTEXT tspContext; 58 TSS_RESULT result; 59 TSS_PCR_EVENT *events = NULL; 60 61 if (pulEventNumber == NULL) 62 return TSPERR(TSS_E_BAD_PARAMETER); 63 64 if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) 65 return result; 66 67 if (prgbPcrEvents) { 68 if ((result = RPC_GetPcrEventsByPcr(tspContext, ulPcrIndex, ulStartNumber, 69 pulEventNumber, &events))) 70 return result; 71 72 *prgbPcrEvents = events; 73 } else { 74 /* if the pointer to receive events is NULL, the app only 75 * wants a total number of events for this PCR. */ 76 if ((result = RPC_GetPcrEvent(tspContext, ulPcrIndex, pulEventNumber, NULL))) 77 return result; 78 } 79 80 return TSS_SUCCESS; 81} 82 83TSS_RESULT 84Tspi_TPM_GetEventLog(TSS_HTPM hTPM, /* in */ 85 UINT32 * pulEventNumber, /* out */ 86 TSS_PCR_EVENT ** prgbPcrEvents) /* out */ 87{ 88 TSS_HCONTEXT tspContext; 89 TSS_RESULT result; 90 91 if (pulEventNumber == NULL) 92 return TSPERR(TSS_E_BAD_PARAMETER); 93 94 if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) 95 return result; 96 97 /* if the pointer to receive events is NULL, the app only wants a 98 * total number of events for all PCRs. */ 99 if (prgbPcrEvents == NULL) { 100 UINT16 numPcrs = get_num_pcrs(tspContext); 101 UINT32 i, numEvents = 0; 102 103 if (numPcrs == 0) { 104 LogDebugFn("Error querying the TPM for its number of PCRs"); 105 return TSPERR(TSS_E_INTERNAL_ERROR); 106 } 107 108 *pulEventNumber = 0; 109 for (i = 0; i < numPcrs; i++) { 110 if ((result = RPC_GetPcrEvent(tspContext, i, &numEvents, NULL))) 111 return result; 112 113 *pulEventNumber += numEvents; 114 } 115 } else 116 return RPC_GetPcrEventLog(tspContext, pulEventNumber, prgbPcrEvents); 117 118 return TSS_SUCCESS; 119} 120 121