Home | History | Annotate | Line # | Download | only in tspi
      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
     25 TSS_RESULT
     26 Transport_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 
     78 TSS_RESULT
     79 Transport_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 
    111 TSS_RESULT
    112 Transport_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 
    127 TSS_RESULT
    128 Transport_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 
    169 TSS_RESULT
    170 Transport_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