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_DirWrite(TSS_HTPM hTPM, /* in */ 27 UINT32 ulDirIndex, /* in */ 28 UINT32 ulDirDataLength, /* in */ 29 BYTE * rgbDirData) /* in */ 30{ 31 TSS_HCONTEXT tspContext; 32 TCPA_RESULT result; 33 TPM_AUTH auth; 34 TCPA_DIGEST hashDigest; 35 TSS_HPOLICY hPolicy; 36 TCPA_DIRVALUE dirValue = { { 0 } }; 37 Trspi_HashCtx hashCtx; 38 39 if (rgbDirData == NULL || ulDirDataLength == 0) 40 return TSPERR(TSS_E_BAD_PARAMETER); 41 42 if (ulDirDataLength > (UINT32)sizeof(TCPA_DIRVALUE)) 43 return TSPERR(TSS_E_BAD_PARAMETER); 44 45 if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) 46 return result; 47 48 if ((result = obj_tpm_get_policy(hTPM, TSS_POLICY_USAGE, &hPolicy))) 49 return result; 50 51 memcpy((BYTE *)&dirValue, rgbDirData, ulDirDataLength); 52 53 /* hash to be used for the OIAP calc */ 54 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 55 result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_DirWriteAuth); 56 result |= Trspi_Hash_UINT32(&hashCtx, ulDirIndex); 57 result |= Trspi_HashUpdate(&hashCtx, (UINT32)sizeof(TCPA_DIRVALUE), (BYTE *)&dirValue); 58 if ((result |= Trspi_HashFinal(&hashCtx, hashDigest.digest))) 59 return result; 60 61 /* hashDigest now has the hash result */ 62 if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_DirWriteAuth, hPolicy, FALSE, 63 &hashDigest, &auth))) 64 return result; 65 66 if ((result = TCS_API(tspContext)->DirWriteAuth(tspContext, ulDirIndex, &dirValue, &auth))) 67 return result; 68 69 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 70 result |= Trspi_Hash_UINT32(&hashCtx, result); 71 result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_DirWriteAuth); 72 if ((result |= Trspi_HashFinal(&hashCtx, hashDigest.digest))) 73 return result; 74 75 return obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth); 76} 77 78TSS_RESULT 79Tspi_TPM_DirRead(TSS_HTPM hTPM, /* in */ 80 UINT32 ulDirIndex, /* in */ 81 UINT32 * pulDirDataLength, /* out */ 82 BYTE ** prgbDirData) /* out */ 83{ 84 TCPA_DIRVALUE dirValue; 85 TSS_RESULT result; 86 TSS_HCONTEXT tspContext; 87 88 if (pulDirDataLength == NULL || prgbDirData == NULL) 89 return TSPERR(TSS_E_BAD_PARAMETER); 90 91 if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) 92 return result; 93 94 if ((result = TCS_API(tspContext)->DirRead(tspContext, ulDirIndex, &dirValue))) 95 return result; 96 97 *pulDirDataLength = 20; 98 *prgbDirData = calloc_tspi(tspContext, *pulDirDataLength); 99 if (*prgbDirData == NULL) { 100 LogError("malloc of %d bytes failed.", *pulDirDataLength); 101 return TSPERR(TSS_E_OUTOFMEMORY); 102 } 103 memcpy(*prgbDirData, dirValue.digest, *pulDirDataLength); 104 return TSS_SUCCESS; 105} 106