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 12 #include <stdlib.h> 13 #include <stdio.h> 14 #include <errno.h> 15 #include <string.h> 16 17 #include "trousers/tss.h" 18 #include "trousers/trousers.h" 19 #include "trousers_types.h" 20 #include "spi_utils.h" 21 #include "capabilities.h" 22 #include "tsplog.h" 23 #include "obj.h" 24 25 26 void 27 migdata_free(void *data) 28 { 29 struct tr_migdata_obj *migdata = (struct tr_migdata_obj *)data; 30 31 free(migdata); 32 } 33 34 TSS_BOOL 35 obj_is_migdata(TSS_HOBJECT hObject) 36 { 37 TSS_BOOL answer = FALSE; 38 39 if ((obj_list_get_obj(&migdata_list, hObject))) { 40 answer = TRUE; 41 obj_list_put(&migdata_list); 42 } 43 44 return answer; 45 } 46 47 TSS_RESULT 48 obj_migdata_add(TSS_HCONTEXT hContext, TSS_HOBJECT *phObject) 49 { 50 TSS_RESULT result; 51 struct tr_migdata_obj *migdata = calloc(1, sizeof(struct tr_migdata_obj)); 52 53 if (migdata == NULL) { 54 LogError("malloc of %zd bytes failed.", sizeof(struct tr_migdata_obj)); 55 return TSPERR(TSS_E_OUTOFMEMORY); 56 } 57 58 if ((result = obj_list_add(&migdata_list, hContext, 0, migdata, phObject))) { 59 free(migdata); 60 return result; 61 } 62 63 return TSS_SUCCESS; 64 } 65 66 TSS_RESULT 67 obj_migdata_remove(TSS_HMIGDATA hMigData, TSS_HCONTEXT hContext) 68 { 69 TSS_RESULT result; 70 71 if ((result = obj_list_remove(&migdata_list, &migdata_free, hMigData, hContext))) 72 return result; 73 74 return TSS_SUCCESS; 75 } 76 77 TSS_RESULT 78 obj_migdata_get_tsp_context(TSS_HMIGDATA hMigData, TSS_HCONTEXT *hContext) 79 { 80 struct tsp_object *obj; 81 82 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 83 return TSPERR(TSS_E_INVALID_HANDLE); 84 85 *hContext = obj->tspContext; 86 87 obj_list_put(&migdata_list); 88 89 return TSS_SUCCESS; 90 } 91 92 TSS_RESULT 93 obj_migdata_set_migrationblob(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob) 94 { 95 TSS_RESULT result; 96 97 switch (whichOne) { 98 case TSS_MIGATTRIB_MIG_MSALIST_PUBKEY_BLOB: 99 result = obj_migdata_set_msa_pubkey(hMigData, blobSize, blob); 100 break; 101 case TSS_MIGATTRIB_MIG_AUTHORITY_PUBKEY_BLOB: 102 result = obj_migdata_set_ma_pubkey(hMigData, blobSize, blob); 103 break; 104 case TSS_MIGATTRIB_MIG_DESTINATION_PUBKEY_BLOB: 105 result = obj_migdata_set_dest_pubkey(hMigData, blobSize, blob); 106 break; 107 case TSS_MIGATTRIB_MIG_SOURCE_PUBKEY_BLOB: 108 result = obj_migdata_set_src_pubkey(hMigData, blobSize, blob); 109 break; 110 default: 111 result = TSPERR(TSS_E_BAD_PARAMETER); 112 } 113 114 return result; 115 } 116 117 TSS_RESULT 118 obj_migdata_get_migrationblob(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob) 119 { 120 TSS_RESULT result; 121 122 switch (whichOne) { 123 case TSS_MIGATTRIB_MIG_XOR_BLOB: 124 result = obj_migdata_get_blob(hMigData, blobSize, blob); 125 break; 126 default: 127 result = TSPERR(TSS_E_BAD_PARAMETER); 128 } 129 130 return result; 131 } 132 133 TSS_RESULT 134 obj_migdata_set_authoritydata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob) 135 { 136 TSS_RESULT result; 137 138 switch (whichOne) { 139 case TSS_MIGATTRIB_AUTHORITY_DIGEST: 140 result = obj_migdata_set_msa_digest(hMigData, blobSize, blob); 141 break; 142 case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC: 143 result = obj_migdata_set_msa_hmac(hMigData, blobSize, blob); 144 break; 145 case TSS_MIGATTRIB_AUTHORITY_MSALIST: 146 result = obj_migdata_set_msa_list(hMigData, blobSize, blob); 147 break; 148 default: 149 result = TSPERR(TSS_E_BAD_PARAMETER); 150 } 151 152 return result; 153 } 154 155 TSS_RESULT 156 obj_migdata_get_authoritydata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob) 157 { 158 TSS_RESULT result; 159 160 switch (whichOne) { 161 case TSS_MIGATTRIB_AUTHORITY_DIGEST: 162 result = obj_migdata_get_msa_digest(hMigData, blobSize, blob); 163 break; 164 case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC: 165 result = obj_migdata_get_msa_hmac(hMigData, blobSize, blob); 166 break; 167 case TSS_MIGATTRIB_AUTHORITY_MSALIST: 168 result = obj_migdata_get_msa_list(hMigData, blobSize, blob); 169 break; 170 default: 171 result = TSPERR(TSS_E_BAD_PARAMETER); 172 } 173 174 return result; 175 } 176 177 TSS_RESULT 178 obj_migdata_set_migauthdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob) 179 { 180 TSS_RESULT result; 181 182 switch (whichOne) { 183 case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST: 184 result = obj_migdata_set_ma_digest(hMigData, blobSize, blob); 185 break; 186 case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST: 187 result = obj_migdata_set_dest_digest(hMigData, blobSize, blob); 188 break; 189 case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST: 190 result = obj_migdata_set_src_digest(hMigData, blobSize, blob); 191 break; 192 default: 193 result = TSPERR(TSS_E_BAD_PARAMETER); 194 } 195 196 return result; 197 } 198 199 TSS_RESULT 200 obj_migdata_get_migauthdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob) 201 { 202 TSS_RESULT result; 203 204 switch (whichOne) { 205 case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST: 206 result = obj_migdata_get_ma_digest(hMigData, blobSize, blob); 207 break; 208 case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST: 209 result = obj_migdata_get_dest_digest(hMigData, blobSize, blob); 210 break; 211 case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST: 212 result = obj_migdata_get_src_digest(hMigData, blobSize, blob); 213 break; 214 default: 215 result = TSPERR(TSS_E_BAD_PARAMETER); 216 } 217 218 return result; 219 } 220 221 TSS_RESULT 222 obj_migdata_set_ticketdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 blobSize, BYTE *blob) 223 { 224 TSS_RESULT result; 225 226 switch (whichOne) { 227 case TSS_MIGATTRIB_TICKET_SIG_DIGEST: 228 result = obj_migdata_set_sig_data(hMigData, blobSize, blob); 229 break; 230 case TSS_MIGATTRIB_TICKET_SIG_VALUE: 231 result = obj_migdata_set_sig_value(hMigData, blobSize, blob); 232 break; 233 case TSS_MIGATTRIB_TICKET_SIG_TICKET: 234 result = obj_migdata_set_sig_ticket(hMigData, blobSize, blob); 235 break; 236 case TSS_MIGATTRIB_TICKET_RESTRICT_TICKET: 237 result = obj_migdata_set_cmk_auth(hMigData, blobSize, blob); 238 break; 239 default: 240 result = TSPERR(TSS_E_BAD_PARAMETER); 241 } 242 243 return result; 244 } 245 246 TSS_RESULT 247 obj_migdata_get_ticketdata(TSS_HMIGDATA hMigData, UINT32 whichOne, UINT32 *blobSize, BYTE **blob) 248 { 249 TSS_RESULT result; 250 251 switch (whichOne) { 252 case TSS_MIGATTRIB_TICKET_SIG_TICKET: 253 result = obj_migdata_get_sig_ticket(hMigData, blobSize, blob); 254 break; 255 default: 256 result = TSPERR(TSS_E_BAD_PARAMETER); 257 } 258 259 return result; 260 } 261 262 TSS_RESULT 263 obj_migdata_set_ticket_blob(TSS_HMIGDATA hMigData, UINT32 migTicketSize, BYTE *migTicket) 264 { 265 struct tsp_object *obj; 266 struct tr_migdata_obj *migdata; 267 TSS_RESULT result = TSS_SUCCESS; 268 269 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 270 return TSPERR(TSS_E_INVALID_HANDLE); 271 272 migdata = (struct tr_migdata_obj *)obj->data; 273 274 migdata->migTicketSize = 0; 275 free(migdata->migTicket); 276 if ((migdata->migTicket = malloc(migTicketSize)) == NULL) { 277 LogError("malloc of %u bytes failed.", migTicketSize); 278 result = TSPERR(TSS_E_OUTOFMEMORY); 279 goto done; 280 } 281 memcpy(migdata->migTicket, migTicket, migTicketSize); 282 migdata->migTicketSize = migTicketSize; 283 284 done: 285 obj_list_put(&migdata_list); 286 287 return result; 288 } 289 290 TSS_RESULT 291 obj_migdata_get_ticket_blob(TSS_HMIGDATA hMigData, UINT32 *migTicketSize, BYTE **migTicket) 292 { 293 struct tsp_object *obj; 294 struct tr_migdata_obj *migdata; 295 TSS_RESULT result = TSS_SUCCESS; 296 297 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 298 return TSPERR(TSS_E_INVALID_HANDLE); 299 300 migdata = (struct tr_migdata_obj *)obj->data; 301 302 if ((*migTicket = calloc_tspi(obj->tspContext, migdata->migTicketSize)) == NULL) { 303 LogError("malloc of %u bytes failed.", migdata->migTicketSize); 304 result = TSPERR(TSS_E_OUTOFMEMORY); 305 goto done; 306 } 307 memcpy(*migTicket, migdata->migTicket, migdata->migTicketSize); 308 *migTicketSize = migdata->migTicketSize; 309 310 done: 311 obj_list_put(&migdata_list); 312 313 return result; 314 } 315 316 TSS_RESULT 317 obj_migdata_set_msa_list(TSS_HMIGDATA hMigData, UINT32 msaListSize, BYTE *msaList) 318 { 319 struct tsp_object *obj; 320 struct tr_migdata_obj *migdata; 321 UINT32 i, count, size; 322 TPM_DIGEST *digest; 323 TSS_RESULT result = TSS_SUCCESS; 324 325 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 326 return TSPERR(TSS_E_INVALID_HANDLE); 327 328 migdata = (struct tr_migdata_obj *)obj->data; 329 330 count = msaListSize / sizeof(digest->digest); 331 size = count * sizeof(*digest); 332 333 migdata->msaList.MSAlist = 0; 334 free(migdata->msaList.migAuthDigest); 335 if ((migdata->msaList.migAuthDigest = malloc(size)) == NULL) { 336 LogError("malloc of %u bytes failed.", size); 337 result = TSPERR(TSS_E_OUTOFMEMORY); 338 goto done; 339 } 340 digest = migdata->msaList.migAuthDigest; 341 for (i = 0; i < count; i++) { 342 memcpy(digest->digest, msaList, sizeof(digest->digest)); 343 msaList += sizeof(digest->digest); 344 digest++; 345 } 346 migdata->msaList.MSAlist = count; 347 348 result = obj_migdata_calc_msa_digest(migdata); 349 350 done: 351 obj_list_put(&migdata_list); 352 353 return result; 354 } 355 356 TSS_RESULT 357 obj_migdata_get_msa_list(TSS_HMIGDATA hMigData, UINT32 *size, BYTE **msaList) 358 { 359 struct tsp_object *obj; 360 struct tr_migdata_obj *migdata; 361 UINT32 i; 362 TPM_DIGEST *digest; 363 BYTE *tmpMsaList; 364 TSS_RESULT result = TSS_SUCCESS; 365 366 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 367 return TSPERR(TSS_E_INVALID_HANDLE); 368 369 migdata = (struct tr_migdata_obj *)obj->data; 370 371 *size = migdata->msaList.MSAlist * sizeof(migdata->msaList.migAuthDigest->digest); 372 if ((*msaList = calloc_tspi(obj->tspContext, *size)) == NULL) { 373 LogError("malloc of %u bytes failed.", *size); 374 result = TSPERR(TSS_E_OUTOFMEMORY); 375 goto done; 376 } 377 tmpMsaList = *msaList; 378 digest = migdata->msaList.migAuthDigest; 379 for (i = 0; i < migdata->msaList.MSAlist; i++) { 380 memcpy(tmpMsaList, digest->digest, sizeof(digest->digest)); 381 tmpMsaList += sizeof(digest->digest); 382 digest++; 383 } 384 385 done: 386 obj_list_put(&migdata_list); 387 388 return result; 389 } 390 391 TSS_RESULT 392 obj_migdata_set_msa_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob) 393 { 394 struct tsp_object *obj; 395 struct tr_migdata_obj *migdata; 396 UINT32 size; 397 TPM_DIGEST msaDigest; 398 TPM_DIGEST *digest; 399 TSS_RESULT result = TSS_SUCCESS; 400 401 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 402 return TSPERR(TSS_E_INVALID_HANDLE); 403 404 migdata = (struct tr_migdata_obj *)obj->data; 405 406 if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &msaDigest))) 407 goto done; 408 409 size = (migdata->msaList.MSAlist + 1) * sizeof(*digest); 410 if ((migdata->msaList.migAuthDigest = realloc(migdata->msaList.migAuthDigest, size)) == NULL) { 411 LogError("malloc of %u bytes failed.", size); 412 result = TSPERR(TSS_E_OUTOFMEMORY); 413 goto done; 414 } 415 digest = migdata->msaList.migAuthDigest + migdata->msaList.MSAlist; 416 *digest = msaDigest; 417 migdata->msaList.MSAlist++; 418 419 result = obj_migdata_calc_msa_digest(migdata); 420 421 done: 422 obj_list_put(&migdata_list); 423 424 return result; 425 } 426 427 TSS_RESULT 428 obj_migdata_set_msa_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest) 429 { 430 struct tsp_object *obj; 431 struct tr_migdata_obj *migdata; 432 TSS_RESULT result = TSS_SUCCESS; 433 434 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 435 return TSPERR(TSS_E_INVALID_HANDLE); 436 437 migdata = (struct tr_migdata_obj *)obj->data; 438 439 if (digestSize != sizeof(migdata->msaDigest.digest)) { 440 result = TSPERR(TSS_E_BAD_PARAMETER); 441 goto done; 442 } 443 memcpy(migdata->msaDigest.digest, digest, sizeof(migdata->msaDigest.digest)); 444 445 done: 446 obj_list_put(&migdata_list); 447 448 return result; 449 } 450 451 TSS_RESULT 452 obj_migdata_get_msa_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest) 453 { 454 struct tsp_object *obj; 455 struct tr_migdata_obj *migdata; 456 TSS_RESULT result = TSS_SUCCESS; 457 458 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 459 return TSPERR(TSS_E_INVALID_HANDLE); 460 461 migdata = (struct tr_migdata_obj *)obj->data; 462 463 if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->msaDigest.digest))) == NULL) { 464 LogError("malloc of %zd bytes failed.", sizeof(migdata->msaDigest.digest)); 465 result = TSPERR(TSS_E_OUTOFMEMORY); 466 goto done; 467 } 468 memcpy(*digest, migdata->msaDigest.digest, sizeof(migdata->msaDigest.digest)); 469 *digestSize = sizeof(migdata->msaDigest.digest); 470 471 done: 472 obj_list_put(&migdata_list); 473 474 return result; 475 } 476 477 TSS_RESULT 478 obj_migdata_get_msa_list_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **msaListBlob) 479 { 480 struct tsp_object *obj; 481 struct tr_migdata_obj *migdata; 482 UINT64 offset; 483 TSS_RESULT result = TSS_SUCCESS; 484 485 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 486 return TSPERR(TSS_E_INVALID_HANDLE); 487 488 migdata = (struct tr_migdata_obj *)obj->data; 489 490 offset = 0; 491 Trspi_LoadBlob_MSA_COMPOSITE(&offset, NULL, &migdata->msaList); 492 493 *blobSize = offset; 494 if ((*msaListBlob = calloc_tspi(obj->tspContext, *blobSize)) == NULL) { 495 LogError("malloc of %u bytes failed.", *blobSize); 496 result = TSPERR(TSS_E_OUTOFMEMORY); 497 goto done; 498 } 499 offset = 0; 500 Trspi_LoadBlob_MSA_COMPOSITE(&offset, *msaListBlob, &migdata->msaList); 501 502 done: 503 obj_list_put(&migdata_list); 504 505 return result; 506 } 507 508 TSS_RESULT 509 obj_migdata_set_msa_hmac(TSS_HMIGDATA hMigData, UINT32 hmacSize, BYTE *hmac) 510 { 511 struct tsp_object *obj; 512 struct tr_migdata_obj *migdata; 513 TSS_RESULT result = TSS_SUCCESS; 514 515 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 516 return TSPERR(TSS_E_INVALID_HANDLE); 517 518 migdata = (struct tr_migdata_obj *)obj->data; 519 520 if (hmacSize != sizeof(migdata->msaHmac.digest)) { 521 result = TSPERR(TSS_E_BAD_PARAMETER); 522 goto done; 523 } 524 memcpy(migdata->msaHmac.digest, hmac, sizeof(migdata->msaHmac.digest)); 525 526 done: 527 obj_list_put(&migdata_list); 528 529 return result; 530 } 531 532 TSS_RESULT 533 obj_migdata_get_msa_hmac(TSS_HMIGDATA hMigData, UINT32 *hmacSize, BYTE **hmac) 534 { 535 struct tsp_object *obj; 536 struct tr_migdata_obj *migdata; 537 TSS_RESULT result = TSS_SUCCESS; 538 539 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 540 return TSPERR(TSS_E_INVALID_HANDLE); 541 542 migdata = (struct tr_migdata_obj *)obj->data; 543 544 if ((*hmac = calloc_tspi(obj->tspContext, sizeof(migdata->msaHmac.digest))) == NULL) { 545 LogError("malloc of %zd bytes failed.", sizeof(migdata->msaHmac.digest)); 546 result = TSPERR(TSS_E_OUTOFMEMORY); 547 goto done; 548 } 549 memcpy(*hmac, migdata->msaHmac.digest, sizeof(migdata->msaHmac.digest)); 550 *hmacSize = sizeof(migdata->msaHmac.digest); 551 552 done: 553 obj_list_put(&migdata_list); 554 555 return result; 556 } 557 558 TSS_RESULT 559 obj_migdata_set_ma_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob) 560 { 561 struct tsp_object *obj; 562 struct tr_migdata_obj *migdata; 563 TPM_DIGEST pubKeyDigest; 564 TSS_RESULT result = TSS_SUCCESS; 565 566 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 567 return TSPERR(TSS_E_INVALID_HANDLE); 568 569 migdata = (struct tr_migdata_obj *)obj->data; 570 571 if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest))) 572 goto done; 573 574 migdata->maDigest = pubKeyDigest; 575 576 obj_migdata_calc_sig_data_digest(migdata); 577 578 done: 579 obj_list_put(&migdata_list); 580 581 return result; 582 } 583 584 TSS_RESULT 585 obj_migdata_set_ma_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest) 586 { 587 struct tsp_object *obj; 588 struct tr_migdata_obj *migdata; 589 TSS_RESULT result = TSS_SUCCESS; 590 591 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 592 return TSPERR(TSS_E_INVALID_HANDLE); 593 594 migdata = (struct tr_migdata_obj *)obj->data; 595 596 if (digestSize != sizeof(migdata->maDigest.digest)) { 597 result = TSPERR(TSS_E_BAD_PARAMETER); 598 goto done; 599 } 600 memcpy(migdata->maDigest.digest, digest, sizeof(migdata->maDigest.digest)); 601 602 obj_migdata_calc_sig_data_digest(migdata); 603 604 done: 605 obj_list_put(&migdata_list); 606 607 return result; 608 } 609 610 TSS_RESULT 611 obj_migdata_get_ma_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest) 612 { 613 struct tsp_object *obj; 614 struct tr_migdata_obj *migdata; 615 TSS_RESULT result = TSS_SUCCESS; 616 617 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 618 return TSPERR(TSS_E_INVALID_HANDLE); 619 620 migdata = (struct tr_migdata_obj *)obj->data; 621 622 if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->maDigest.digest))) == NULL) { 623 LogError("malloc of %zd bytes failed.", sizeof(migdata->maDigest.digest)); 624 result = TSPERR(TSS_E_OUTOFMEMORY); 625 goto done; 626 } 627 memcpy(*digest, migdata->maDigest.digest, sizeof(migdata->maDigest.digest)); 628 *digestSize = sizeof(migdata->maDigest.digest); 629 630 done: 631 obj_list_put(&migdata_list); 632 633 return result; 634 } 635 636 TSS_RESULT 637 obj_migdata_set_dest_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob) 638 { 639 struct tsp_object *obj; 640 struct tr_migdata_obj *migdata; 641 TPM_DIGEST pubKeyDigest; 642 TSS_RESULT result = TSS_SUCCESS; 643 644 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 645 return TSPERR(TSS_E_INVALID_HANDLE); 646 647 migdata = (struct tr_migdata_obj *)obj->data; 648 649 if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest))) 650 goto done; 651 652 migdata->destDigest = pubKeyDigest; 653 654 obj_migdata_calc_sig_data_digest(migdata); 655 656 done: 657 obj_list_put(&migdata_list); 658 659 return result; 660 } 661 662 TSS_RESULT 663 obj_migdata_set_dest_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest) 664 { 665 struct tsp_object *obj; 666 struct tr_migdata_obj *migdata; 667 TSS_RESULT result = TSS_SUCCESS; 668 669 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 670 return TSPERR(TSS_E_INVALID_HANDLE); 671 672 migdata = (struct tr_migdata_obj *)obj->data; 673 674 if (digestSize != sizeof(migdata->destDigest.digest)) { 675 result = TSPERR(TSS_E_BAD_PARAMETER); 676 goto done; 677 } 678 memcpy(migdata->destDigest.digest, digest, sizeof(migdata->destDigest.digest)); 679 680 obj_migdata_calc_sig_data_digest(migdata); 681 682 done: 683 obj_list_put(&migdata_list); 684 685 return result; 686 } 687 688 TSS_RESULT 689 obj_migdata_get_dest_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest) 690 { 691 struct tsp_object *obj; 692 struct tr_migdata_obj *migdata; 693 TSS_RESULT result = TSS_SUCCESS; 694 695 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 696 return TSPERR(TSS_E_INVALID_HANDLE); 697 698 migdata = (struct tr_migdata_obj *)obj->data; 699 700 if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->destDigest.digest))) == NULL) { 701 LogError("malloc of %zd bytes failed.", sizeof(migdata->destDigest.digest)); 702 result = TSPERR(TSS_E_OUTOFMEMORY); 703 goto done; 704 } 705 memcpy(*digest, migdata->destDigest.digest, sizeof(migdata->destDigest.digest)); 706 *digestSize = sizeof(migdata->destDigest.digest); 707 708 done: 709 obj_list_put(&migdata_list); 710 711 return result; 712 } 713 714 TSS_RESULT 715 obj_migdata_set_src_pubkey(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *pubKeyBlob) 716 { 717 struct tsp_object *obj; 718 struct tr_migdata_obj *migdata; 719 TPM_DIGEST pubKeyDigest; 720 TSS_RESULT result = TSS_SUCCESS; 721 722 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 723 return TSPERR(TSS_E_INVALID_HANDLE); 724 725 migdata = (struct tr_migdata_obj *)obj->data; 726 727 if ((result = obj_migdata_calc_pubkey_digest(blobSize, pubKeyBlob, &pubKeyDigest))) 728 goto done; 729 730 migdata->srcDigest = pubKeyDigest; 731 732 obj_migdata_calc_sig_data_digest(migdata); 733 734 done: 735 obj_list_put(&migdata_list); 736 737 return result; 738 } 739 740 TSS_RESULT 741 obj_migdata_set_src_digest(TSS_HMIGDATA hMigData, UINT32 digestSize, BYTE *digest) 742 { 743 struct tsp_object *obj; 744 struct tr_migdata_obj *migdata; 745 TSS_RESULT result = TSS_SUCCESS; 746 747 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 748 return TSPERR(TSS_E_INVALID_HANDLE); 749 750 migdata = (struct tr_migdata_obj *)obj->data; 751 752 if (digestSize != sizeof(migdata->srcDigest.digest)) { 753 result = TSPERR(TSS_E_BAD_PARAMETER); 754 goto done; 755 } 756 memcpy(migdata->srcDigest.digest, digest, sizeof(migdata->srcDigest.digest)); 757 758 obj_migdata_calc_sig_data_digest(migdata); 759 760 done: 761 obj_list_put(&migdata_list); 762 763 return result; 764 } 765 766 TSS_RESULT 767 obj_migdata_get_src_digest(TSS_HMIGDATA hMigData, UINT32 *digestSize, BYTE **digest) 768 { 769 struct tsp_object *obj; 770 struct tr_migdata_obj *migdata; 771 TSS_RESULT result = TSS_SUCCESS; 772 773 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 774 return TSPERR(TSS_E_INVALID_HANDLE); 775 776 migdata = (struct tr_migdata_obj *)obj->data; 777 778 if ((*digest = calloc_tspi(obj->tspContext, sizeof(migdata->srcDigest.digest))) == NULL) { 779 LogError("malloc of %zd bytes failed.", sizeof(migdata->srcDigest.digest)); 780 result = TSPERR(TSS_E_OUTOFMEMORY); 781 goto done; 782 } 783 memcpy(*digest, migdata->srcDigest.digest, sizeof(migdata->srcDigest.digest)); 784 *digestSize = sizeof(migdata->srcDigest.digest); 785 786 done: 787 obj_list_put(&migdata_list); 788 789 return result; 790 } 791 792 TSS_RESULT 793 obj_migdata_set_cmk_auth(TSS_HMIGDATA hMigData, UINT32 digestsSize, BYTE *digests) 794 { 795 struct tsp_object *obj; 796 struct tr_migdata_obj *migdata; 797 TSS_RESULT result = TSS_SUCCESS; 798 799 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 800 return TSPERR(TSS_E_INVALID_HANDLE); 801 802 migdata = (struct tr_migdata_obj *)obj->data; 803 804 if (digestsSize != (sizeof(migdata->maDigest.digest) + 805 sizeof(migdata->destDigest.digest) + 806 sizeof(migdata->srcDigest.digest))) { 807 result = TSPERR(TSS_E_BAD_PARAMETER); 808 goto done; 809 } 810 memcpy(migdata->maDigest.digest, digests, sizeof(migdata->maDigest.digest)); 811 digests += sizeof(migdata->maDigest.digest); 812 memcpy(migdata->destDigest.digest, digests, sizeof(migdata->destDigest.digest)); 813 digests += sizeof(migdata->destDigest.digest); 814 memcpy(migdata->srcDigest.digest, digests, sizeof(migdata->srcDigest.digest)); 815 816 obj_migdata_calc_sig_data_digest(migdata); 817 818 done: 819 obj_list_put(&migdata_list); 820 821 return result; 822 } 823 824 TSS_RESULT 825 obj_migdata_get_cmk_auth(TSS_HMIGDATA hMigData, TPM_CMK_AUTH *cmkAuth) 826 { 827 struct tsp_object *obj; 828 struct tr_migdata_obj *migdata; 829 830 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 831 return TSPERR(TSS_E_INVALID_HANDLE); 832 833 migdata = (struct tr_migdata_obj *)obj->data; 834 835 cmkAuth->migrationAuthorityDigest = migdata->maDigest; 836 cmkAuth->destinationKeyDigest = migdata->destDigest; 837 cmkAuth->sourceKeyDigest = migdata->srcDigest; 838 839 obj_list_put(&migdata_list); 840 841 return TSS_SUCCESS; 842 } 843 844 TSS_RESULT 845 obj_migdata_get_cmk_auth_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **cmkAuthBlob) 846 { 847 struct tsp_object *obj; 848 TPM_CMK_AUTH cmkAuth; 849 UINT64 offset; 850 TSS_RESULT result; 851 852 if ((result = obj_migdata_get_cmk_auth(hMigData, &cmkAuth))) 853 return result; 854 855 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 856 return TSPERR(TSS_E_INVALID_HANDLE); 857 858 offset = 0; 859 Trspi_LoadBlob_CMK_AUTH(&offset, NULL, &cmkAuth); 860 861 *blobSize = offset; 862 if ((*cmkAuthBlob = calloc_tspi(obj->tspContext, *blobSize)) == NULL) { 863 LogError("malloc of %u bytes failed.", *blobSize); 864 result = TSPERR(TSS_E_OUTOFMEMORY); 865 goto done; 866 } 867 offset = 0; 868 Trspi_LoadBlob_CMK_AUTH(&offset, *cmkAuthBlob, &cmkAuth); 869 870 done: 871 obj_list_put(&migdata_list); 872 873 return result; 874 } 875 876 TSS_RESULT 877 obj_migdata_set_sig_data(TSS_HMIGDATA hMigData, UINT32 sigDataSize, BYTE *sigData) 878 { 879 struct tsp_object *obj; 880 struct tr_migdata_obj *migdata; 881 TSS_RESULT result = TSS_SUCCESS; 882 883 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 884 return TSPERR(TSS_E_INVALID_HANDLE); 885 886 migdata = (struct tr_migdata_obj *)obj->data; 887 888 if (sigDataSize != sizeof(migdata->sigData.digest)) { 889 result = TSPERR(TSS_E_BAD_PARAMETER); 890 goto done; 891 } 892 memcpy(migdata->sigData.digest, sigData, sizeof(migdata->sigData.digest)); 893 894 done: 895 obj_list_put(&migdata_list); 896 897 return result; 898 } 899 900 TSS_RESULT 901 obj_migdata_get_sig_data(TSS_HMIGDATA hMigData, UINT32 *sigDataSize, BYTE **sigData) 902 { 903 struct tsp_object *obj; 904 struct tr_migdata_obj *migdata; 905 TSS_RESULT result = TSS_SUCCESS; 906 907 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 908 return TSPERR(TSS_E_INVALID_HANDLE); 909 910 migdata = (struct tr_migdata_obj *)obj->data; 911 912 if ((*sigData = calloc_tspi(obj->tspContext, sizeof(migdata->sigData.digest))) == NULL) { 913 LogError("malloc of %zd bytes failed.", sizeof(migdata->sigData.digest)); 914 result = TSPERR(TSS_E_OUTOFMEMORY); 915 goto done; 916 } 917 memcpy(*sigData, migdata->sigData.digest, sizeof(migdata->sigData.digest)); 918 *sigDataSize = sizeof(migdata->sigData.digest); 919 920 done: 921 obj_list_put(&migdata_list); 922 923 return result; 924 } 925 926 TSS_RESULT 927 obj_migdata_set_sig_value(TSS_HMIGDATA hMigData, UINT32 sigValueSize, BYTE *sigValue) 928 { 929 struct tsp_object *obj; 930 struct tr_migdata_obj *migdata; 931 TSS_RESULT result = TSS_SUCCESS; 932 933 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 934 return TSPERR(TSS_E_INVALID_HANDLE); 935 936 migdata = (struct tr_migdata_obj *)obj->data; 937 938 migdata->sigValueSize = 0; 939 free(migdata->sigValue); 940 if ((migdata->sigValue = malloc(sigValueSize)) == NULL) { 941 LogError("malloc of %u bytes failed.", sigValueSize); 942 result = TSPERR(TSS_E_OUTOFMEMORY); 943 goto done; 944 } 945 memcpy(migdata->sigValue, sigValue, sigValueSize); 946 migdata->sigValueSize = sigValueSize; 947 948 done: 949 obj_list_put(&migdata_list); 950 951 return result; 952 } 953 954 TSS_RESULT 955 obj_migdata_get_sig_value(TSS_HMIGDATA hMigData, UINT32 *sigValueSize, BYTE **sigValue) 956 { 957 struct tsp_object *obj; 958 struct tr_migdata_obj *migdata; 959 TSS_RESULT result = TSS_SUCCESS; 960 961 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 962 return TSPERR(TSS_E_INVALID_HANDLE); 963 964 migdata = (struct tr_migdata_obj *)obj->data; 965 966 if ((*sigValue = calloc_tspi(obj->tspContext, migdata->sigValueSize)) == NULL) { 967 LogError("malloc of %u bytes failed.", migdata->sigValueSize); 968 result = TSPERR(TSS_E_OUTOFMEMORY); 969 goto done; 970 } 971 memcpy(*sigValue, migdata->sigValue, migdata->sigValueSize); 972 *sigValueSize = migdata->sigValueSize; 973 974 done: 975 obj_list_put(&migdata_list); 976 977 return result; 978 } 979 980 TSS_RESULT 981 obj_migdata_set_sig_ticket(TSS_HMIGDATA hMigData, UINT32 sigTicketSize, BYTE *sigTicket) 982 { 983 struct tsp_object *obj; 984 struct tr_migdata_obj *migdata; 985 TSS_RESULT result = TSS_SUCCESS; 986 987 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 988 return TSPERR(TSS_E_INVALID_HANDLE); 989 990 migdata = (struct tr_migdata_obj *)obj->data; 991 992 if (sigTicketSize != sizeof(migdata->sigTicket.digest)) { 993 result = TSPERR(TSS_E_BAD_PARAMETER); 994 goto done; 995 } 996 memcpy(migdata->sigTicket.digest, sigTicket, sizeof(migdata->sigTicket.digest)); 997 998 done: 999 obj_list_put(&migdata_list); 1000 1001 return result; 1002 } 1003 1004 TSS_RESULT 1005 obj_migdata_get_sig_ticket(TSS_HMIGDATA hMigData, UINT32 *sigTicketSize, BYTE **sigTicket) 1006 { 1007 struct tsp_object *obj; 1008 struct tr_migdata_obj *migdata; 1009 TSS_RESULT result = TSS_SUCCESS; 1010 1011 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 1012 return TSPERR(TSS_E_INVALID_HANDLE); 1013 1014 migdata = (struct tr_migdata_obj *)obj->data; 1015 1016 if ((*sigTicket = calloc_tspi(obj->tspContext, sizeof(migdata->sigTicket.digest))) == NULL) { 1017 LogError("malloc of %zd bytes failed.", sizeof(migdata->sigTicket.digest)); 1018 result = TSPERR(TSS_E_OUTOFMEMORY); 1019 goto done; 1020 } 1021 memcpy(*sigTicket, migdata->sigTicket.digest, sizeof(migdata->sigTicket.digest)); 1022 *sigTicketSize = sizeof(migdata->sigTicket.digest); 1023 1024 done: 1025 obj_list_put(&migdata_list); 1026 1027 return result; 1028 } 1029 1030 TSS_RESULT 1031 obj_migdata_set_blob(TSS_HMIGDATA hMigData, UINT32 blobSize, BYTE *blob) 1032 { 1033 struct tsp_object *obj; 1034 struct tr_migdata_obj *migdata; 1035 TSS_RESULT result = TSS_SUCCESS; 1036 1037 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 1038 return TSPERR(TSS_E_INVALID_HANDLE); 1039 1040 migdata = (struct tr_migdata_obj *)obj->data; 1041 1042 migdata->blobSize = 0; 1043 free(migdata->blob); 1044 if ((migdata->blob = malloc(blobSize)) == NULL) { 1045 LogError("malloc of %u bytes failed.", blobSize); 1046 result = TSPERR(TSS_E_OUTOFMEMORY); 1047 goto done; 1048 } 1049 memcpy(migdata->blob, blob, blobSize); 1050 migdata->blobSize = blobSize; 1051 1052 done: 1053 obj_list_put(&migdata_list); 1054 1055 return result; 1056 } 1057 1058 TSS_RESULT 1059 obj_migdata_get_blob(TSS_HMIGDATA hMigData, UINT32 *blobSize, BYTE **blob) 1060 { 1061 struct tsp_object *obj; 1062 struct tr_migdata_obj *migdata; 1063 TSS_RESULT result = TSS_SUCCESS; 1064 1065 if ((obj = obj_list_get_obj(&migdata_list, hMigData)) == NULL) 1066 return TSPERR(TSS_E_INVALID_HANDLE); 1067 1068 migdata = (struct tr_migdata_obj *)obj->data; 1069 1070 if ((*blob = calloc_tspi(obj->tspContext, migdata->blobSize)) == NULL) { 1071 LogError("malloc of %u bytes failed.", migdata->blobSize); 1072 result = TSPERR(TSS_E_OUTOFMEMORY); 1073 goto done; 1074 } 1075 memcpy(*blob, migdata->blob, migdata->blobSize); 1076 *blobSize = migdata->blobSize; 1077 1078 done: 1079 obj_list_put(&migdata_list); 1080 1081 return result; 1082 } 1083 1084 1085 TSS_RESULT 1086 obj_migdata_calc_pubkey_digest(UINT32 blobSize, BYTE *blob, TPM_DIGEST *digest) 1087 { 1088 Trspi_HashCtx hashCtx; 1089 TSS_RESULT result; 1090 1091 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 1092 result |= Trspi_HashUpdate(&hashCtx, blobSize, blob); 1093 result |= Trspi_HashFinal(&hashCtx, digest->digest); 1094 1095 return result; 1096 } 1097 1098 TSS_RESULT 1099 obj_migdata_calc_msa_digest(struct tr_migdata_obj *migdata) 1100 { 1101 Trspi_HashCtx hashCtx; 1102 TSS_RESULT result; 1103 1104 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 1105 result |= Trspi_Hash_MSA_COMPOSITE(&hashCtx, &migdata->msaList); 1106 result |= Trspi_HashFinal(&hashCtx, migdata->msaDigest.digest); 1107 1108 return result; 1109 } 1110 1111 TSS_RESULT 1112 obj_migdata_calc_sig_data_digest(struct tr_migdata_obj *migdata) 1113 { 1114 Trspi_HashCtx hashCtx; 1115 TSS_RESULT result; 1116 1117 result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); 1118 result |= Trspi_Hash_DIGEST(&hashCtx, migdata->maDigest.digest); 1119 result |= Trspi_Hash_DIGEST(&hashCtx, migdata->destDigest.digest); 1120 result |= Trspi_Hash_DIGEST(&hashCtx, migdata->srcDigest.digest); 1121 result |= Trspi_HashFinal(&hashCtx, migdata->sigData.digest); 1122 1123 return result; 1124 } 1125