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_CMK_SetRestrictions(struct tcsd_thread_data *data) 32 { 33 TCS_CONTEXT_HANDLE hContext; 34 TSS_CMK_DELEGATE restriction; 35 TPM_AUTH ownerAuth; 36 TSS_RESULT result; 37 38 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 39 return TCSERR(TSS_E_INTERNAL_ERROR); 40 41 if ((result = ctx_verify_context(hContext))) 42 goto done; 43 44 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 45 46 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &restriction, 0, &data->comm)) 47 return TCSERR(TSS_E_INTERNAL_ERROR); 48 49 if (getData(TCSD_PACKET_TYPE_AUTH, 2, &ownerAuth, 0, &data->comm)) 50 return TCSERR(TSS_E_INTERNAL_ERROR); 51 52 MUTEX_LOCK(tcsp_lock); 53 54 result = TCSP_CMK_SetRestrictions_Internal(hContext, restriction, &ownerAuth); 55 56 MUTEX_UNLOCK(tcsp_lock); 57 58 if (result == TSS_SUCCESS) { 59 initData(&data->comm, 1); 60 if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) 61 return TCSERR(TSS_E_INTERNAL_ERROR); 62 } else 63 done: initData(&data->comm, 0); 64 65 data->comm.hdr.u.result = result; 66 67 return TSS_SUCCESS; 68 } 69 70 TSS_RESULT 71 tcs_wrap_CMK_ApproveMA(struct tcsd_thread_data *data) 72 { 73 TCS_CONTEXT_HANDLE hContext; 74 TPM_DIGEST migAuthorityDigest; 75 TPM_AUTH ownerAuth; 76 TPM_HMAC migAuthorityApproval; 77 TSS_RESULT result; 78 79 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 80 return TCSERR(TSS_E_INTERNAL_ERROR); 81 82 if ((result = ctx_verify_context(hContext))) 83 goto done; 84 85 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 86 87 if (getData(TCSD_PACKET_TYPE_DIGEST, 1, &migAuthorityDigest, 0, &data->comm)) 88 return TCSERR(TSS_E_INTERNAL_ERROR); 89 90 if (getData(TCSD_PACKET_TYPE_AUTH, 2, &ownerAuth, 0, &data->comm)) 91 return TCSERR(TSS_E_INTERNAL_ERROR); 92 93 MUTEX_LOCK(tcsp_lock); 94 95 result = TCSP_CMK_ApproveMA_Internal(hContext, migAuthorityDigest, &ownerAuth, 96 &migAuthorityApproval); 97 98 MUTEX_UNLOCK(tcsp_lock); 99 100 if (result == TSS_SUCCESS) { 101 initData(&data->comm, 2); 102 if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) 103 return TCSERR(TSS_E_INTERNAL_ERROR); 104 105 if (setData(TCSD_PACKET_TYPE_DIGEST, 1, &migAuthorityApproval, 0, &data->comm)) 106 return TCSERR(TSS_E_INTERNAL_ERROR); 107 } else 108 done: initData(&data->comm, 0); 109 110 data->comm.hdr.u.result = result; 111 112 return TSS_SUCCESS; 113 } 114 115 TSS_RESULT 116 tcs_wrap_CMK_CreateKey(struct tcsd_thread_data *data) 117 { 118 TCS_CONTEXT_HANDLE hContext; 119 TCS_KEY_HANDLE hKey; 120 TPM_ENCAUTH keyUsageAuth; 121 TPM_HMAC migAuthorityApproval; 122 TPM_DIGEST migAuthorityDigest; 123 UINT32 keyDataSize; 124 BYTE *keyData; 125 TPM_AUTH parentAuth, nullAuth, *pAuth; 126 TSS_RESULT result; 127 128 memset(&parentAuth, 0, sizeof(TPM_AUTH)); 129 memset(&nullAuth, 0, sizeof(TPM_AUTH)); 130 131 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 132 return TCSERR(TSS_E_INTERNAL_ERROR); 133 134 if ((result = ctx_verify_context(hContext))) 135 goto done; 136 137 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 138 139 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm)) 140 return TCSERR(TSS_E_INTERNAL_ERROR); 141 142 if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &keyUsageAuth, 0, &data->comm)) 143 return TCSERR(TSS_E_INTERNAL_ERROR); 144 145 if (getData(TCSD_PACKET_TYPE_DIGEST, 3, &migAuthorityApproval, 0, &data->comm)) 146 return TCSERR(TSS_E_INTERNAL_ERROR); 147 148 if (getData(TCSD_PACKET_TYPE_DIGEST, 4, &migAuthorityDigest, 0, &data->comm)) 149 return TCSERR(TSS_E_INTERNAL_ERROR); 150 151 if (getData(TCSD_PACKET_TYPE_UINT32, 5, &keyDataSize, 0, &data->comm)) 152 return TCSERR(TSS_E_INTERNAL_ERROR); 153 154 keyData = malloc(keyDataSize); 155 if (keyData == NULL) { 156 LogError("malloc of %u bytes failed.", keyDataSize); 157 return TCSERR(TSS_E_OUTOFMEMORY); 158 } 159 if (getData(TCSD_PACKET_TYPE_PBYTE, 6, keyData, keyDataSize, &data->comm)) { 160 free(keyData); 161 return TCSERR(TSS_E_INTERNAL_ERROR); 162 } 163 164 if (getData(TCSD_PACKET_TYPE_AUTH, 7, &parentAuth, 0, &data->comm)) { 165 free(keyData); 166 return TCSERR(TSS_E_INTERNAL_ERROR); 167 } 168 169 if (memcmp(&nullAuth, &parentAuth, sizeof(TPM_AUTH))) 170 pAuth = &parentAuth; 171 else 172 pAuth = NULL; 173 174 MUTEX_LOCK(tcsp_lock); 175 176 result = TCSP_CMK_CreateKey_Internal(hContext, hKey, keyUsageAuth, migAuthorityApproval, 177 migAuthorityDigest, &keyDataSize, &keyData, pAuth); 178 179 MUTEX_UNLOCK(tcsp_lock); 180 181 if (result == TSS_SUCCESS) { 182 initData(&data->comm, 3); 183 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &keyDataSize, 0, &data->comm)) { 184 free(keyData); 185 return TCSERR(TSS_E_INTERNAL_ERROR); 186 } 187 188 if (setData(TCSD_PACKET_TYPE_PBYTE, 1, keyData, keyDataSize, &data->comm)) { 189 free(keyData); 190 return TCSERR(TSS_E_INTERNAL_ERROR); 191 } 192 free(keyData); 193 194 if (pAuth) { 195 if (setData(TCSD_PACKET_TYPE_AUTH, 2, pAuth, 0, &data->comm)) 196 return TCSERR(TSS_E_INTERNAL_ERROR); 197 } 198 } else 199 done: initData(&data->comm, 0); 200 201 data->comm.hdr.u.result = result; 202 203 return TSS_SUCCESS; 204 } 205 206 TSS_RESULT 207 tcs_wrap_CMK_CreateTicket(struct tcsd_thread_data *data) 208 { 209 TCS_CONTEXT_HANDLE hContext; 210 UINT32 publicVerifyKeySize; 211 BYTE *publicVerifyKey; 212 TPM_DIGEST signedData; 213 UINT32 sigValueSize; 214 BYTE *sigValue; 215 TPM_AUTH ownerAuth; 216 TPM_HMAC sigTicket; 217 TSS_RESULT result; 218 219 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 220 return TCSERR(TSS_E_INTERNAL_ERROR); 221 222 if ((result = ctx_verify_context(hContext))) 223 goto done; 224 225 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 226 227 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &publicVerifyKeySize, 0, &data->comm)) 228 return TCSERR(TSS_E_INTERNAL_ERROR); 229 230 publicVerifyKey = malloc(publicVerifyKeySize); 231 if (publicVerifyKey == NULL) { 232 LogError("malloc of %u bytes failed.", publicVerifyKeySize); 233 return TCSERR(TSS_E_OUTOFMEMORY); 234 } 235 if (getData(TCSD_PACKET_TYPE_PBYTE, 2, publicVerifyKey, publicVerifyKeySize, &data->comm)) { 236 free(publicVerifyKey); 237 return TCSERR(TSS_E_INTERNAL_ERROR); 238 } 239 240 if (getData(TCSD_PACKET_TYPE_DIGEST, 3, &signedData, 0, &data->comm)) { 241 free(publicVerifyKey); 242 return TCSERR(TSS_E_INTERNAL_ERROR); 243 } 244 245 if (getData(TCSD_PACKET_TYPE_UINT32, 4, &sigValueSize, 0, &data->comm)) { 246 free(publicVerifyKey); 247 return TCSERR(TSS_E_INTERNAL_ERROR); 248 } 249 250 sigValue = malloc(sigValueSize); 251 if (sigValue == NULL) { 252 LogError("malloc of %u bytes failed.", sigValueSize); 253 free(publicVerifyKey); 254 return TCSERR(TSS_E_OUTOFMEMORY); 255 } 256 if (getData(TCSD_PACKET_TYPE_PBYTE, 5, sigValue, sigValueSize, &data->comm)) { 257 free(publicVerifyKey); 258 free(sigValue); 259 return TCSERR(TSS_E_INTERNAL_ERROR); 260 } 261 262 if (getData(TCSD_PACKET_TYPE_AUTH, 6, &ownerAuth, 0, &data->comm)) { 263 free(publicVerifyKey); 264 free(sigValue); 265 return TCSERR(TSS_E_INTERNAL_ERROR); 266 } 267 268 MUTEX_LOCK(tcsp_lock); 269 270 result = TCSP_CMK_CreateTicket_Internal(hContext, publicVerifyKeySize, publicVerifyKey, 271 signedData, sigValueSize, sigValue, &ownerAuth, &sigTicket); 272 273 MUTEX_UNLOCK(tcsp_lock); 274 free(publicVerifyKey); 275 free(sigValue); 276 277 if (result == TSS_SUCCESS) { 278 initData(&data->comm, 2); 279 if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) 280 return TCSERR(TSS_E_INTERNAL_ERROR); 281 282 if (setData(TCSD_PACKET_TYPE_DIGEST, 1, &sigTicket, 0, &data->comm)) 283 return TCSERR(TSS_E_INTERNAL_ERROR); 284 } else 285 done: initData(&data->comm, 0); 286 287 data->comm.hdr.u.result = result; 288 289 return TSS_SUCCESS; 290 } 291 292 TSS_RESULT 293 tcs_wrap_CMK_CreateBlob(struct tcsd_thread_data *data) 294 { 295 TCS_CONTEXT_HANDLE hContext; 296 TCS_KEY_HANDLE hKey; 297 UINT16 migrationType; 298 UINT32 migKeyAuthSize; 299 BYTE *migKeyAuth; 300 TPM_DIGEST pubSourceKeyDigest; 301 UINT32 msaListSize, restrictTicketSize, sigTicketSize, encDataSize; 302 BYTE *msaList, *restrictTicket, *sigTicket, *encData; 303 TPM_AUTH parentAuth, nullAuth, *pAuth; 304 UINT32 randomSize, outDataSize; 305 BYTE *random, *outData; 306 TSS_RESULT result; 307 int i; 308 309 memset(&parentAuth, 0, sizeof(TPM_AUTH)); 310 memset(&nullAuth, 0, sizeof(TPM_AUTH)); 311 312 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 313 return TCSERR(TSS_E_INTERNAL_ERROR); 314 315 if ((result = ctx_verify_context(hContext))) 316 goto done; 317 318 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 319 320 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm)) 321 return TCSERR(TSS_E_INTERNAL_ERROR); 322 323 if (getData(TCSD_PACKET_TYPE_UINT16, 2, &migrationType, 0, &data->comm)) 324 return TCSERR(TSS_E_INTERNAL_ERROR); 325 326 if (getData(TCSD_PACKET_TYPE_UINT32, 3, &migKeyAuthSize, 0, &data->comm)) 327 return TCSERR(TSS_E_INTERNAL_ERROR); 328 329 migKeyAuth = malloc(migKeyAuthSize); 330 if (migKeyAuth == NULL) { 331 LogError("malloc of %u bytes failed.", migKeyAuthSize); 332 return TCSERR(TSS_E_OUTOFMEMORY); 333 } 334 if (getData(TCSD_PACKET_TYPE_PBYTE, 4, migKeyAuth, migKeyAuthSize, &data->comm)) { 335 free(migKeyAuth); 336 return TCSERR(TSS_E_INTERNAL_ERROR); 337 } 338 339 if (getData(TCSD_PACKET_TYPE_DIGEST, 5, &pubSourceKeyDigest, 0, &data->comm)) { 340 free(migKeyAuth); 341 return TCSERR(TSS_E_INTERNAL_ERROR); 342 } 343 344 if (getData(TCSD_PACKET_TYPE_UINT32, 6, &msaListSize, 0, &data->comm)) { 345 free(migKeyAuth); 346 return TCSERR(TSS_E_INTERNAL_ERROR); 347 } 348 349 msaList = malloc(msaListSize); 350 if (msaList == NULL) { 351 LogError("malloc of %u bytes failed.", msaListSize); 352 free(migKeyAuth); 353 return TCSERR(TSS_E_OUTOFMEMORY); 354 } 355 if (getData(TCSD_PACKET_TYPE_PBYTE, 7, msaList, msaListSize, &data->comm)) { 356 free(migKeyAuth); 357 free(msaList); 358 return TCSERR(TSS_E_INTERNAL_ERROR); 359 } 360 361 if (getData(TCSD_PACKET_TYPE_UINT32, 8, &restrictTicketSize, 0, &data->comm)) { 362 free(migKeyAuth); 363 free(msaList); 364 return TCSERR(TSS_E_INTERNAL_ERROR); 365 } 366 367 restrictTicket = malloc(restrictTicketSize); 368 if (restrictTicket == NULL) { 369 LogError("malloc of %u bytes failed.", restrictTicketSize); 370 free(migKeyAuth); 371 free(msaList); 372 return TCSERR(TSS_E_OUTOFMEMORY); 373 } 374 if (getData(TCSD_PACKET_TYPE_PBYTE, 9, restrictTicket, restrictTicketSize, &data->comm)) { 375 free(migKeyAuth); 376 free(msaList); 377 free(restrictTicket); 378 return TCSERR(TSS_E_INTERNAL_ERROR); 379 } 380 381 if (getData(TCSD_PACKET_TYPE_UINT32, 10, &sigTicketSize, 0, &data->comm)) { 382 free(migKeyAuth); 383 free(msaList); 384 free(restrictTicket); 385 return TCSERR(TSS_E_INTERNAL_ERROR); 386 } 387 388 sigTicket = malloc(sigTicketSize); 389 if (sigTicket == NULL) { 390 LogError("malloc of %u bytes failed.", sigTicketSize); 391 free(migKeyAuth); 392 free(msaList); 393 free(restrictTicket); 394 return TCSERR(TSS_E_OUTOFMEMORY); 395 } 396 if (getData(TCSD_PACKET_TYPE_PBYTE, 11, sigTicket, sigTicketSize, &data->comm)) { 397 free(migKeyAuth); 398 free(msaList); 399 free(restrictTicket); 400 free(sigTicket); 401 return TCSERR(TSS_E_INTERNAL_ERROR); 402 } 403 404 if (getData(TCSD_PACKET_TYPE_UINT32, 12, &encDataSize, 0, &data->comm)) { 405 free(migKeyAuth); 406 free(msaList); 407 free(restrictTicket); 408 free(sigTicket); 409 return TCSERR(TSS_E_INTERNAL_ERROR); 410 } 411 412 encData = malloc(encDataSize); 413 if (encData == NULL) { 414 LogError("malloc of %u bytes failed.", encDataSize); 415 free(migKeyAuth); 416 free(msaList); 417 free(restrictTicket); 418 free(sigTicket); 419 return TCSERR(TSS_E_OUTOFMEMORY); 420 } 421 if (getData(TCSD_PACKET_TYPE_PBYTE, 13, encData, encDataSize, &data->comm)) { 422 free(migKeyAuth); 423 free(msaList); 424 free(restrictTicket); 425 free(sigTicket); 426 free(encData); 427 return TCSERR(TSS_E_INTERNAL_ERROR); 428 } 429 430 if (getData(TCSD_PACKET_TYPE_AUTH, 14, &parentAuth, 0, &data->comm)) { 431 free(migKeyAuth); 432 free(msaList); 433 free(restrictTicket); 434 free(sigTicket); 435 free(encData); 436 return TCSERR(TSS_E_INTERNAL_ERROR); 437 } 438 439 if (memcmp(&nullAuth, &parentAuth, sizeof(TPM_AUTH))) 440 pAuth = &parentAuth; 441 else 442 pAuth = NULL; 443 444 MUTEX_LOCK(tcsp_lock); 445 446 result = TCSP_CMK_CreateBlob_Internal(hContext, hKey, migrationType, migKeyAuthSize, 447 migKeyAuth, pubSourceKeyDigest, msaListSize, msaList, restrictTicketSize, 448 restrictTicket, sigTicketSize, sigTicket, encDataSize, encData, pAuth, 449 &randomSize, &random, &outDataSize, &outData); 450 451 MUTEX_UNLOCK(tcsp_lock); 452 free(migKeyAuth); 453 free(msaList); 454 free(restrictTicket); 455 free(sigTicket); 456 free(encData); 457 458 if (result == TSS_SUCCESS) { 459 i = 0; 460 initData(&data->comm, 5); 461 if (pAuth) { 462 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm)) { 463 free(random); 464 free(outData); 465 return TCSERR(TSS_E_INTERNAL_ERROR); 466 } 467 } 468 469 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &randomSize, 0, &data->comm)) { 470 free(random); 471 free(outData); 472 return TCSERR(TSS_E_INTERNAL_ERROR); 473 } 474 475 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, random, randomSize, &data->comm)) { 476 free(random); 477 free(outData); 478 return TCSERR(TSS_E_INTERNAL_ERROR); 479 } 480 free(random); 481 482 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) { 483 free(outData); 484 return TCSERR(TSS_E_INTERNAL_ERROR); 485 } 486 487 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) { 488 free(outData); 489 return TCSERR(TSS_E_INTERNAL_ERROR); 490 } 491 free(outData); 492 } else 493 done: initData(&data->comm, 0); 494 495 data->comm.hdr.u.result = result; 496 497 return TSS_SUCCESS; 498 } 499 500 TSS_RESULT 501 tcs_wrap_CMK_ConvertMigration(struct tcsd_thread_data *data) 502 { 503 TCS_CONTEXT_HANDLE hContext; 504 TCS_KEY_HANDLE hKey; 505 TPM_CMK_AUTH restrictTicket; 506 TPM_HMAC sigTicket; 507 UINT32 keyDataSize, msaListSize, randomSize; 508 BYTE *keyData, *msaList, *random; 509 TPM_AUTH parentAuth, nullAuth, *pAuth; 510 UINT32 outDataSize; 511 BYTE *outData; 512 TSS_RESULT result; 513 int i; 514 515 memset(&parentAuth, 0, sizeof(TPM_AUTH)); 516 memset(&nullAuth, 0, sizeof(TPM_AUTH)); 517 518 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 519 return TCSERR(TSS_E_INTERNAL_ERROR); 520 521 if ((result = ctx_verify_context(hContext))) 522 goto done; 523 524 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 525 526 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm)) 527 return TCSERR(TSS_E_INTERNAL_ERROR); 528 529 if (getData(TCSD_PACKET_TYPE_PBYTE, 2, &restrictTicket, sizeof(restrictTicket), &data->comm)) 530 return TCSERR(TSS_E_INTERNAL_ERROR); 531 532 if (getData(TCSD_PACKET_TYPE_DIGEST, 3, &sigTicket, 0, &data->comm)) 533 return TCSERR(TSS_E_INTERNAL_ERROR); 534 535 if (getData(TCSD_PACKET_TYPE_UINT32, 4, &keyDataSize, 0, &data->comm)) 536 return TCSERR(TSS_E_INTERNAL_ERROR); 537 538 keyData = malloc(keyDataSize); 539 if (keyData == NULL) { 540 LogError("malloc of %u bytes failed.", keyDataSize); 541 return TCSERR(TSS_E_OUTOFMEMORY); 542 } 543 if (getData(TCSD_PACKET_TYPE_PBYTE, 5, keyData, keyDataSize, &data->comm)) { 544 free(keyData); 545 return TCSERR(TSS_E_INTERNAL_ERROR); 546 } 547 548 if (getData(TCSD_PACKET_TYPE_UINT32, 6, &msaListSize, 0, &data->comm)) { 549 free(keyData); 550 return TCSERR(TSS_E_INTERNAL_ERROR); 551 } 552 553 msaList = malloc(msaListSize); 554 if (msaList == NULL) { 555 LogError("malloc of %u bytes failed.", msaListSize); 556 free(keyData); 557 return TCSERR(TSS_E_OUTOFMEMORY); 558 } 559 if (getData(TCSD_PACKET_TYPE_PBYTE, 7, msaList, msaListSize, &data->comm)) { 560 free(keyData); 561 free(msaList); 562 return TCSERR(TSS_E_INTERNAL_ERROR); 563 } 564 565 if (getData(TCSD_PACKET_TYPE_UINT32, 8, &randomSize, 0, &data->comm)) { 566 free(keyData); 567 free(msaList); 568 return TCSERR(TSS_E_INTERNAL_ERROR); 569 } 570 571 random = malloc(randomSize); 572 if (random == NULL) { 573 LogError("malloc of %u bytes failed.", randomSize); 574 free(keyData); 575 free(msaList); 576 return TCSERR(TSS_E_OUTOFMEMORY); 577 } 578 if (getData(TCSD_PACKET_TYPE_PBYTE, 9, random, randomSize, &data->comm)) { 579 free(keyData); 580 free(msaList); 581 free(random); 582 return TCSERR(TSS_E_INTERNAL_ERROR); 583 } 584 585 if (getData(TCSD_PACKET_TYPE_AUTH, 10, &parentAuth, 0, &data->comm)) { 586 free(keyData); 587 free(msaList); 588 free(random); 589 return TCSERR(TSS_E_INTERNAL_ERROR); 590 } 591 592 if (memcmp(&nullAuth, &parentAuth, sizeof(TPM_AUTH))) 593 pAuth = &parentAuth; 594 else 595 pAuth = NULL; 596 597 MUTEX_LOCK(tcsp_lock); 598 599 result = TCSP_CMK_ConvertMigration_Internal(hContext, hKey, restrictTicket, sigTicket, 600 keyDataSize, keyData, msaListSize, msaList, randomSize, random, 601 pAuth, &outDataSize, &outData); 602 603 MUTEX_UNLOCK(tcsp_lock); 604 free(keyData); 605 free(msaList); 606 free(random); 607 608 if (result == TSS_SUCCESS) { 609 i = 0; 610 initData(&data->comm, 3); 611 if (pAuth) { 612 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm)) { 613 free(outData); 614 return TCSERR(TSS_E_INTERNAL_ERROR); 615 } 616 } 617 618 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) { 619 free(outData); 620 return TCSERR(TSS_E_INTERNAL_ERROR); 621 } 622 623 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) { 624 free(outData); 625 return TCSERR(TSS_E_INTERNAL_ERROR); 626 } 627 free(outData); 628 } else 629 done: initData(&data->comm, 0); 630 631 data->comm.hdr.u.result = result; 632 633 return TSS_SUCCESS; 634 } 635 636