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