rpc_aik.c revision 1.1.1.2
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 30TSS_RESULT 31tcs_wrap_MakeIdentity(struct tcsd_thread_data *data) 32{ 33 TCS_CONTEXT_HANDLE hContext; 34 TCPA_ENCAUTH identityAuth; 35 TCPA_CHOSENID_HASH privCAHash; 36 UINT32 idKeyInfoSize; 37 BYTE *idKeyInfo = NULL; 38 39 TPM_AUTH auth1, auth2; 40 TPM_AUTH *pSRKAuth, *pOwnerAuth; 41 42 UINT32 idKeySize; 43 BYTE *idKey = NULL; 44 UINT32 pcIDBindSize; 45 BYTE *prgbIDBind = NULL; 46 UINT32 pcECSize; 47 BYTE *prgbEC = NULL; 48 UINT32 pcPlatCredSize; 49 BYTE *prgbPlatCred = NULL; 50 UINT32 pcConfCredSize; 51 BYTE *prgbConfCred = NULL; 52 TSS_RESULT result; 53 54 int i; 55 56 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 57 return TCSERR(TSS_E_INTERNAL_ERROR); 58 59 if ((result = ctx_verify_context(hContext))) 60 goto done; 61 62 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 63 64 if (getData(TCSD_PACKET_TYPE_ENCAUTH, 1, &identityAuth, 0, &data->comm)) 65 return TCSERR(TSS_E_INTERNAL_ERROR); 66 if (getData(TCSD_PACKET_TYPE_DIGEST, 2, &privCAHash, 0, &data->comm)) 67 return TCSERR(TSS_E_INTERNAL_ERROR); 68 69 if (getData(TCSD_PACKET_TYPE_UINT32, 3, &idKeyInfoSize, 0, &data->comm)) 70 return TCSERR(TSS_E_INTERNAL_ERROR); 71 idKeyInfo = (BYTE *) calloc(1, idKeyInfoSize); 72 if (idKeyInfo == NULL) { 73 LogError("malloc of %d bytes failed.", idKeyInfoSize); 74 return TCSERR(TSS_E_OUTOFMEMORY); 75 } 76 if (getData(TCSD_PACKET_TYPE_PBYTE, 4, idKeyInfo, idKeyInfoSize, &data->comm)) { 77 free(idKeyInfo); 78 return TCSERR(TSS_E_INTERNAL_ERROR); 79 } 80 if (getData(TCSD_PACKET_TYPE_AUTH, 5, &auth1, 0, &data->comm)) { 81 free(idKeyInfo); 82 return TCSERR(TSS_E_INTERNAL_ERROR); 83 } 84 85 result = getData(TCSD_PACKET_TYPE_AUTH, 6, &auth2, 0, &data->comm); 86 if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) { 87 pOwnerAuth = &auth1; 88 pSRKAuth = NULL; 89 } else if (result) { 90 free(idKeyInfo); 91 return result; 92 } else { 93 pOwnerAuth = &auth2; 94 pSRKAuth = &auth1; 95 } 96 97 MUTEX_LOCK(tcsp_lock); 98 99 result = TCSP_MakeIdentity_Internal(hContext, identityAuth, privCAHash, 100 idKeyInfoSize, idKeyInfo, pSRKAuth, 101 pOwnerAuth, &idKeySize, &idKey, 102 &pcIDBindSize, &prgbIDBind, &pcECSize, 103 &prgbEC, &pcPlatCredSize, &prgbPlatCred, 104 &pcConfCredSize, &prgbConfCred); 105 106 MUTEX_UNLOCK(tcsp_lock); 107 free(idKeyInfo); 108 109 if (result == TSS_SUCCESS) { 110 i = 0; 111 initData(&data->comm, 12); 112 if (pSRKAuth) { 113 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pSRKAuth, 0, &data->comm)) 114 goto internal_error; 115 } 116 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm)) 117 goto internal_error; 118 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &idKeySize, 0, &data->comm)) 119 goto internal_error; 120 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, idKey, idKeySize, &data->comm)) 121 goto internal_error; 122 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcIDBindSize, 0, &data->comm)) 123 goto internal_error; 124 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbIDBind, pcIDBindSize, &data->comm)) 125 goto internal_error; 126 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcECSize, 0, &data->comm)) 127 goto internal_error; 128 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbEC, pcECSize, &data->comm)) 129 goto internal_error; 130 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcPlatCredSize, 0, &data->comm)) 131 goto internal_error; 132 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbPlatCred, pcPlatCredSize, &data->comm)) 133 goto internal_error; 134 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcConfCredSize, 0, &data->comm)) 135 goto internal_error; 136 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbConfCred, pcConfCredSize, &data->comm)) 137 goto internal_error; 138 139 free(idKey); 140 free(prgbIDBind); 141 free(prgbEC); 142 free(prgbPlatCred); 143 free(prgbConfCred); 144 } else 145done: initData(&data->comm, 0); 146 147 data->comm.hdr.u.result = result; 148 149 return TSS_SUCCESS; 150 151internal_error: 152 free(idKey); 153 free(prgbIDBind); 154 free(prgbEC); 155 free(prgbPlatCred); 156 free(prgbConfCred); 157 return TCSERR(TSS_E_INTERNAL_ERROR); 158} 159 160TSS_RESULT 161tcs_wrap_ActivateIdentity(struct tcsd_thread_data *data) 162{ 163 TCS_CONTEXT_HANDLE hContext; 164 TCS_KEY_HANDLE idKeyHandle; 165 TPM_AUTH *pIdKeyAuth = NULL, *pOwnerAuth = NULL, auth1, auth2; 166 UINT32 SymmetricKeySize, blobSize; 167 BYTE *SymmetricKey, *blob; 168 TSS_RESULT result; 169 UINT32 i; 170 171 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 172 return TCSERR(TSS_E_INTERNAL_ERROR); 173 174 if ((result = ctx_verify_context(hContext))) 175 goto done; 176 177 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 178 179 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &idKeyHandle, 0, &data->comm)) 180 return TCSERR(TSS_E_INTERNAL_ERROR); 181 if (getData(TCSD_PACKET_TYPE_UINT32, 2, &blobSize, 0, &data->comm)) 182 return TCSERR(TSS_E_INTERNAL_ERROR); 183 184 if ((blob = malloc(blobSize)) == NULL) 185 return TCSERR(TSS_E_OUTOFMEMORY); 186 187 if (getData(TCSD_PACKET_TYPE_PBYTE, 3, blob, blobSize, &data->comm)) { 188 free(blob); 189 return TCSERR(TSS_E_INTERNAL_ERROR); 190 } 191 192 if (getData(TCSD_PACKET_TYPE_AUTH, 4, &auth1, 0, &data->comm)) { 193 free(blob); 194 return TCSERR(TSS_E_INTERNAL_ERROR); 195 } 196 197 result = getData(TCSD_PACKET_TYPE_AUTH, 5, &auth2, 0, &data->comm); 198 if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) 199 pOwnerAuth = &auth1; 200 else if (result) { 201 free(blob); 202 return result; 203 } else { 204 pIdKeyAuth = &auth1; 205 pOwnerAuth = &auth2; 206 } 207 208 MUTEX_LOCK(tcsp_lock); 209 210 result = TCSP_ActivateTPMIdentity_Internal(hContext, idKeyHandle, blobSize, 211 blob, pIdKeyAuth, pOwnerAuth, 212 &SymmetricKeySize, 213 &SymmetricKey); 214 215 MUTEX_UNLOCK(tcsp_lock); 216 free(blob); 217 218 if (result == TSS_SUCCESS) { 219 i = 0; 220 initData(&data->comm, 4); 221 if (pIdKeyAuth) { 222 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pIdKeyAuth, 0, &data->comm)) { 223 free(SymmetricKey); 224 return TCSERR(TSS_E_INTERNAL_ERROR); 225 } 226 } 227 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm)) { 228 free(SymmetricKey); 229 return TCSERR(TSS_E_INTERNAL_ERROR); 230 } 231 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &SymmetricKeySize, 0, &data->comm)) { 232 free(SymmetricKey); 233 return TCSERR(TSS_E_INTERNAL_ERROR); 234 } 235 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, SymmetricKey, SymmetricKeySize, &data->comm)) { 236 free(SymmetricKey); 237 return TCSERR(TSS_E_INTERNAL_ERROR); 238 } 239 free(SymmetricKey); 240 } else 241done: initData(&data->comm, 0); 242 243 data->comm.hdr.u.result = result; 244 245 return TSS_SUCCESS; 246} 247 248#ifdef TSS_BUILD_TSS12 249TSS_RESULT 250tcs_wrap_GetCredential(struct tcsd_thread_data *data) 251{ 252 TCS_CONTEXT_HANDLE hContext; 253 UINT32 CredType; 254 UINT32 CredAccessMode; 255 UINT32 CredSize; 256 BYTE *CredData = NULL; 257 TSS_RESULT result; 258 259 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 260 return TCSERR(TSS_E_INTERNAL_ERROR); 261 262 if ((result = ctx_verify_context(hContext))) 263 goto done; 264 265 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &CredType, 0, &data->comm)) 266 return TCSERR(TSS_E_INTERNAL_ERROR); 267 268 if (getData(TCSD_PACKET_TYPE_UINT32, 2, &CredAccessMode, 0, &data->comm)) 269 return TCSERR(TSS_E_INTERNAL_ERROR); 270 271 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 272 273 result = TCS_GetCredential_Internal(hContext, CredType, CredAccessMode, 274 &CredSize, &CredData); 275 276 if (result == TSS_SUCCESS) { 277 initData(&data->comm, 2); 278 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &CredSize, 0, &data->comm)) 279 goto internal_error; 280 if (setData(TCSD_PACKET_TYPE_PBYTE, 1, CredData, CredSize, &data->comm)) 281 goto internal_error; 282 283 free(CredData); 284 } else 285done: initData(&data->comm, 0); 286 287 data->comm.hdr.u.result = result; 288 return TSS_SUCCESS; 289 290internal_error: 291 free(CredData); 292 return TCSERR(TSS_E_INTERNAL_ERROR); 293} 294#endif 295