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. 2007 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 25 #ifdef TSS_BUILD_TRANSPORT 26 TSS_RESULT 27 Transport_SelfTestFull(TSS_HCONTEXT tspContext) 28 { 29 TSS_RESULT result; 30 TCS_HANDLE handlesLen = 0; 31 32 if ((result = obj_context_transport_init(tspContext))) 33 return result; 34 35 LogDebugFn("Executing in a transport session"); 36 37 return obj_context_transport_execute(tspContext, TPM_ORD_SelfTestFull, 0, NULL, NULL, 38 &handlesLen, NULL, NULL, NULL, NULL, NULL); 39 } 40 41 TSS_RESULT 42 Transport_CertifySelfTest(TSS_HCONTEXT tspContext, /* in */ 43 TCS_KEY_HANDLE keyHandle, /* in */ 44 TCPA_NONCE antiReplay, /* in */ 45 TPM_AUTH * privAuth, /* in, out */ 46 UINT32 * sigSize, /* out */ 47 BYTE ** sig) /* out */ 48 { 49 TSS_RESULT result; 50 UINT32 handlesLen, decLen = 0; 51 BYTE *dec = NULL; 52 UINT64 offset; 53 TPM_DIGEST pubKeyHash; 54 Trspi_HashCtx hashCtx; 55 TCS_HANDLE *handles, handle; 56 57 if ((result = obj_context_transport_init(tspContext))) 58 return result; 59 60 if ((result = obj_tcskey_get_pubkeyhash(keyHandle, pubKeyHash.digest))) 61 return result; 62 63 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 64 result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest); 65 if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest))) 66 return result; 67 68 handlesLen = 1; 69 handle = keyHandle; 70 handles = &handle; 71 72 LogDebugFn("Executing in a transport session"); 73 74 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_CertifySelfTest, 75 sizeof(TCPA_NONCE), antiReplay.nonce, 76 &pubKeyHash, &handlesLen, &handles, privAuth, 77 NULL, &decLen, &dec))) 78 return result; 79 80 offset = 0; 81 Trspi_UnloadBlob_UINT32(&offset, sigSize, dec); 82 83 if ((*sig = malloc(*sigSize)) == NULL) { 84 free(dec); 85 LogError("malloc of %u bytes failed", *sigSize); 86 *sigSize = 0; 87 return TSPERR(TSS_E_OUTOFMEMORY); 88 } 89 Trspi_UnloadBlob(&offset, *sigSize, dec, *sig); 90 91 free(dec); 92 93 return result; 94 } 95 96 TSS_RESULT 97 Transport_GetTestResult(TSS_HCONTEXT tspContext, /* in */ 98 UINT32 * outDataSize, /* out */ 99 BYTE ** outData) /* out */ 100 { 101 TSS_RESULT result; 102 UINT32 decLen = 0; 103 BYTE *dec = NULL; 104 UINT64 offset; 105 TCS_HANDLE handlesLen = 0; 106 107 if ((result = obj_context_transport_init(tspContext))) 108 return result; 109 110 LogDebugFn("Executing in a transport session"); 111 112 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_GetTestResult, 0, NULL, 113 NULL, &handlesLen, NULL, NULL, NULL, &decLen, 114 &dec))) 115 return result; 116 117 offset = 0; 118 Trspi_UnloadBlob_UINT32(&offset, outDataSize, dec); 119 120 if ((*outData = malloc(*outDataSize)) == NULL) { 121 free(dec); 122 LogError("malloc of %u bytes failed", *outDataSize); 123 *outDataSize = 0; 124 return TSPERR(TSS_E_OUTOFMEMORY); 125 } 126 Trspi_UnloadBlob(&offset, *outDataSize, dec, *outData); 127 128 free(dec); 129 130 return result; 131 } 132 #endif 133