xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/obj_migdata.c (revision 1023804e3833a0bd94414f2545512128f6502c74)
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
migdata_free(void * data)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
obj_is_migdata(TSS_HOBJECT hObject)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
obj_migdata_add(TSS_HCONTEXT hContext,TSS_HOBJECT * phObject)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
obj_migdata_remove(TSS_HMIGDATA hMigData,TSS_HCONTEXT hContext)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
obj_migdata_get_tsp_context(TSS_HMIGDATA hMigData,TSS_HCONTEXT * hContext)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
obj_migdata_set_migrationblob(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 blobSize,BYTE * blob)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
obj_migdata_get_migrationblob(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 * blobSize,BYTE ** blob)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
obj_migdata_set_authoritydata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 blobSize,BYTE * blob)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
obj_migdata_get_authoritydata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 * blobSize,BYTE ** blob)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
obj_migdata_set_migauthdata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 blobSize,BYTE * blob)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
obj_migdata_get_migauthdata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 * blobSize,BYTE ** blob)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
obj_migdata_set_ticketdata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 blobSize,BYTE * blob)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
obj_migdata_get_ticketdata(TSS_HMIGDATA hMigData,UINT32 whichOne,UINT32 * blobSize,BYTE ** blob)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
obj_migdata_set_ticket_blob(TSS_HMIGDATA hMigData,UINT32 migTicketSize,BYTE * migTicket)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
obj_migdata_get_ticket_blob(TSS_HMIGDATA hMigData,UINT32 * migTicketSize,BYTE ** migTicket)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
obj_migdata_set_msa_list(TSS_HMIGDATA hMigData,UINT32 msaListSize,BYTE * msaList)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
obj_migdata_get_msa_list(TSS_HMIGDATA hMigData,UINT32 * size,BYTE ** msaList)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
obj_migdata_set_msa_pubkey(TSS_HMIGDATA hMigData,UINT32 blobSize,BYTE * pubKeyBlob)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
obj_migdata_set_msa_digest(TSS_HMIGDATA hMigData,UINT32 digestSize,BYTE * digest)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
obj_migdata_get_msa_digest(TSS_HMIGDATA hMigData,UINT32 * digestSize,BYTE ** digest)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
obj_migdata_get_msa_list_blob(TSS_HMIGDATA hMigData,UINT32 * blobSize,BYTE ** msaListBlob)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
obj_migdata_set_msa_hmac(TSS_HMIGDATA hMigData,UINT32 hmacSize,BYTE * hmac)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
obj_migdata_get_msa_hmac(TSS_HMIGDATA hMigData,UINT32 * hmacSize,BYTE ** hmac)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
obj_migdata_set_ma_pubkey(TSS_HMIGDATA hMigData,UINT32 blobSize,BYTE * pubKeyBlob)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
obj_migdata_set_ma_digest(TSS_HMIGDATA hMigData,UINT32 digestSize,BYTE * digest)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
obj_migdata_get_ma_digest(TSS_HMIGDATA hMigData,UINT32 * digestSize,BYTE ** digest)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
obj_migdata_set_dest_pubkey(TSS_HMIGDATA hMigData,UINT32 blobSize,BYTE * pubKeyBlob)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
obj_migdata_set_dest_digest(TSS_HMIGDATA hMigData,UINT32 digestSize,BYTE * digest)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
obj_migdata_get_dest_digest(TSS_HMIGDATA hMigData,UINT32 * digestSize,BYTE ** digest)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
obj_migdata_set_src_pubkey(TSS_HMIGDATA hMigData,UINT32 blobSize,BYTE * pubKeyBlob)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
obj_migdata_set_src_digest(TSS_HMIGDATA hMigData,UINT32 digestSize,BYTE * digest)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
obj_migdata_get_src_digest(TSS_HMIGDATA hMigData,UINT32 * digestSize,BYTE ** digest)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
obj_migdata_set_cmk_auth(TSS_HMIGDATA hMigData,UINT32 digestsSize,BYTE * digests)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
obj_migdata_get_cmk_auth(TSS_HMIGDATA hMigData,TPM_CMK_AUTH * cmkAuth)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
obj_migdata_get_cmk_auth_blob(TSS_HMIGDATA hMigData,UINT32 * blobSize,BYTE ** cmkAuthBlob)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
obj_migdata_set_sig_data(TSS_HMIGDATA hMigData,UINT32 sigDataSize,BYTE * sigData)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
obj_migdata_get_sig_data(TSS_HMIGDATA hMigData,UINT32 * sigDataSize,BYTE ** sigData)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
obj_migdata_set_sig_value(TSS_HMIGDATA hMigData,UINT32 sigValueSize,BYTE * sigValue)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
obj_migdata_get_sig_value(TSS_HMIGDATA hMigData,UINT32 * sigValueSize,BYTE ** sigValue)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
obj_migdata_set_sig_ticket(TSS_HMIGDATA hMigData,UINT32 sigTicketSize,BYTE * sigTicket)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
obj_migdata_get_sig_ticket(TSS_HMIGDATA hMigData,UINT32 * sigTicketSize,BYTE ** sigTicket)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
obj_migdata_set_blob(TSS_HMIGDATA hMigData,UINT32 blobSize,BYTE * blob)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
obj_migdata_get_blob(TSS_HMIGDATA hMigData,UINT32 * blobSize,BYTE ** blob)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
obj_migdata_calc_pubkey_digest(UINT32 blobSize,BYTE * blob,TPM_DIGEST * digest)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
obj_migdata_calc_msa_digest(struct tr_migdata_obj * migdata)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
obj_migdata_calc_sig_data_digest(struct tr_migdata_obj * migdata)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