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. 2004-2006
      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_ChangeAuth(struct tcsd_thread_data *data)
     32 {
     33 	TCS_CONTEXT_HANDLE hContext;
     34 	TCS_KEY_HANDLE parentHandle;
     35 	TCPA_PROTOCOL_ID protocolID;
     36 	TCPA_ENCAUTH newAuth;
     37 	TCPA_ENTITY_TYPE entityType;
     38 	UINT32 encDataSize;
     39 	BYTE *encData;
     40 
     41 	TPM_AUTH ownerAuth;
     42 	TPM_AUTH entityAuth;
     43 
     44 	UINT32 outDataSize;
     45 	BYTE *outData;
     46 	TSS_RESULT result;
     47 
     48 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     49 		return TCSERR(TSS_E_INTERNAL_ERROR);
     50 
     51 	if ((result = ctx_verify_context(hContext)))
     52 		goto done;
     53 
     54 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     55 
     56 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
     57 		return TCSERR(TSS_E_INTERNAL_ERROR);
     58 	if (getData(TCSD_PACKET_TYPE_UINT16, 2, &protocolID, 0, &data->comm))
     59 		return TCSERR(TSS_E_INTERNAL_ERROR);
     60 	if (getData(TCSD_PACKET_TYPE_ENCAUTH, 3, &newAuth, 0, &data->comm))
     61 		return TCSERR(TSS_E_INTERNAL_ERROR);
     62 	if (getData(TCSD_PACKET_TYPE_UINT16, 4, &entityType, 0, &data->comm))
     63 		return TCSERR(TSS_E_INTERNAL_ERROR);
     64 	if (getData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &data->comm))
     65 		return TCSERR(TSS_E_INTERNAL_ERROR);
     66 	encData = calloc(1, encDataSize);
     67 	if (encData == NULL) {
     68 		LogError("malloc of %d bytes failed.", encDataSize);
     69 		return TCSERR(TSS_E_OUTOFMEMORY);
     70 	}
     71 	if (getData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &data->comm)) {
     72 		free(encData);
     73 		return TCSERR(TSS_E_INTERNAL_ERROR);
     74 	}
     75 	if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) {
     76 		free(encData);
     77 		return TCSERR(TSS_E_INTERNAL_ERROR);
     78 	}
     79 	if (getData(TCSD_PACKET_TYPE_AUTH, 8, &entityAuth, 0, &data->comm)) {
     80 		free(encData);
     81 		return TCSERR(TSS_E_INTERNAL_ERROR);
     82 	}
     83 
     84 	MUTEX_LOCK(tcsp_lock);
     85 
     86 	result = TCSP_ChangeAuth_Internal(hContext, parentHandle, protocolID, newAuth, entityType,
     87 					  encDataSize, encData, &ownerAuth, &entityAuth,
     88 					  &outDataSize, &outData);
     89 
     90 	MUTEX_UNLOCK(tcsp_lock);
     91 	free(encData);
     92 	if (result == TSS_SUCCESS) {
     93 		initData(&data->comm, 4);
     94 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
     95 			free(outData);
     96 			return TCSERR(TSS_E_INTERNAL_ERROR);
     97 		}
     98 		if (setData(TCSD_PACKET_TYPE_AUTH, 1, &entityAuth, 0, &data->comm)) {
     99 			free(outData);
    100 			return TCSERR(TSS_E_INTERNAL_ERROR);
    101 		}
    102 		if (setData(TCSD_PACKET_TYPE_UINT32, 2, &outDataSize, 0, &data->comm)) {
    103 			free(outData);
    104 			return TCSERR(TSS_E_INTERNAL_ERROR);
    105 		}
    106 		if (setData(TCSD_PACKET_TYPE_PBYTE, 3, outData, outDataSize, &data->comm)) {
    107 			free(outData);
    108 			return TCSERR(TSS_E_INTERNAL_ERROR);
    109 		}
    110 		free(outData);
    111 	} else
    112 done:		initData(&data->comm, 0);
    113 
    114 	data->comm.hdr.u.result = result;
    115 	return TSS_SUCCESS;
    116 }
    117 
    118 TSS_RESULT
    119 tcs_wrap_ChangeAuthOwner(struct tcsd_thread_data *data)
    120 {
    121 
    122 	TCS_CONTEXT_HANDLE hContext;
    123 	TCPA_PROTOCOL_ID protocolID;
    124 	TCPA_ENCAUTH newAuth;
    125 	TCPA_ENTITY_TYPE entityType;
    126 
    127 	TPM_AUTH ownerAuth;
    128 	TSS_RESULT result;
    129 
    130 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
    131 		return TCSERR(TSS_E_INTERNAL_ERROR);
    132 
    133 	if ((result = ctx_verify_context(hContext)))
    134 		goto done;
    135 
    136 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
    137 
    138 	if (getData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &data->comm))
    139 		return TCSERR(TSS_E_INTERNAL_ERROR);
    140 	if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &newAuth, 0, &data->comm))
    141 		return TCSERR(TSS_E_INTERNAL_ERROR);
    142 	if (getData(TCSD_PACKET_TYPE_UINT16, 3, &entityType, 0, &data->comm))
    143 		return TCSERR(TSS_E_INTERNAL_ERROR);
    144 	if (getData(TCSD_PACKET_TYPE_AUTH, 4, &ownerAuth, 0, &data->comm))
    145 		return TCSERR(TSS_E_INTERNAL_ERROR);
    146 
    147 	MUTEX_LOCK(tcsp_lock);
    148 
    149 	result = TCSP_ChangeAuthOwner_Internal(hContext, protocolID, newAuth, entityType,
    150 					       &ownerAuth);
    151 
    152 	MUTEX_UNLOCK(tcsp_lock);
    153 
    154 	if (result == TSS_SUCCESS) {
    155 		initData(&data->comm, 1);
    156 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
    157 			return TCSERR(TSS_E_INTERNAL_ERROR);
    158 		}
    159 	} else
    160 done:		initData(&data->comm, 0);
    161 
    162 	data->comm.hdr.u.result = result;
    163 	return TSS_SUCCESS;
    164 }
    165