Home | History | Annotate | Line # | Download | only in tcstp
      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 <syslog.h>
     14 #include <string.h>
     15 #include <netdb.h>
     16 
     17 #include "trousers/tss.h"
     18 #include "trousers_types.h"
     19 #include "tcs_tsp.h"
     20 #include "tcs_utils.h"
     21 #include "tcs_int_literals.h"
     22 #include "capabilities.h"
     23 #include "tcslog.h"
     24 #include "tcsd_wrap.h"
     25 #include "tcsd.h"
     26 #include "tcs_utils.h"
     27 #include "rpc_tcstp_tcs.h"
     28 
     29 
     30 TSS_RESULT
     31 tcs_wrap_SetOrdinalAuditStatus(struct tcsd_thread_data *data)
     32 {
     33 	TCS_CONTEXT_HANDLE hContext;
     34 	TPM_AUTH ownerAuth;
     35 	UINT32 ulOrdinal;
     36 	TSS_BOOL bAuditState;
     37 	TSS_RESULT result;
     38 
     39 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     40 		return TCSERR(TSS_E_INTERNAL_ERROR);
     41 
     42 	if ((result = ctx_verify_context(hContext)))
     43 		goto done;
     44 
     45 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     46 
     47 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &ulOrdinal, 0, &data->comm))
     48 		return TCSERR(TSS_E_INTERNAL_ERROR);
     49 
     50 	if (getData(TCSD_PACKET_TYPE_BOOL, 2, &bAuditState, 0, &data->comm))
     51 		return TCSERR(TSS_E_INTERNAL_ERROR);
     52 
     53 	if (getData(TCSD_PACKET_TYPE_AUTH, 3, &ownerAuth, 0, &data->comm))
     54 		return TCSERR(TSS_E_INTERNAL_ERROR);
     55 
     56 	MUTEX_LOCK(tcsp_lock);
     57 
     58 	result = TCSP_SetOrdinalAuditStatus_Internal(hContext, &ownerAuth, ulOrdinal, bAuditState);
     59 
     60 	MUTEX_UNLOCK(tcsp_lock);
     61 
     62 	if (result == TSS_SUCCESS) {
     63 		initData(&data->comm, 1);
     64 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm))
     65 			return TCSERR(TSS_E_INTERNAL_ERROR);
     66 	} else
     67 done:		initData(&data->comm, 0);
     68 
     69 	data->comm.hdr.u.result = result;
     70 
     71 	return TSS_SUCCESS;
     72 }
     73 
     74 TSS_RESULT
     75 tcs_wrap_GetAuditDigest(struct tcsd_thread_data *data)
     76 {
     77 	TCS_CONTEXT_HANDLE hContext;
     78 	UINT32 startOrdinal;
     79 	TPM_DIGEST auditDigest;
     80 	UINT32 counterValueSize;
     81 	BYTE *counterValue;
     82 	TSS_BOOL more;
     83 	UINT32 ordSize;
     84 	UINT32 *ordList;
     85 	TSS_RESULT result;
     86 
     87 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     88 		return TCSERR(TSS_E_INTERNAL_ERROR);
     89 
     90 	if ((result = ctx_verify_context(hContext)))
     91 		goto done;
     92 
     93 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     94 
     95 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &startOrdinal, 0, &data->comm))
     96 		return TCSERR(TSS_E_INTERNAL_ERROR);
     97 
     98 	MUTEX_LOCK(tcsp_lock);
     99 
    100 	result = TCSP_GetAuditDigest_Internal(hContext, startOrdinal, &auditDigest, &counterValueSize, &counterValue,
    101 						&more, &ordSize, &ordList);
    102 
    103 	MUTEX_UNLOCK(tcsp_lock);
    104 
    105 	if (result == TSS_SUCCESS) {
    106 		initData(&data->comm, 6);
    107 		if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &auditDigest, 0, &data->comm)) {
    108 			free(counterValue);
    109 			free(ordList);
    110 			return TCSERR(TSS_E_INTERNAL_ERROR);
    111 		}
    112 		if (setData(TCSD_PACKET_TYPE_UINT32, 1, &counterValueSize, 0, &data->comm)) {
    113 			free(counterValue);
    114 			free(ordList);
    115 			return TCSERR(TSS_E_INTERNAL_ERROR);
    116 		}
    117 		if (setData(TCSD_PACKET_TYPE_PBYTE, 2, counterValue, counterValueSize, &data->comm)) {
    118 			free(counterValue);
    119 			free(ordList);
    120 			return TCSERR(TSS_E_INTERNAL_ERROR);
    121 		}
    122 		free(counterValue);
    123 		if (setData(TCSD_PACKET_TYPE_BOOL, 3, &more, 0, &data->comm)) {
    124 			free(ordList);
    125 			return TCSERR(TSS_E_INTERNAL_ERROR);
    126 		}
    127 		if (setData(TCSD_PACKET_TYPE_UINT32, 4, &ordSize, 0, &data->comm)) {
    128 			free(ordList);
    129 			return TCSERR(TSS_E_INTERNAL_ERROR);
    130 		}
    131 		if (setData(TCSD_PACKET_TYPE_PBYTE, 5, ordList, ordSize * sizeof(UINT32), &data->comm)) {
    132 			free(ordList);
    133 			return TCSERR(TSS_E_INTERNAL_ERROR);
    134 		}
    135 		free(ordList);
    136 	} else
    137 done:		initData(&data->comm, 0);
    138 
    139 	data->comm.hdr.u.result = result;
    140 
    141 	return TSS_SUCCESS;
    142 }
    143 
    144 TSS_RESULT
    145 tcs_wrap_GetAuditDigestSigned(struct tcsd_thread_data *data)
    146 {
    147 	TCS_CONTEXT_HANDLE hContext;
    148 	TCS_KEY_HANDLE keyHandle;
    149 	TSS_BOOL closeAudit;
    150 	TPM_NONCE antiReplay;
    151 	TPM_AUTH privAuth, nullAuth, *pAuth;
    152 	UINT32 counterValueSize;
    153 	BYTE *counterValue;
    154 	TPM_DIGEST auditDigest;
    155 	TPM_DIGEST ordinalDigest;
    156 	UINT32 sigSize;
    157 	BYTE *sig;
    158 	TSS_RESULT result;
    159 	int i;
    160 
    161 	memset(&privAuth, 0, sizeof(TPM_AUTH));
    162 	memset(&nullAuth, 0, sizeof(TPM_AUTH));
    163 
    164 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    165 		return TCSERR(TSS_E_INTERNAL_ERROR);
    166 
    167 	if ((result = ctx_verify_context(hContext)))
    168 		goto done;
    169 
    170 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    171 
    172 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &keyHandle, 0, &data->comm))
    173 		return TCSERR(TSS_E_INTERNAL_ERROR);
    174 	if (getData(TCSD_PACKET_TYPE_BOOL, 2, &closeAudit, 0, &data->comm))
    175 		return TCSERR(TSS_E_INTERNAL_ERROR);
    176 	if (getData(TCSD_PACKET_TYPE_NONCE, 3, &antiReplay, 0, &data->comm))
    177 		return TCSERR(TSS_E_INTERNAL_ERROR);
    178 	if (getData(TCSD_PACKET_TYPE_AUTH, 4, &privAuth, 0, &data->comm))
    179 		return TCSERR(TSS_E_INTERNAL_ERROR);
    180 
    181 	if (memcmp(&nullAuth, &privAuth, sizeof(TPM_AUTH)))
    182 		pAuth = &privAuth;
    183 	else
    184 		pAuth = NULL;
    185 
    186 	MUTEX_LOCK(tcsp_lock);
    187 
    188 	result = TCSP_GetAuditDigestSigned_Internal(hContext, keyHandle, closeAudit, antiReplay,
    189 							pAuth, &counterValueSize, &counterValue,
    190 							&auditDigest, &ordinalDigest,
    191 							&sigSize, &sig);
    192 
    193 	MUTEX_UNLOCK(tcsp_lock);
    194 
    195 	if (result == TSS_SUCCESS) {
    196 		i = 0;
    197 		initData(&data->comm, 7);
    198 		if (pAuth) {
    199 			if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm)) {
    200 				free(counterValue);
    201 				free(sig);
    202 				return TCSERR(TSS_E_INTERNAL_ERROR);
    203 			}
    204 		}
    205 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &counterValueSize, 0, &data->comm)) {
    206 			free(counterValue);
    207 			free(sig);
    208 			return TCSERR(TSS_E_INTERNAL_ERROR);
    209 		}
    210 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, counterValue, counterValueSize, &data->comm)) {
    211 			free(counterValue);
    212 			free(sig);
    213 			return TCSERR(TSS_E_INTERNAL_ERROR);
    214 		}
    215 		free(counterValue);
    216 		if (setData(TCSD_PACKET_TYPE_DIGEST, i++, &auditDigest, 0, &data->comm)) {
    217 			free(sig);
    218 			return TCSERR(TSS_E_INTERNAL_ERROR);
    219 		}
    220 		if (setData(TCSD_PACKET_TYPE_DIGEST, i++, &ordinalDigest, 0, &data->comm)) {
    221 			free(sig);
    222 			return TCSERR(TSS_E_INTERNAL_ERROR);
    223 		}
    224 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) {
    225 			free(sig);
    226 			return TCSERR(TSS_E_INTERNAL_ERROR);
    227 		}
    228 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) {
    229 			free(sig);
    230 			return TCSERR(TSS_E_INTERNAL_ERROR);
    231 		}
    232 		free(sig);
    233 	} else
    234 done:		initData(&data->comm, 0);
    235 
    236 	data->comm.hdr.u.result = result;
    237 
    238 	return TSS_SUCCESS;
    239 }
    240