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-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#ifdef TSS_BUILD_TRANSPORT 25TSS_RESULT 26Transport_CreateMaintenanceArchive(TSS_HCONTEXT tspContext, /* in */ 27 TSS_BOOL generateRandom, /* in */ 28 TPM_AUTH * ownerAuth, /* in, out */ 29 UINT32 * randomSize, /* out */ 30 BYTE ** random, /* out */ 31 UINT32 * archiveSize, /* out */ 32 BYTE ** archive) /* out */ 33{ 34 UINT64 offset; 35 TSS_RESULT result; 36 UINT32 handlesLen = 0, decLen; 37 BYTE *dec; 38 39 if ((result = obj_context_transport_init(tspContext))) 40 return result; 41 42 LogDebugFn("Executing in a transport session"); 43 44 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_CreateMaintenanceArchive, 45 sizeof(TSS_BOOL), (BYTE *)&generateRandom, NULL, 46 &handlesLen, NULL, ownerAuth, NULL, &decLen, 47 &dec))) 48 return result; 49 50 offset = 0; 51 Trspi_UnloadBlob_UINT32(&offset, randomSize, dec); 52 if (*randomSize > 0) { 53 if ((*random = malloc(*randomSize)) == NULL) { 54 *randomSize = 0; 55 free(dec); 56 LogError("malloc of %u bytes failed", *randomSize); 57 return TSPERR(TSS_E_OUTOFMEMORY); 58 } 59 Trspi_UnloadBlob(&offset, *randomSize, dec, *random); 60 } 61 62 Trspi_UnloadBlob_UINT32(&offset, archiveSize, dec); 63 if ((*archive = malloc(*archiveSize)) == NULL) { 64 free(*random); 65 *random = NULL; 66 *randomSize = 0; 67 free(dec); 68 LogError("malloc of %u bytes failed", *archiveSize); 69 *archiveSize = 0; 70 return TSPERR(TSS_E_OUTOFMEMORY); 71 } 72 Trspi_UnloadBlob(&offset, *archiveSize, dec, *archive); 73 free(dec); 74 75 return result; 76} 77 78TSS_RESULT 79Transport_LoadMaintenanceArchive(TSS_HCONTEXT tspContext, /* in */ 80 UINT32 dataInSize, /* in */ 81 BYTE * dataIn, /* in */ 82 TPM_AUTH * ownerAuth, /* in, out */ 83 UINT32 * dataOutSize, /* out */ 84 BYTE ** dataOut) /* out */ 85{ 86 UINT64 offset; 87 TSS_RESULT result; 88 UINT32 handlesLen = 0, decLen; 89 BYTE *dec; 90 91 92 if ((result = obj_context_transport_init(tspContext))) 93 return result; 94 95 LogDebugFn("Executing in a transport session"); 96 97 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_LoadMaintenanceArchive, 98 dataInSize, dataIn, NULL, &handlesLen, NULL, 99 ownerAuth, NULL, &decLen, &dec))) 100 return result; 101 102 offset = 0; 103 Trspi_UnloadBlob_UINT32(&offset, dataOutSize, dec); 104 105 /* sacrifice 4 bytes */ 106 *dataOut = &dec[offset]; 107 108 return result; 109} 110 111TSS_RESULT 112Transport_KillMaintenanceFeature(TSS_HCONTEXT tspContext, /* in */ 113 TPM_AUTH * ownerAuth) /* in, out */ 114{ 115 TSS_RESULT result; 116 UINT32 handlesLen = 0; 117 118 if ((result = obj_context_transport_init(tspContext))) 119 return result; 120 121 LogDebugFn("Executing in a transport session"); 122 123 return obj_context_transport_execute(tspContext, TPM_ORD_KillMaintenanceFeature, 0, NULL, 124 NULL, &handlesLen, NULL, ownerAuth, NULL, NULL, NULL); 125} 126 127TSS_RESULT 128Transport_LoadManuMaintPub(TSS_HCONTEXT tspContext, /* in */ 129 TCPA_NONCE antiReplay, /* in */ 130 UINT32 PubKeySize, /* in */ 131 BYTE * PubKey, /* in */ 132 TCPA_DIGEST * checksum) /* out */ 133{ 134 UINT64 offset; 135 TSS_RESULT result; 136 UINT32 handlesLen = 0, dataLen, decLen; 137 BYTE *data, *dec; 138 139 if ((result = obj_context_transport_init(tspContext))) 140 return result; 141 142 LogDebugFn("Executing in a transport session"); 143 144 dataLen = sizeof(TCPA_NONCE) + PubKeySize; 145 if ((data = malloc(dataLen)) == NULL) { 146 LogError("malloc of %u bytes failed", dataLen); 147 return TSPERR(TSS_E_OUTOFMEMORY); 148 } 149 150 offset = 0; 151 Trspi_LoadBlob(&offset, TPM_SHA1_160_HASH_LEN, data, antiReplay.nonce); 152 Trspi_LoadBlob(&offset, PubKeySize, data, PubKey); 153 154 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_LoadManuMaintPub, 155 dataLen, data, NULL, &handlesLen, NULL, NULL, 156 NULL, &decLen, &dec))) { 157 free(data); 158 return result; 159 } 160 free(data); 161 162 offset = 0; 163 Trspi_UnloadBlob_DIGEST(&offset, dec, checksum); 164 free(dec); 165 166 return result; 167} 168 169TSS_RESULT 170Transport_ReadManuMaintPub(TSS_HCONTEXT tspContext, /* in */ 171 TCPA_NONCE antiReplay, /* in */ 172 TCPA_DIGEST * checksum) /* out */ 173{ 174 UINT64 offset; 175 TSS_RESULT result; 176 UINT32 handlesLen = 0, decLen; 177 BYTE *dec; 178 179 if ((result = obj_context_transport_init(tspContext))) 180 return result; 181 182 LogDebugFn("Executing in a transport session"); 183 184 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_ReadManuMaintPub, 185 sizeof(TCPA_NONCE), antiReplay.nonce, NULL, 186 &handlesLen, NULL, NULL, NULL, &decLen, 187 &dec))) 188 return result; 189 190 offset = 0; 191 Trspi_UnloadBlob_DIGEST(&offset, dec, checksum); 192 free(dec); 193 194 return result; 195} 196#endif 197 198