3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2004-2007
17
#include <sys/types.h>
23
#include "trousers/tss.h"
24
#include "trousers_types.h"
26
#include "tcs_utils.h"
27
#include "tcs_int_literals.h"
28
#include "capabilities.h"
33
#define TSS_TPM_RSP_BLOB_AUTH_LEN (sizeof(TPM_NONCE) + sizeof(TPM_DIGEST) + sizeof(TPM_BOOL))
36
tpm_rsp_parse(TPM_COMMAND_CODE ordinal, BYTE *b, UINT32 len, ...)
38
TSS_RESULT result = TSS_SUCCESS;
39
UINT64 offset1, offset2;
48
case TPM_ORD_ExecuteTransport:
50
UINT32 *val1 = va_arg(ap, UINT32 *);
51
UINT32 *val2 = va_arg(ap, UINT32 *);
52
UINT32 *len1 = va_arg(ap, UINT32 *);
53
BYTE **blob1 = va_arg(ap, BYTE **);
54
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
55
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
59
offset1 = offset2 = len - (2 * TSS_TPM_RSP_BLOB_AUTH_LEN);
60
UnloadBlob_Auth(&offset1, b, auth1);
61
UnloadBlob_Auth(&offset1, b, auth2);
63
offset1 = offset2 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
64
UnloadBlob_Auth(&offset1, b, auth1);
66
offset1 = offset2 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
67
UnloadBlob_Auth(&offset1, b, auth2);
71
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
73
UnloadBlob_UINT32(&offset1, val1, b);
75
UnloadBlob_UINT32(&offset1, val2, b);
77
*len1 = offset2 - offset1;
79
if ((*blob1 = malloc(*len1)) == NULL) {
80
LogError("malloc of %u bytes failed", *len1);
81
return TCSERR(TSS_E_OUTOFMEMORY);
83
UnloadBlob(&offset1, *len1, b, *blob1);
89
/* TPM BLOB: TPM_CURRENT_TICKS, UINT32, BLOB, optional AUTH */
90
case TPM_ORD_TickStampBlob:
92
UINT32 *len1 = va_arg(ap, UINT32 *);
93
BYTE **blob1 = va_arg(ap, BYTE **);
94
UINT32 *len2 = va_arg(ap, UINT32 *);
95
BYTE **blob2 = va_arg(ap, BYTE **);
96
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
99
if (!len1 || !blob1 || !len2 || !blob2) {
100
LogError("Internal error for ordinal 0x%x", ordinal);
101
return TCSERR(TSS_E_INTERNAL_ERROR);
105
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
106
UnloadBlob_Auth(&offset1, b, auth1);
109
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
110
UnloadBlob_CURRENT_TICKS(&offset2, b, NULL);
111
*len1 = (UINT32)offset2 - offset1;
113
if ((*blob1 = malloc(*len1)) == NULL) {
114
LogError("malloc of %u bytes failed", *len1);
115
return TCSERR(TSS_E_OUTOFMEMORY);
118
UnloadBlob(&offset1, *len1, b, *blob1);
119
UnloadBlob_UINT32(&offset1, len2, b);
121
if ((*blob2 = malloc(*len2)) == NULL) {
122
LogError("malloc of %u bytes failed", *len2);
127
return TCSERR(TSS_E_OUTOFMEMORY);
129
UnloadBlob(&offset1, *len2, b, *blob2);
133
/* TPM BLOB: TPM_PCR_COMPOSITE, UINT32, BLOB, 1 optional AUTH
134
* return UINT32*, BYTE**, UINT32*, BYTE**, 1 optional AUTH */
137
UINT32 *len1 = va_arg(ap, UINT32 *);
138
BYTE **blob1 = va_arg(ap, BYTE **);
139
UINT32 *len2 = va_arg(ap, UINT32 *);
140
BYTE **blob2 = va_arg(ap, BYTE **);
141
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
144
if (!len1 || !blob1 || !len2 || !blob2) {
145
LogError("Internal error for ordinal 0x%x", ordinal);
146
return TCSERR(TSS_E_INTERNAL_ERROR);
150
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
151
UnloadBlob_Auth(&offset1, b, auth1);
154
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
155
UnloadBlob_PCR_COMPOSITE(&offset2, b, NULL);
156
*len1 = offset2 - offset1;
158
if ((*blob1 = malloc(*len1)) == NULL) {
159
LogError("malloc of %u bytes failed", *len1);
160
return TCSERR(TSS_E_OUTOFMEMORY);
162
UnloadBlob(&offset1, *len1, b, *blob1);
163
UnloadBlob_UINT32(&offset1, len2, b);
165
if ((*blob2 = malloc(*len2)) == NULL) {
166
LogError("malloc of %u bytes failed", *len2);
171
return TCSERR(TSS_E_OUTOFMEMORY);
173
UnloadBlob(&offset1, *len2, b, *blob2);
177
/* TPM BLOB: TPM_PCR_INFO_SHORT, (UINT32, BLOB,) UINT32, BLOB, 1 optional AUTH */
180
UINT32 *len1 = va_arg(ap, UINT32 *); /* pcrDataSizeOut */
181
BYTE **blob1 = va_arg(ap, BYTE **); /* pcrDataOut */
182
TSS_BOOL *addVersion = va_arg(ap, TSS_BOOL *); /* addVersion */
183
UINT32 *len2 = va_arg(ap, UINT32 *); /* versionInfoSize */
184
BYTE **blob2 = va_arg(ap, BYTE **); /* versionInfo */
185
UINT32 *len3 = va_arg(ap, UINT32 *); /* sigSize */
186
BYTE **blob3 = va_arg(ap, BYTE **); /* sig */
187
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *); /* privAuth */
190
if (!len1 || !blob1 || !len2 || !blob2 || !len3 || !blob3 || !addVersion) {
191
LogError("Internal error for ordinal 0x%x", ordinal);
192
return TCSERR(TSS_E_INTERNAL_ERROR);
196
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
197
UnloadBlob_Auth(&offset1, b, auth1);
200
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
201
/* Adjust the offset to take the TPM_PCR_INFO_SHORT size:
202
* need to allocate this size into blob1
204
UnloadBlob_PCR_INFO_SHORT(&offset2, b, NULL);
206
/* Get the size of the TSS_TPM_INFO_SHORT
207
* and copy it into blob1 */
208
*len1 = offset2 - offset1;
209
LogDebugFn("QUOTE2 Core: PCR_INFO_SHORT is %u size", *len1);
210
if ((*blob1 = malloc(*len1)) == NULL) {
211
LogError("malloc of %u bytes failed", *len1);
212
return TCSERR(TSS_E_OUTOFMEMORY);
214
UnloadBlob(&offset1, *len1, b, *blob1); /* TPM_PCR_INFO_SHORT */
216
UnloadBlob_UINT32(&offset1, len2,b); /* versionInfoSize */
217
LogDebugFn("QUOTE2 Core: versionInfoSize=%u", *len2);
218
if ((*blob2 = malloc(*len2)) == NULL) {
219
LogError("malloc of %u bytes failed", *len2);
226
return TCSERR(TSS_E_OUTOFMEMORY);
228
UnloadBlob(&offset1, *len2, b, *blob2);
230
/* Take the sigSize */
231
UnloadBlob_UINT32(&offset1, len3, b);
232
LogDebugFn("QUOTE2 Core: sigSize=%u", *len3);
234
if ((*blob3 = malloc(*len3)) == NULL) {
235
LogError("malloc of %u bytes failed", *len3);
245
return TCSERR(TSS_E_OUTOFMEMORY);
247
UnloadBlob(&offset1, *len3, b, *blob3);
250
/* TPM BLOB: TPM_CERTIFY_INFO, UINT32, BLOB, 2 optional AUTHs
251
* return UINT32*, BYTE**, UINT32*, BYTE**, 2 optional AUTHs */
252
case TPM_ORD_CertifyKey:
254
UINT32 *len1 = va_arg(ap, UINT32 *);
255
BYTE **blob1 = va_arg(ap, BYTE **);
256
UINT32 *len2 = va_arg(ap, UINT32 *);
257
BYTE **blob2 = va_arg(ap, BYTE **);
258
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
259
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
262
if (!len1 || !blob1 || !len2 || !blob2) {
263
LogError("Internal error for ordinal 0x%x", ordinal);
264
return TCSERR(TSS_E_INTERNAL_ERROR);
267
if (auth1 && auth2) {
268
offset1 = len - (2 * TSS_TPM_RSP_BLOB_AUTH_LEN);
269
UnloadBlob_Auth(&offset1, b, auth1);
270
UnloadBlob_Auth(&offset1, b, auth2);
272
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
273
UnloadBlob_Auth(&offset1, b, auth1);
275
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
276
UnloadBlob_Auth(&offset1, b, auth2);
279
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
280
UnloadBlob_CERTIFY_INFO(&offset2, b, NULL);
281
*len1 = offset2 - offset1;
283
if ((*blob1 = malloc(*len1)) == NULL) {
284
LogError("malloc of %u bytes failed", *len1);
285
return TCSERR(TSS_E_OUTOFMEMORY);
287
UnloadBlob(&offset1, *len1, b, *blob1);
288
UnloadBlob_UINT32(&offset1, len2, b);
290
if ((*blob2 = malloc(*len2)) == NULL) {
291
LogError("malloc of %u bytes failed", *len2);
296
return TCSERR(TSS_E_OUTOFMEMORY);
298
UnloadBlob(&offset1, *len2, b, *blob2);
302
/* TPM_BLOB: TPM_COUNTER_VALUE, DIGEST, DIGEST, UINT32, BLOB, optional AUTH
303
* return: UINT32*, BYTE**, DIGEST*, DIGEST*, UINT32*, BYTE**, optional AUTH */
304
case TPM_ORD_GetAuditDigestSigned:
306
UINT32 *len1 = va_arg(ap, UINT32 *);
307
BYTE **blob1 = va_arg(ap, BYTE **);
308
TPM_DIGEST *digest1 = va_arg(ap, TPM_DIGEST *);
309
TPM_DIGEST *digest2 = va_arg(ap, TPM_DIGEST *);
310
UINT32 *len2 = va_arg(ap, UINT32 *);
311
BYTE **blob2 = va_arg(ap, BYTE **);
312
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
315
if (!digest1 || !digest2 || !len1 || !blob1 || !len2 || !blob2) {
316
LogError("Internal error for ordinal 0x%x", ordinal);
317
return TCSERR(TSS_E_INTERNAL_ERROR);
320
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
321
UnloadBlob_COUNTER_VALUE(&offset2, b, NULL);
322
*len1 = offset2 - offset1;
324
if ((*blob1 = malloc(*len1)) == NULL) {
325
LogError("malloc of %u bytes failed", *len1);
326
return TCSERR(TSS_E_OUTOFMEMORY);
328
UnloadBlob(&offset1, *len1, b, *blob1);
330
UnloadBlob_DIGEST(&offset1, b, digest1);
331
UnloadBlob_DIGEST(&offset1, b, digest2);
332
UnloadBlob_UINT32(&offset1, len2, b);
334
if ((*blob2 = malloc(*len2)) == NULL) {
335
LogError("malloc of %u bytes failed", *len2);
340
return TCSERR(TSS_E_OUTOFMEMORY);
342
UnloadBlob(&offset1, *len2, b, *blob2);
345
UnloadBlob_Auth(&offset1, b, auth1);
349
/* TPM_BLOB: TPM_COUNTER_VALUE, DIGEST, BOOL, UINT32, BLOB
350
* return: DIGEST*, UINT32*, BYTE**, BOOL, UINT32*, BYTE** */
351
case TPM_ORD_GetAuditDigest:
353
TPM_DIGEST *digest1 = va_arg(ap, TPM_DIGEST *);
354
UINT32 *len1 = va_arg(ap, UINT32 *);
355
BYTE **blob1 = va_arg(ap, BYTE **);
356
TSS_BOOL *bool1 = va_arg(ap, TSS_BOOL *);
357
UINT32 *len2 = va_arg(ap, UINT32 *);
358
BYTE **blob2 = va_arg(ap, BYTE **);
361
if (!digest1 || !len1 || !blob1 || !len2 || !blob2 || !bool1) {
362
LogError("Internal error for ordinal 0x%x", ordinal);
363
return TCSERR(TSS_E_INTERNAL_ERROR);
366
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
367
UnloadBlob_COUNTER_VALUE(&offset2, b, NULL);
368
*len1 = offset2 - offset1;
370
if ((*blob1 = malloc(*len1)) == NULL) {
371
LogError("malloc of %u bytes failed", *len1);
372
return TCSERR(TSS_E_OUTOFMEMORY);
374
UnloadBlob(&offset1, *len1, b, *blob1);
376
UnloadBlob_DIGEST(&offset1, b, digest1);
377
UnloadBlob_BOOL(&offset1, bool1, b);
378
UnloadBlob_UINT32(&offset1, len2, b);
380
if ((*blob2 = malloc(*len2)) == NULL) {
381
LogError("malloc of %u bytes failed", *len2);
386
return TCSERR(TSS_E_OUTOFMEMORY);
388
UnloadBlob(&offset1, *len2, b, *blob2);
392
/* optional UINT32, TPM_COUNTER_VALUE, optional AUTH */
393
case TPM_ORD_ReadCounter:
394
case TPM_ORD_CreateCounter:
395
case TPM_ORD_IncrementCounter:
397
UINT32 *val1 = va_arg(ap, UINT32 *);
398
TPM_COUNTER_VALUE *ctr = va_arg(ap, TPM_COUNTER_VALUE *);
399
TPM_AUTH * auth1 = va_arg(ap, TPM_AUTH *);
403
LogError("Internal error for ordinal 0x%x", ordinal);
404
return TCSERR(TSS_E_INTERNAL_ERROR);
408
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
409
UnloadBlob_Auth(&offset1, b, auth1);
412
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
414
UnloadBlob_UINT32(&offset1, val1, b);
415
UnloadBlob_COUNTER_VALUE(&offset1, b, ctr);
419
/* TPM BLOB: UINT32, BLOB, UINT32, BLOB, optional AUTH, optional AUTH */
420
case TPM_ORD_CreateMaintenanceArchive:
421
case TPM_ORD_CreateMigrationBlob:
422
case TPM_ORD_Delegate_ReadTable:
423
case TPM_ORD_CMK_CreateBlob:
425
UINT32 *len1 = va_arg(ap, UINT32 *);
426
BYTE **blob1 = va_arg(ap, BYTE **);
427
UINT32 *len2 = va_arg(ap, UINT32 *);
428
BYTE **blob2 = va_arg(ap, BYTE **);
429
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
430
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
433
if (!len1 || !blob1 || !len2 || !blob2) {
434
LogError("Internal error for ordinal 0x%x", ordinal);
435
return TCSERR(TSS_E_INTERNAL_ERROR);
438
if (auth1 && auth2) {
439
offset1 = len - (2 * TSS_TPM_RSP_BLOB_AUTH_LEN);
440
UnloadBlob_Auth(&offset1, b, auth1);
441
UnloadBlob_Auth(&offset1, b, auth2);
443
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
444
UnloadBlob_Auth(&offset1, b, auth1);
446
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
447
UnloadBlob_Auth(&offset1, b, auth2);
450
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
451
UnloadBlob_UINT32(&offset1, len1, b);
452
if ((*blob1 = malloc(*len1)) == NULL) {
453
LogError("malloc of %u bytes failed", *len1);
454
return TCSERR(TSS_E_OUTOFMEMORY);
457
UnloadBlob(&offset1, *len1, b, *blob1);
459
UnloadBlob_UINT32(&offset1, len2, b);
460
if ((*blob2 = malloc(*len2)) == NULL) {
461
LogError("malloc of %u bytes failed", *len2);
462
return TCSERR(TSS_E_OUTOFMEMORY);
465
UnloadBlob(&offset1, *len2, b, *blob2);
469
/* TPM BLOB: BLOB, optional AUTH, AUTH
470
* return: UINT32 *, BYTE **, optional AUTH, AUTH */
471
case TPM_ORD_ActivateIdentity:
473
UINT32 *len1 = va_arg(ap, UINT32 *);
474
BYTE **blob1 = va_arg(ap, BYTE **);
475
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
476
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
479
if (!len1 || !blob1 || !auth2) {
480
LogError("Internal error for ordinal 0x%x", ordinal);
481
return TCSERR(TSS_E_INTERNAL_ERROR);
484
if (auth1 && auth2) {
485
offset1 = offset2 = len - (2 * TSS_TPM_RSP_BLOB_AUTH_LEN);
486
UnloadBlob_Auth(&offset1, b, auth1);
487
UnloadBlob_Auth(&offset1, b, auth2);
489
offset1 = offset2 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
490
UnloadBlob_Auth(&offset1, b, auth2);
494
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
495
offset2 -= TSS_TPM_TXBLOB_HDR_LEN;
496
if ((*blob1 = malloc(offset2)) == NULL) {
497
LogError("malloc of %zd bytes failed", (size_t)offset2);
498
return TCSERR(TSS_E_OUTOFMEMORY);
501
UnloadBlob(&offset1, *len1, b, *blob1);
505
/* TPM BLOB: TPM_KEY, UINT32, BLOB, optional AUTH, AUTH
506
* return: UINT32 *, BYTE **, UINT32 *, BYTE **, optional AUTH, AUTH */
507
case TPM_ORD_MakeIdentity:
510
BYTE **blob1, **blob2;
511
TPM_AUTH *auth1, *auth2;
513
len1 = va_arg(ap, UINT32 *);
514
blob1 = va_arg(ap, BYTE **);
515
len2 = va_arg(ap, UINT32 *);
516
blob2 = va_arg(ap, BYTE **);
517
auth1 = va_arg(ap, TPM_AUTH *);
518
auth2 = va_arg(ap, TPM_AUTH *);
521
if (!len1 || !blob1 || !len2 || !blob2 || !auth2) {
522
LogError("Internal error for ordinal 0x%x", ordinal);
523
return TCSERR(TSS_E_INTERNAL_ERROR);
526
offset1 = offset2 = TSS_TPM_TXBLOB_HDR_LEN;
527
UnloadBlob_TSS_KEY(&offset1, b, NULL);
528
offset1 -= TSS_TPM_TXBLOB_HDR_LEN;
530
if ((*blob1 = malloc(offset1)) == NULL) {
531
LogError("malloc of %zd bytes failed", (size_t)offset1);
532
return TCSERR(TSS_E_OUTOFMEMORY);
536
UnloadBlob(&offset2, offset1, b, *blob1);
538
/* offset2 points to the stuff after the key */
539
UnloadBlob_UINT32(&offset2, len2, b);
541
if ((*blob2 = malloc(*len2)) == NULL) {
542
LogError("malloc of %u bytes failed", *len2);
543
return TCSERR(TSS_E_OUTOFMEMORY);
546
UnloadBlob(&offset2, *len2, b, *blob2);
549
UnloadBlob_Auth(&offset2, b, auth1);
550
UnloadBlob_Auth(&offset2, b, auth2);
554
/* 1 TPM_VERSION, 2 UINT32s, 1 optional AUTH */
555
case TPM_ORD_GetCapabilityOwner:
557
TPM_VERSION *ver1 = va_arg(ap, TPM_VERSION *);
558
UINT32 *data1 = va_arg(ap, UINT32 *);
559
UINT32 *data2 = va_arg(ap, UINT32 *);
560
TPM_AUTH *auth = va_arg(ap, TPM_AUTH *);
563
if (!data1 || !data2 || !ver1) {
564
LogError("Internal error for ordinal 0x%x", ordinal);
565
return TCSERR(TSS_E_INTERNAL_ERROR);
569
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
570
UnloadBlob_Auth(&offset1, b, auth);
573
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
574
UnloadBlob_VERSION(&offset1, b, ver1);
575
UnloadBlob_UINT32(&offset1, data1, b);
576
UnloadBlob_UINT32(&offset1, data2, b);
579
/* TPM BLOB: 1 UINT32, 1 BLOB, 2 optional AUTHs
580
* return: UINT32 *, BYTE**, 2 optional AUTHs */
582
case TPM_ORD_GetTestResult:
583
case TPM_ORD_CertifySelfTest:
585
case TPM_ORD_GetRandom:
586
case TPM_ORD_DAA_Join:
587
case TPM_ORD_DAA_Sign:
588
case TPM_ORD_ChangeAuth:
589
case TPM_ORD_GetCapability:
591
case TPM_ORD_LoadMaintenanceArchive:
592
case TPM_ORD_ConvertMigrationBlob:
593
case TPM_ORD_NV_ReadValue:
594
case TPM_ORD_NV_ReadValueAuth:
595
case TPM_ORD_Delegate_Manage:
596
case TPM_ORD_Delegate_CreateKeyDelegation:
597
case TPM_ORD_Delegate_CreateOwnerDelegation:
598
case TPM_ORD_Delegate_UpdateVerification:
599
case TPM_ORD_CMK_ConvertMigration:
601
UINT32 *data_len = va_arg(ap, UINT32 *);
602
BYTE **data = va_arg(ap, BYTE **);
603
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
604
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
607
if (!data || !data_len) {
608
LogError("Internal error for ordinal 0x%x", ordinal);
609
return TCSERR(TSS_E_INTERNAL_ERROR);
612
if (auth1 && auth2) {
613
offset1 = len - (2 * TSS_TPM_RSP_BLOB_AUTH_LEN);
614
UnloadBlob_Auth(&offset1, b, auth1);
615
UnloadBlob_Auth(&offset1, b, auth2);
617
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
618
UnloadBlob_Auth(&offset1, b, auth1);
620
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
621
UnloadBlob_Auth(&offset1, b, auth2);
624
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
625
UnloadBlob_UINT32(&offset1, data_len, b);
626
if ((*data = malloc(*data_len)) == NULL) {
627
LogError("malloc of %u bytes failed", *data_len);
628
return TCSERR(TSS_E_OUTOFMEMORY);
631
UnloadBlob(&offset1, *data_len, b, *data);
634
/* TPM BLOB: 1 BLOB, 1 optional AUTH
635
* return: UINT32 *, BYTE**, 1 optional AUTH*/
636
case TPM_ORD_GetTicks:
639
case TPM_ORD_FieldUpgrade:
640
case TPM_ORD_CreateWrapKey:
641
case TPM_ORD_GetPubKey:
642
case TPM_ORD_OwnerReadPubek:
643
case TPM_ORD_OwnerReadInternalPub:
644
case TPM_ORD_AuthorizeMigrationKey:
645
case TPM_ORD_TakeOwnership:
646
case TPM_ORD_CMK_CreateKey:
648
UINT32 *data_len = va_arg(ap, UINT32 *);
649
BYTE **data = va_arg(ap, BYTE **);
650
TPM_AUTH *auth = va_arg(ap, TPM_AUTH *);
653
if (!data || !data_len) {
654
LogError("Internal error for ordinal 0x%x", ordinal);
655
return TCSERR(TSS_E_INTERNAL_ERROR);
658
/* remove the auth data from the back end of the data */
660
offset1 = offset2 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
661
UnloadBlob_Auth(&offset1, b, auth);
665
/* everything after the header is returned as the blob */
666
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
668
if ((*data = malloc((size_t)offset2)) == NULL) {
669
LogError("malloc of %zd bytes failed", (size_t)offset2);
670
return TCSERR(TSS_E_OUTOFMEMORY);
673
memcpy(*data, &b[offset1], offset2);
677
/* TPM BLOB: BLOB, optional DIGEST */
678
case TPM_ORD_CreateEndorsementKeyPair:
679
case TPM_ORD_ReadPubek:
681
UINT32 *data_len = va_arg(ap, UINT32 *);
682
BYTE **data = va_arg(ap, BYTE **);
683
BYTE *digest1 = va_arg(ap, BYTE *);
686
if (!data || !data_len) {
687
LogError("Internal error for ordinal 0x%x", ordinal);
688
return TCSERR(TSS_E_INTERNAL_ERROR);
692
offset1 = offset2 = len - TPM_DIGEST_SIZE;
693
memcpy(digest1, &b[offset2], TPM_DIGEST_SIZE);
697
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
699
if ((*data = malloc((size_t)offset2)) == NULL) {
700
LogError("malloc of %zd bytes failed", (size_t)offset2);
701
return TCSERR(TSS_E_OUTOFMEMORY);
704
UnloadBlob(&offset1, offset2, b, *data);
708
/* TPM BLOB: BLOB, DIGEST, DIGEST
709
* return: UINT32 *, BYTE**, DIGEST, DIGEST */
710
case TPM_ORD_CreateRevocableEK:
712
UINT32 *data_len = va_arg(ap, UINT32 *);
713
BYTE **data = va_arg(ap, BYTE **);
714
BYTE *digest1 = va_arg(ap, BYTE *);
715
BYTE *digest2 = va_arg(ap, BYTE *);
718
if (!data || !data_len || !digest1 || !digest2) {
719
LogError("Internal error for ordinal 0x%x", ordinal);
720
return TCSERR(TSS_E_INTERNAL_ERROR);
723
offset2 = len - TPM_DIGEST_SIZE;
724
memcpy(digest2, &b[offset2], TPM_DIGEST_SIZE);
726
offset2 -= TPM_DIGEST_SIZE;
727
memcpy(digest1, &b[offset2], TPM_DIGEST_SIZE);
729
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
731
if ((*data = malloc((size_t)offset2)) == NULL) {
732
LogError("malloc of %zd bytes failed", (size_t)offset2);
733
return TCSERR(TSS_E_OUTOFMEMORY);
736
UnloadBlob(&offset1, offset2, b, *data);
740
/* 1 UINT32, 1 optional AUTH */
741
case TPM_ORD_LoadKey:
742
case TPM_ORD_LoadKey2:
747
handle = va_arg(ap, UINT32 *);
748
auth = va_arg(ap, TPM_AUTH *);
752
LogError("Internal error for ordinal 0x%x", ordinal);
753
return TCSERR(TSS_E_INTERNAL_ERROR);
757
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
758
UnloadBlob_Auth(&offset1, b, auth);
761
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
762
UnloadBlob_UINT32(&offset1, handle, b);
765
/* 1 optional UINT32, 1 20 byte value */
766
case TPM_ORD_DirRead:
768
case TPM_ORD_LoadManuMaintPub:
769
case TPM_ORD_ReadManuMaintPub:
771
case TPM_ORD_PcrRead:
773
UINT32 *handle = va_arg(ap, UINT32 *);
774
BYTE *nonce = va_arg(ap, BYTE *);
778
LogError("Internal error for ordinal 0x%x", ordinal);
779
return TCSERR(TSS_E_INTERNAL_ERROR);
782
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
784
UnloadBlob_UINT32(&offset1, handle, b);
785
UnloadBlob(&offset1, TPM_NONCE_SIZE, b, nonce);
788
/* 1 UINT32, 2 20 byte values */
792
UINT32 *handle = va_arg(ap, UINT32 *);
793
BYTE *nonce1 = va_arg(ap, BYTE *);
794
BYTE *nonce2 = va_arg(ap, BYTE *);
797
if (!handle || !nonce1 || !nonce2) {
798
LogError("Internal error for ordinal 0x%x", ordinal);
799
return TCSERR(TSS_E_INTERNAL_ERROR);
802
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
803
UnloadBlob_UINT32(&offset1, handle, b);
804
UnloadBlob(&offset1, TPM_NONCE_SIZE, b, nonce1);
805
UnloadBlob(&offset1, TPM_NONCE_SIZE, b, nonce2);
808
/* 1 20 byte value, 1 optional AUTH */
809
case TPM_ORD_CMK_ApproveMA:
810
case TPM_ORD_CMK_CreateTicket:
812
BYTE *hmac1 = va_arg(ap, BYTE *);
813
TPM_AUTH *auth = va_arg(ap, TPM_AUTH *);
817
LogError("Internal error for ordinal 0x%x", ordinal);
818
return TCSERR(TSS_E_INTERNAL_ERROR);
821
offset1 = TSS_TPM_TXBLOB_HDR_LEN;
822
UnloadBlob(&offset1, TPM_SHA1_160_HASH_LEN, b, hmac1);
824
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
825
UnloadBlob_Auth(&offset1, b, auth);
829
/* 1 optional AUTH */
830
case TPM_ORD_DisablePubekRead:
831
case TPM_ORD_DirWriteAuth:
832
case TPM_ORD_ReleaseCounter:
833
case TPM_ORD_ReleaseCounterOwner:
834
case TPM_ORD_ChangeAuthOwner:
835
case TPM_ORD_SetCapability:
836
case TPM_ORD_SetOrdinalAuditStatus:
837
case TPM_ORD_ResetLockValue:
838
case TPM_ORD_SetRedirection:
839
case TPM_ORD_DisableOwnerClear:
840
case TPM_ORD_OwnerSetDisable:
841
case TPM_ORD_SetTempDeactivated:
842
case TPM_ORD_KillMaintenanceFeature:
843
case TPM_ORD_NV_DefineSpace:
844
case TPM_ORD_NV_WriteValue:
845
case TPM_ORD_NV_WriteValueAuth:
846
case TPM_ORD_OwnerClear:
847
case TPM_ORD_Delegate_LoadOwnerDelegation:
848
case TPM_ORD_CMK_SetRestrictions:
849
case TPM_ORD_FlushSpecific:
850
case TPM_ORD_KeyControlOwner:
852
TPM_AUTH *auth = va_arg(ap, TPM_AUTH *);
856
offset1 = len - TSS_TPM_RSP_BLOB_AUTH_LEN;
857
UnloadBlob_Auth(&offset1, b, auth);
862
LogError("Unknown ordinal: 0x%x", ordinal);
863
result = TCSERR(TSS_E_INTERNAL_ERROR);
870
/* XXX optimize these cases by always passing in lengths for blobs, no more "20 byte values" */
872
tpm_rqu_build(TPM_COMMAND_CODE ordinal, UINT64 *outOffset, BYTE *out_blob, ...)
874
TSS_RESULT result = TCSERR(TSS_E_INTERNAL_ERROR);
878
DBG_ASSERT(outOffset);
879
DBG_ASSERT(out_blob);
881
va_start(ap, out_blob);
884
/* 1 UINT16, 1 UINT32, 1 20 bytes value, 1 UINT32, 1 BLOB */
887
UINT16 val1 = va_arg(ap, int);
888
UINT32 handle1 = va_arg(ap, UINT32);
889
BYTE *digest1 = va_arg(ap, BYTE *);
890
UINT32 in_len1 = va_arg(ap, UINT32);
891
BYTE *in_blob1 = va_arg(ap, BYTE *);
894
if (!digest1 || !in_blob1) {
895
LogError("Internal error for ordinal 0x%x", ordinal);
899
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
900
LoadBlob_UINT16(outOffset, val1, out_blob);
901
LoadBlob_UINT32(outOffset, handle1, out_blob);
902
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
903
LoadBlob_UINT32(outOffset, in_len1, out_blob);
904
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
905
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
907
result = TSS_SUCCESS;
910
/* 1 BOOL, 1 UINT32, 1 BLOB, 1 20 byte value, 1 AUTH */
911
case TPM_ORD_Delegate_CreateOwnerDelegation:
913
TSS_BOOL bool1 = va_arg(ap, int);
914
UINT32 in_len1 = va_arg(ap, UINT32);
915
BYTE *in_blob1 = va_arg(ap, BYTE *);
916
BYTE *digest1 = va_arg(ap, BYTE *);
917
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
920
if (!in_len1 || !in_blob1 || !digest1) {
921
LogError("Internal error for ordinal 0x%x", ordinal);
925
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
926
LoadBlob_BOOL(outOffset, bool1, out_blob);
927
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
928
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
930
LoadBlob_Auth(outOffset, out_blob, auth1);
931
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
933
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
935
result = TSS_SUCCESS;
938
/* 2 UINT32's, 1 BLOB, 1 20 byte value, 1 AUTH */
939
case TPM_ORD_Delegate_CreateKeyDelegation:
941
UINT32 keyslot1 = va_arg(ap, UINT32);
942
UINT32 in_len1 = va_arg(ap, UINT32);
943
BYTE *in_blob1 = va_arg(ap, BYTE *);
944
BYTE *digest1 = va_arg(ap, BYTE *);
945
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
948
if (!keyslot1 || !in_len1 || !in_blob1 || !digest1) {
949
LogError("Internal error for ordinal 0x%x", ordinal);
953
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
954
LoadBlob_UINT32(outOffset, keyslot1, out_blob);
955
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
956
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
958
LoadBlob_Auth(outOffset, out_blob, auth1);
959
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
961
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
963
result = TSS_SUCCESS;
966
/* 3 UINT32's, 1 BLOB, 2 AUTHs */
967
case TPM_ORD_ExecuteTransport:
969
UINT32 ord1 = va_arg(ap, UINT32);
970
UINT32 *keyslot1 = va_arg(ap, UINT32 *);
971
UINT32 *keyslot2 = va_arg(ap, UINT32 *);
972
UINT32 in_len1 = va_arg(ap, UINT32);
973
BYTE *in_blob1 = va_arg(ap, BYTE *);
974
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
975
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
978
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
980
LoadBlob_UINT32(outOffset, *keyslot1, out_blob);
982
LoadBlob_UINT32(outOffset, *keyslot2, out_blob);
983
//LoadBlob_UINT32(outOffset, in_len1, out_blob);
985
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
987
if (auth1 && auth2) {
988
LoadBlob_Auth(outOffset, out_blob, auth1);
989
LoadBlob_Auth(outOffset, out_blob, auth2);
990
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ord1, out_blob);
992
LoadBlob_Auth(outOffset, out_blob, auth1);
993
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ord1, out_blob);
995
LoadBlob_Auth(outOffset, out_blob, auth2);
996
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ord1, out_blob);
998
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ord1, out_blob);
1001
result = TSS_SUCCESS;
1004
/* 1 UINT32, 1 UINT16, 1 BLOB, 1 UINT32, 1 BLOB, 1 options AUTH, 1 AUTH */
1005
case TPM_ORD_CreateMigrationBlob:
1007
UINT32 keyslot1 = va_arg(ap, UINT32);
1008
UINT16 type1 = va_arg(ap, int);
1009
UINT32 in_len1 = va_arg(ap, UINT32);
1010
BYTE *in_blob1 = va_arg(ap, BYTE *);
1011
UINT32 in_len2 = va_arg(ap, UINT32);
1012
BYTE *in_blob2 = va_arg(ap, BYTE *);
1013
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1014
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
1017
if (!in_blob1 || !in_blob2 || !auth2) {
1018
LogError("Internal error for ordinal 0x%x", ordinal);
1022
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1023
LoadBlob_UINT32(outOffset, keyslot1, out_blob);
1024
LoadBlob_UINT16(outOffset, type1, out_blob);
1025
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1026
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1027
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1029
LoadBlob_Auth(outOffset, out_blob, auth1);
1030
LoadBlob_Auth(outOffset, out_blob, auth2);
1031
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1033
LoadBlob_Auth(outOffset, out_blob, auth2);
1034
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1037
result = TSS_SUCCESS;
1040
/* 1 UINT32, 1 UINT16, 1 20 byte value, 1 UINT16, 1 UINT32, 1 BLOB, 2 AUTHs */
1041
case TPM_ORD_ChangeAuth:
1043
UINT32 keyslot1 = va_arg(ap, UINT32);
1044
UINT16 proto1 = va_arg(ap, int);
1045
BYTE *digest1 = va_arg(ap, BYTE *);
1046
UINT16 entity1 = va_arg(ap, int);
1047
UINT32 in_len1 = va_arg(ap, UINT32);
1048
BYTE *in_blob1 = va_arg(ap, BYTE *);
1049
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1050
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
1053
if (!digest1 || !in_blob1 || !auth1 || !auth2) {
1054
LogError("Internal error for ordinal 0x%x", ordinal);
1058
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1059
LoadBlob_UINT32(outOffset, keyslot1, out_blob);
1060
LoadBlob_UINT16(outOffset, proto1, out_blob);
1061
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1062
LoadBlob_UINT16(outOffset, entity1, out_blob);
1063
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1064
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1065
LoadBlob_Auth(outOffset, out_blob, auth1);
1066
LoadBlob_Auth(outOffset, out_blob, auth2);
1067
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1069
result = TSS_SUCCESS;
1072
/* 2 DIGEST/ENCAUTH's, 1 UINT32, 1 BLOB, 1 optional AUTH, 1 AUTH */
1073
case TPM_ORD_MakeIdentity:
1075
BYTE *dig1, *dig2, *blob1;
1077
TPM_AUTH *auth1, *auth2;
1079
dig1 = va_arg(ap, BYTE *);
1080
dig2 = va_arg(ap, BYTE *);
1081
len1 = va_arg(ap, UINT32);
1082
blob1 = va_arg(ap, BYTE *);
1083
auth1 = va_arg(ap, TPM_AUTH *);
1084
auth2 = va_arg(ap, TPM_AUTH *);
1087
if (!dig1 || !dig2 || !blob1 || !auth2) {
1088
LogError("Internal error for ordinal 0x%x", ordinal);
1092
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1093
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, dig1);
1094
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, dig2);
1095
LoadBlob(outOffset, len1, out_blob, blob1);
1097
LoadBlob_Auth(outOffset, out_blob, auth1);
1098
LoadBlob_Auth(outOffset, out_blob, auth2);
1099
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1101
LoadBlob_Auth(outOffset, out_blob, auth2);
1102
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1105
result = TSS_SUCCESS;
1108
/* 3 UINT32's, 1 BLOB, 1 optional AUTH */
1109
case TPM_ORD_NV_WriteValue:
1110
case TPM_ORD_NV_WriteValueAuth:
1111
case TPM_ORD_Delegate_Manage:
1113
UINT32 i = va_arg(ap, UINT32);
1114
UINT32 j = va_arg(ap, UINT32);
1115
UINT32 in_len1 = va_arg(ap, UINT32);
1116
BYTE *in_blob1 = va_arg(ap, BYTE *);
1117
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1121
LogError("Internal error for ordinal 0x%x", ordinal);
1125
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1126
LoadBlob_UINT32(outOffset, i, out_blob);
1127
LoadBlob_UINT32(outOffset, j, out_blob);
1128
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1129
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1131
LoadBlob_Auth(outOffset, out_blob, auth1);
1132
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1134
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1137
result = TSS_SUCCESS;
1140
/* 3 UINT32's, 1 optional AUTH */
1141
case TPM_ORD_NV_ReadValue:
1142
case TPM_ORD_NV_ReadValueAuth:
1143
case TPM_ORD_SetRedirection:
1145
UINT32 i = va_arg(ap, UINT32);
1146
UINT32 j = va_arg(ap, UINT32);
1147
UINT32 k = va_arg(ap, UINT32);
1148
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1151
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1152
LoadBlob_UINT32(outOffset, i, out_blob);
1153
LoadBlob_UINT32(outOffset, j, out_blob);
1154
LoadBlob_UINT32(outOffset, k, out_blob);
1156
LoadBlob_Auth(outOffset, out_blob, auth1);
1157
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1159
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1162
result = TSS_SUCCESS;
1165
/* 1 20 byte value, 1 UINT32, 1 BLOB */
1166
case TPM_ORD_CreateEndorsementKeyPair:
1168
BYTE *digest1 = va_arg(ap, BYTE *);
1169
UINT32 in_len1 = va_arg(ap, UINT32);
1170
BYTE *in_blob1 = va_arg(ap, BYTE *);
1173
if (!digest1 || !in_blob1) {
1174
LogError("Internal error for ordinal 0x%x", ordinal);
1178
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1179
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1180
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1181
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1183
result = TSS_SUCCESS;
1186
/* 1 20 byte value, 1 UINT32, 1 BLOB, 1 BOOL, 1 20 byte value */
1187
case TPM_ORD_CreateRevocableEK:
1189
BYTE *digest1 = va_arg(ap, BYTE *);
1190
UINT32 in_len1 = va_arg(ap, UINT32);
1191
BYTE *in_blob1 = va_arg(ap, BYTE *);
1192
TSS_BOOL in_bool1 = va_arg(ap, int);
1193
BYTE *digest2 = va_arg(ap, BYTE *);
1196
if (!digest1 || !in_blob1 || !digest2) {
1197
LogError("Internal error for ordinal 0x%x", ordinal);
1201
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1202
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1203
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1204
LoadBlob_BOOL(outOffset, in_bool1, out_blob);
1205
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest2);
1206
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1208
result = TSS_SUCCESS;
1211
/* 1 20 byte value */
1212
case TPM_ORD_RevokeTrust:
1214
BYTE *digest1 = va_arg(ap, BYTE *);
1218
LogError("Internal error for ordinal 0x%x", ordinal);
1222
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1223
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1224
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1226
result = TSS_SUCCESS;
1229
/* 1 20 byte value, 1 UINT32, 1 BLOB, 1 AUTH */
1230
case TPM_ORD_CreateCounter:
1232
BYTE *digest1 = va_arg(ap, BYTE *);
1233
UINT32 in_len1 = va_arg(ap, UINT32);
1234
BYTE *in_blob1 = va_arg(ap, BYTE *);
1235
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1238
if (!digest1 || !in_blob1 || !auth1) {
1239
LogError("Internal error for ordinal 0x%x", ordinal);
1243
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1244
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1245
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1246
LoadBlob_Auth(outOffset, out_blob, auth1);
1247
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1249
result = TSS_SUCCESS;
1252
/* 1 UINT32, 1 BYTE, 1 UINT32, 1 BLOB, 1 UINT32, 1 BLOB, 1 AUTH */
1253
case TPM_ORD_DAA_Sign:
1254
case TPM_ORD_DAA_Join:
1256
UINT32 keySlot1 = va_arg(ap, UINT32);
1257
BYTE stage1 = va_arg(ap, int);
1258
UINT32 in_len1 = va_arg(ap, UINT32);
1259
BYTE *in_blob1 = va_arg(ap, BYTE *);
1260
UINT32 in_len2 = va_arg(ap, UINT32);
1261
BYTE *in_blob2 = va_arg(ap, BYTE *);
1262
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1265
if (!keySlot1 || !in_blob1 || !auth1) {
1266
LogError("Internal error for ordinal 0x%x", ordinal);
1270
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1271
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1272
LoadBlob_BOOL(outOffset, stage1, out_blob);
1273
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1274
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1275
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1276
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1277
LoadBlob_Auth(outOffset, out_blob, auth1);
1278
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1280
result = TSS_SUCCESS;
1283
/* 2 UINT32's, 1 BLOB, 1 UINT32, 1 BLOB, 1 optional AUTH */
1284
case TPM_ORD_ConvertMigrationBlob:
1285
case TPM_ORD_SetCapability:
1287
UINT32 keySlot1 = va_arg(ap, UINT32);
1288
UINT32 in_len1 = va_arg(ap, UINT32);
1289
BYTE *in_blob1 = va_arg(ap, BYTE *);
1290
UINT32 in_len2 = va_arg(ap, UINT32);
1291
BYTE *in_blob2 = va_arg(ap, BYTE *);
1292
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1295
if (!keySlot1 || !in_blob1 || !in_blob2) {
1296
LogError("Internal error for ordinal 0x%x", ordinal);
1300
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1301
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1302
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1303
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1304
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1305
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1307
LoadBlob_Auth(outOffset, out_blob, auth1);
1308
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1310
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1313
result = TSS_SUCCESS;
1316
/* 2 UINT32's, 1 20 byte value, 2 optional AUTHs */
1317
case TPM_ORD_CertifyKey:
1319
UINT32 keySlot1 = va_arg(ap, UINT32);
1320
UINT32 keySlot2 = va_arg(ap, UINT32);
1321
BYTE *digest1 = va_arg(ap, BYTE *);
1322
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1323
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
1326
if (!keySlot1 || !keySlot2 || !digest1) {
1327
LogError("Internal error for ordinal 0x%x", ordinal);
1331
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1332
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1333
LoadBlob_UINT32(outOffset, keySlot2, out_blob);
1334
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1335
if (auth1 && auth2) {
1336
LoadBlob_Auth(outOffset, out_blob, auth1);
1337
LoadBlob_Auth(outOffset, out_blob, auth2);
1338
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1340
LoadBlob_Auth(outOffset, out_blob, auth1);
1341
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1343
LoadBlob_Auth(outOffset, out_blob, auth2);
1344
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1346
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1349
result = TSS_SUCCESS;
1352
/* 2 UINT32's, 1 BLOB, 1 optional AUTH */
1353
case TPM_ORD_Delegate_LoadOwnerDelegation:
1354
case TPM_ORD_GetCapability:
1355
case TPM_ORD_UnBind:
1358
UINT32 keySlot1 = va_arg(ap, UINT32);
1359
UINT32 in_len1 = va_arg(ap, UINT32);
1360
BYTE *in_blob1 = va_arg(ap, BYTE *);
1361
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1364
if (in_len1 && !in_blob1) {
1365
LogError("Internal error for ordinal 0x%x", ordinal);
1369
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1370
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1371
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1373
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1375
LoadBlob_Auth(outOffset, out_blob, auth1);
1376
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1378
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1381
result = TSS_SUCCESS;
1384
/* 1 UINT32, 1 20 byte value, 1 UINT32, 1 optional BLOB, 1 UINT32, 1 BLOB, 1 AUTH */
1388
UINT32 keySlot1 = va_arg(ap, UINT32);
1389
BYTE *digest1 = va_arg(ap, BYTE *);
1390
UINT32 in_len1 = va_arg(ap, UINT32);
1391
BYTE *in_blob1 = va_arg(ap, BYTE *);
1392
UINT32 in_len2 = va_arg(ap, UINT32);
1393
BYTE *in_blob2 = va_arg(ap, BYTE *);
1394
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1397
if (!keySlot1 || !in_blob2 || !auth1) {
1398
LogError("Internal error for ordinal 0x%x", ordinal);
1402
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1403
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1404
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1405
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1406
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1407
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1408
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1409
LoadBlob_Auth(outOffset, out_blob, auth1);
1410
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1412
result = TSS_SUCCESS;
1415
/* 2 UINT32's, 1 BLOB, 1 optional AUTH, 1 AUTH */
1416
case TPM_ORD_ActivateIdentity:
1418
UINT32 keySlot1 = va_arg(ap, UINT32);
1419
UINT32 in_len1 = va_arg(ap, UINT32);
1420
BYTE *in_blob1 = va_arg(ap, BYTE *);
1421
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1422
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
1425
if (!keySlot1 || !in_blob1 || !auth2) {
1426
LogError("Internal error for ordinal 0x%x", ordinal);
1430
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1431
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1432
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1433
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1435
LoadBlob_Auth(outOffset, out_blob, auth1);
1436
LoadBlob_Auth(outOffset, out_blob, auth2);
1437
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1439
LoadBlob_Auth(outOffset, out_blob, auth2);
1440
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1443
result = TSS_SUCCESS;
1446
/* 1 UINT32, 1 20-byte blob, 1 BLOB, 1 optional AUTH */
1449
UINT32 keySlot1 = va_arg(ap, UINT32);
1450
BYTE *digest1 = va_arg(ap, BYTE *);
1451
UINT32 in_len1 = va_arg(ap, UINT32);
1452
BYTE *in_blob1 = va_arg(ap, BYTE *);
1453
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1456
if (!keySlot1 || !digest1 || !in_blob1) {
1457
LogError("Internal error for ordinal 0x%x", ordinal);
1461
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1462
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1463
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1464
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1467
LoadBlob_Auth(outOffset, out_blob, auth1);
1468
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1470
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1472
result = TSS_SUCCESS;
1475
/* 1 UINT32, 1 20-byte blob, 1 BLOB, 1 BOOL, 1 optional AUTH */
1476
case TPM_ORD_Quote2:
1479
UINT32 keySlot1 = va_arg(ap, UINT32);
1480
BYTE *digest1 = va_arg(ap, BYTE *);
1481
UINT32 in_len1 = va_arg(ap, UINT32);
1482
BYTE *in_blob1 = va_arg(ap, BYTE *);
1483
TSS_BOOL* addVersion = va_arg(ap,TSS_BOOL *);
1484
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1487
if (!keySlot1 || !digest1 || !in_blob1 || !addVersion) {
1488
LogError("Internal error for ordinal 0x%x", ordinal);
1492
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1493
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1494
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1495
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1497
/* Load the addVersion Bool */
1498
LoadBlob_BOOL(outOffset,*addVersion,out_blob);
1501
LoadBlob_Auth(outOffset, out_blob, auth1);
1502
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1504
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1506
result = TSS_SUCCESS;
1509
/* 1 UINT32, 2 20-byte blobs, 1 BLOB, 1 optional AUTH */
1510
case TPM_ORD_CreateWrapKey:
1512
UINT32 keySlot1 = va_arg(ap, UINT32);
1513
BYTE *digest1 = va_arg(ap, BYTE *);
1514
BYTE *digest2 = va_arg(ap, BYTE *);
1515
UINT32 in_len1 = va_arg(ap, UINT32);
1516
BYTE *in_blob1 = va_arg(ap, BYTE *);
1517
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1520
if (!keySlot1 || !digest1 || !digest2 || !in_blob1) {
1521
LogError("Internal error for ordinal 0x%x", ordinal);
1525
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1526
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1527
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1528
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest2);
1529
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1531
LoadBlob_Auth(outOffset, out_blob, auth1);
1532
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1534
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1536
result = TSS_SUCCESS;
1539
/* 2 BLOBs, 1 optional AUTH */
1540
case TPM_ORD_NV_DefineSpace:
1541
case TPM_ORD_LoadManuMaintPub:
1543
UINT32 in_len1 = va_arg(ap, UINT32);
1544
BYTE *in_blob1 = va_arg(ap, BYTE *);
1545
UINT32 in_len2 = va_arg(ap, UINT32);
1546
BYTE *in_blob2 = va_arg(ap, BYTE *);
1547
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1550
if (!in_blob1 || !in_blob2) {
1551
LogError("Internal error for ordinal 0x%x", ordinal);
1555
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1556
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1557
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1559
LoadBlob_Auth(outOffset, out_blob, auth1);
1560
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1562
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1565
result = TSS_SUCCESS;
1568
/* 1 UINT32, 2 20-byte blobs, 1 optional AUTH */
1569
case TPM_ORD_TickStampBlob:
1571
UINT32 keySlot1 = va_arg(ap, UINT32);
1572
BYTE *digest1 = va_arg(ap, BYTE *);
1573
BYTE *digest2 = va_arg(ap, BYTE *);
1574
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1577
if (!keySlot1 || !digest1 || !digest2) {
1578
LogError("Internal error for ordinal 0x%x", ordinal);
1582
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1583
LoadBlob_UINT32(outOffset, keySlot1, out_blob);
1584
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1585
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest2);
1588
LoadBlob_Auth(outOffset, out_blob, auth1);
1589
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1591
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1593
result = TSS_SUCCESS;
1597
case TPM_ORD_ReadManuMaintPub:
1598
case TPM_ORD_ReadPubek:
1599
case TPM_ORD_PCR_Reset:
1600
case TPM_ORD_SetOperatorAuth:
1602
UINT32 in_len1 = va_arg(ap, UINT32);
1603
BYTE *in_blob1 = va_arg(ap, BYTE *);
1607
LogError("Internal error for ordinal 0x%x", ordinal);
1611
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1612
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1613
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1615
result = TSS_SUCCESS;
1618
/* 1 UINT32, 1 BLOB, 2 optional AUTHs */
1619
case TPM_ORD_LoadKey:
1620
case TPM_ORD_LoadKey2:
1621
case TPM_ORD_DirWriteAuth:
1622
case TPM_ORD_CertifySelfTest:
1623
case TPM_ORD_Unseal:
1624
case TPM_ORD_Extend:
1625
case TPM_ORD_StirRandom:
1626
case TPM_ORD_LoadMaintenanceArchive: /* XXX */
1627
case TPM_ORD_FieldUpgrade:
1628
case TPM_ORD_Delegate_UpdateVerification:
1629
case TPM_ORD_Delegate_VerifyDelegation:
1631
UINT32 val1 = va_arg(ap, UINT32);
1632
UINT32 in_len1 = va_arg(ap, UINT32);
1633
BYTE *in_blob1 = va_arg(ap, BYTE *);
1634
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1635
TPM_AUTH *auth2 = va_arg(ap, TPM_AUTH *);
1638
if (in_len1 && !in_blob1) {
1639
LogError("Internal error for ordinal 0x%x", ordinal);
1643
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1644
LoadBlob_UINT32(outOffset, val1, out_blob);
1645
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1646
if (auth1 && auth2) {
1647
LoadBlob_Auth(outOffset, out_blob, auth1);
1648
LoadBlob_Auth(outOffset, out_blob, auth2);
1649
LoadBlob_Header(TPM_TAG_RQU_AUTH2_COMMAND, *outOffset, ordinal, out_blob);
1651
LoadBlob_Auth(outOffset, out_blob, auth1);
1652
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1654
LoadBlob_Auth(outOffset, out_blob, auth2);
1655
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1657
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1660
result = TSS_SUCCESS;
1663
/* 1 UINT16, 1 BLOB, 1 AUTH */
1664
case TPM_ORD_AuthorizeMigrationKey:
1666
UINT16 scheme1 = va_arg(ap, int);
1667
UINT32 in_len1 = va_arg(ap, UINT32);
1668
BYTE *in_blob1 = va_arg(ap, BYTE *);
1669
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1672
if (!in_blob1 || !auth1) {
1673
LogError("Internal error for ordinal 0x%x", ordinal);
1677
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1678
LoadBlob_UINT16(outOffset, scheme1, out_blob);
1679
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1680
LoadBlob_Auth(outOffset, out_blob, auth1);
1681
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1683
result = TSS_SUCCESS;
1686
/* 1 UINT16, 1 UINT32, 1 BLOB, 1 UINT32, 2 BLOBs, 1 AUTH */
1687
case TPM_ORD_TakeOwnership:
1689
UINT16 scheme1 = va_arg(ap, int);
1690
UINT32 in_len1 = va_arg(ap, UINT32);
1691
BYTE *in_blob1 = va_arg(ap, BYTE *);
1692
UINT32 in_len2 = va_arg(ap, UINT32);
1693
BYTE *in_blob2 = va_arg(ap, BYTE *);
1694
UINT32 in_len3 = va_arg(ap, UINT32);
1695
BYTE *in_blob3 = va_arg(ap, BYTE *);
1696
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1699
if (!in_blob1 || !in_blob2 || !in_blob3 || !auth1) {
1700
LogError("Internal error for ordinal 0x%x", ordinal);
1704
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1705
LoadBlob_UINT16(outOffset, scheme1, out_blob);
1706
LoadBlob_UINT32(outOffset, in_len1, out_blob);
1707
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1708
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1709
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1710
LoadBlob(outOffset, in_len3, out_blob, in_blob3);
1711
LoadBlob_Auth(outOffset, out_blob, auth1);
1712
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1714
result = TSS_SUCCESS;
1717
/* 1 UINT32, 1 BOOL, 1 20 byte value, 1 optional AUTH */
1718
case TPM_ORD_GetAuditDigestSigned:
1720
UINT32 keyslot1 = va_arg(ap, UINT32);
1721
TSS_BOOL bool1 = va_arg(ap, int);
1722
BYTE *digest1 = va_arg(ap, BYTE *);
1723
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1727
LogError("Internal error for ordinal 0x%x", ordinal);
1731
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1732
LoadBlob_UINT32(outOffset, keyslot1, out_blob);
1733
LoadBlob_BOOL(outOffset, bool1, out_blob);
1734
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1737
LoadBlob_Auth(outOffset, out_blob, auth1);
1738
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1740
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1743
result = TSS_SUCCESS;
1746
/* 1 UINT16, 1 UINT32, 1 20 byte value */
1749
UINT16 type1 = va_arg(ap, int);
1750
UINT32 value1 = va_arg(ap, UINT32);
1751
BYTE *digest1 = va_arg(ap, BYTE *);
1755
LogError("Internal error for ordinal 0x%x", ordinal);
1759
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1760
LoadBlob_UINT16(outOffset, type1, out_blob);
1761
LoadBlob_UINT32(outOffset, value1, out_blob);
1762
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1763
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1765
result = TSS_SUCCESS;
1768
/* 1 UINT16, 1 20 byte value, 1 UINT16, 1 AUTH */
1769
case TPM_ORD_ChangeAuthOwner:
1771
UINT16 type1 = va_arg(ap, int);
1772
BYTE *digest1 = va_arg(ap, BYTE *);
1773
UINT16 type2 = va_arg(ap, int);
1774
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1777
if (!digest1 || !auth1) {
1778
LogError("Internal error for ordinal 0x%x", ordinal);
1782
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1783
LoadBlob_UINT16(outOffset, type1, out_blob);
1784
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1785
LoadBlob_UINT16(outOffset, type2, out_blob);
1786
LoadBlob_Auth(outOffset, out_blob, auth1);
1787
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1789
result = TSS_SUCCESS;
1792
/* 1 UINT32, 1 BOOL, 1 AUTH */
1793
case TPM_ORD_SetOrdinalAuditStatus:
1795
UINT32 ord1 = va_arg(ap, UINT32);
1796
TSS_BOOL bool1 = va_arg(ap, int);
1797
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1801
LogError("Internal error for ordinal 0x%x", ordinal);
1805
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1806
LoadBlob_UINT32(outOffset, ord1, out_blob);
1807
LoadBlob_BOOL(outOffset, bool1, out_blob);
1808
LoadBlob_Auth(outOffset, out_blob, auth1);
1809
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1811
result = TSS_SUCCESS;
1814
/* 1 BOOL, 1 optional AUTH */
1815
case TPM_ORD_OwnerSetDisable:
1816
case TPM_ORD_PhysicalSetDeactivated:
1817
case TPM_ORD_CreateMaintenanceArchive:
1818
case TPM_ORD_SetOwnerInstall:
1820
TSS_BOOL bool1 = va_arg(ap, int);
1821
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1824
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1825
LoadBlob_BOOL(outOffset, bool1, out_blob);
1827
LoadBlob_Auth(outOffset, out_blob, auth1);
1828
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1830
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1833
result = TSS_SUCCESS;
1836
/* 1 optional AUTH */
1837
case TPM_ORD_OwnerClear:
1838
case TPM_ORD_DisablePubekRead:
1839
case TPM_ORD_GetCapabilityOwner:
1840
case TPM_ORD_ResetLockValue:
1841
case TPM_ORD_DisableOwnerClear:
1842
case TPM_ORD_SetTempDeactivated:
1844
case TPM_ORD_OwnerReadPubek:
1845
case TPM_ORD_SelfTestFull:
1846
case TPM_ORD_GetTicks:
1847
case TPM_ORD_GetTestResult:
1848
case TPM_ORD_KillMaintenanceFeature:
1849
case TPM_ORD_Delegate_ReadTable:
1850
case TPM_ORD_PhysicalEnable:
1851
case TPM_ORD_DisableForceClear:
1852
case TPM_ORD_ForceClear:
1854
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1857
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1859
LoadBlob_Auth(outOffset, out_blob, auth1);
1860
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1862
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1865
result = TSS_SUCCESS;
1868
/* 1 UINT32, 1 optional AUTH */
1869
case TPM_ORD_OwnerReadInternalPub:
1870
case TPM_ORD_GetPubKey:
1871
case TPM_ORD_ReleaseCounterOwner:
1872
case TPM_ORD_ReleaseCounter:
1873
case TPM_ORD_IncrementCounter:
1874
case TPM_ORD_PcrRead:
1875
case TPM_ORD_DirRead:
1876
case TPM_ORD_ReadCounter:
1877
case TPM_ORD_Terminate_Handle:
1878
case TPM_ORD_GetAuditDigest:
1879
case TPM_ORD_GetRandom:
1880
case TPM_ORD_CMK_SetRestrictions:
1882
UINT32 i = va_arg(ap, UINT32);
1883
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1886
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1887
LoadBlob_UINT32(outOffset, i, out_blob);
1889
LoadBlob_Auth(outOffset, out_blob, auth1);
1890
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1892
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1895
result = TSS_SUCCESS;
1898
/* 1 20 byte value, 1 optional AUTH */
1899
case TPM_ORD_CMK_ApproveMA:
1901
BYTE *digest1 = va_arg(ap, BYTE *);
1902
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1905
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1906
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1908
LoadBlob_Auth(outOffset, out_blob, auth1);
1909
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1911
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1914
result = TSS_SUCCESS;
1918
case TSC_ORD_PhysicalPresence:
1920
UINT16 i = va_arg(ap, int);
1923
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1924
LoadBlob_UINT16(outOffset, i, out_blob);
1925
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1927
result = TSS_SUCCESS;
1930
/* 1 UINT32, 1 20 byte value, 1 BLOB, 2 20 byte values, 1 optional AUTH */
1931
case TPM_ORD_CMK_CreateKey:
1933
UINT32 key1 = va_arg(ap, UINT32);
1934
BYTE *digest1 = va_arg(ap, BYTE *);
1935
UINT32 in_len1 = va_arg(ap, UINT32);
1936
BYTE *in_blob1 = va_arg(ap, BYTE *);
1937
BYTE *digest2 = va_arg(ap, BYTE *);
1938
BYTE *digest3 = va_arg(ap, BYTE *);
1939
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1942
if (!digest1 || !in_blob1 || !digest2 || !digest3) {
1943
LogError("Internal error for ordinal 0x%x", ordinal);
1947
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1948
LoadBlob_UINT32(outOffset, key1, out_blob);
1949
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1950
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1951
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest2);
1952
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest3);
1954
LoadBlob_Auth(outOffset, out_blob, auth1);
1955
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1957
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1960
result = TSS_SUCCESS;
1963
/* 1 BLOB, 1 20 byte value, 1 UINT32, 1 BLOB, 1 optional AUTH */
1964
case TPM_ORD_CMK_CreateTicket:
1966
UINT32 in_len1 = va_arg(ap, UINT32);
1967
BYTE *in_blob1 = va_arg(ap, BYTE *);
1968
BYTE *digest1 = va_arg(ap, BYTE *);
1969
UINT32 in_len2 = va_arg(ap, UINT32);
1970
BYTE *in_blob2 = va_arg(ap, BYTE *);
1971
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
1974
if (!digest1 || !in_blob1 || !in_blob2) {
1975
LogError("Internal error for ordinal 0x%x", ordinal);
1979
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
1980
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
1981
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
1982
LoadBlob_UINT32(outOffset, in_len2, out_blob);
1983
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
1985
LoadBlob_Auth(outOffset, out_blob, auth1);
1986
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
1988
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
1991
result = TSS_SUCCESS;
1994
/* 1 UINT32, 1 UINT16, 1 BLOB, 1 20 byte value, 4 x (1 UINT32, 1 BLOB), 1 optional AUTH */
1995
case TPM_ORD_CMK_CreateBlob:
1997
UINT32 in_key1 = va_arg(ap, UINT32);
1998
UINT16 i = va_arg(ap, int);
1999
UINT32 in_len1 = va_arg(ap, UINT32);
2000
BYTE *in_blob1 = va_arg(ap, BYTE *);
2001
BYTE *digest1 = va_arg(ap, BYTE *);
2002
UINT32 in_len2 = va_arg(ap, UINT32);
2003
BYTE *in_blob2 = va_arg(ap, BYTE *);
2004
UINT32 in_len3 = va_arg(ap, UINT32);
2005
BYTE *in_blob3 = va_arg(ap, BYTE *);
2006
UINT32 in_len4 = va_arg(ap, UINT32);
2007
BYTE *in_blob4 = va_arg(ap, BYTE *);
2008
UINT32 in_len5 = va_arg(ap, UINT32);
2009
BYTE *in_blob5 = va_arg(ap, BYTE *);
2010
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
2013
if (!digest1 || !in_blob1 || !in_blob2 || !in_blob3 || !in_blob4 || !in_blob5) {
2014
LogError("Internal error for ordinal 0x%x", ordinal);
2018
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
2019
LoadBlob_UINT32(outOffset, in_key1, out_blob);
2020
LoadBlob_UINT16(outOffset, i, out_blob);
2021
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
2022
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
2023
LoadBlob_UINT32(outOffset, in_len2, out_blob);
2024
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
2025
LoadBlob_UINT32(outOffset, in_len3, out_blob);
2026
LoadBlob(outOffset, in_len3, out_blob, in_blob3);
2027
LoadBlob_UINT32(outOffset, in_len4, out_blob);
2028
LoadBlob(outOffset, in_len4, out_blob, in_blob4);
2029
LoadBlob_UINT32(outOffset, in_len5, out_blob);
2030
LoadBlob(outOffset, in_len5, out_blob, in_blob5);
2032
LoadBlob_Auth(outOffset, out_blob, auth1);
2033
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
2035
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
2038
result = TSS_SUCCESS;
2041
/* 1 UINT32, 1 60 byte value, 1 20 byte value, 1 BLOB, 2 x (1 UINT32, 1 BLOB), 1 optional AUTH */
2042
case TPM_ORD_CMK_ConvertMigration:
2044
UINT32 key1 = va_arg(ap, UINT32);
2045
BYTE *cmkauth1 = va_arg(ap, BYTE *);
2046
BYTE *digest1 = va_arg(ap, BYTE *);
2047
UINT32 in_len1 = va_arg(ap, UINT32);
2048
BYTE *in_blob1 = va_arg(ap, BYTE *);
2049
UINT32 in_len2 = va_arg(ap, UINT32);
2050
BYTE *in_blob2 = va_arg(ap, BYTE *);
2051
UINT32 in_len3 = va_arg(ap, UINT32);
2052
BYTE *in_blob3 = va_arg(ap, BYTE *);
2053
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
2056
if (!cmkauth1 || !digest1 || !in_blob1 || !in_blob2 || !in_blob3) {
2057
LogError("Internal error for ordinal 0x%x", ordinal);
2061
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
2062
LoadBlob_UINT32(outOffset, key1, out_blob);
2063
LoadBlob(outOffset, 3 * TPM_SHA1_160_HASH_LEN, out_blob, cmkauth1);
2064
LoadBlob(outOffset, TPM_SHA1_160_HASH_LEN, out_blob, digest1);
2065
LoadBlob(outOffset, in_len1, out_blob, in_blob1);
2066
LoadBlob_UINT32(outOffset, in_len2, out_blob);
2067
LoadBlob(outOffset, in_len2, out_blob, in_blob2);
2068
LoadBlob_UINT32(outOffset, in_len3, out_blob);
2069
LoadBlob(outOffset, in_len3, out_blob, in_blob3);
2071
LoadBlob_Auth(outOffset, out_blob, auth1);
2072
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
2074
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
2077
result = TSS_SUCCESS;
2080
case TPM_ORD_FlushSpecific:
2082
UINT32 val1 = va_arg(ap, UINT32);
2083
UINT32 val2 = va_arg(ap, UINT32);
2086
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
2087
LoadBlob_UINT32(outOffset, val1, out_blob);
2088
LoadBlob_UINT32(outOffset, val2, out_blob);
2089
LoadBlob_Header(TPM_TAG_RQU_COMMAND, *outOffset, ordinal, out_blob);
2091
result = TSS_SUCCESS;
2094
/* 1 UINT32, 1 BLOB, 1 UINT32, 1 BOOL, 1 AUTH */
2095
case TPM_ORD_KeyControlOwner:
2097
UINT32 i = va_arg(ap, UINT32);
2098
UINT32 len1 = va_arg(ap, UINT32);
2099
BYTE *blob1 = va_arg(ap, BYTE *);
2100
UINT32 j = va_arg(ap, UINT32);
2101
TSS_BOOL bool1 = va_arg(ap, int);
2102
TPM_AUTH *auth1 = va_arg(ap, TPM_AUTH *);
2105
*outOffset += TSS_TPM_TXBLOB_HDR_LEN;
2106
LoadBlob_UINT32(outOffset, i, out_blob);
2107
LoadBlob(outOffset, len1, out_blob, blob1);
2108
LoadBlob_UINT32(outOffset, j, out_blob);
2109
LoadBlob_BOOL(outOffset, bool1, out_blob);
2110
LoadBlob_Auth(outOffset, out_blob, auth1);
2111
LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, *outOffset, ordinal, out_blob);
2113
result = TSS_SUCCESS;
2117
LogError("Unknown ordinal: 0x%x", ordinal);