3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2004-2006
16
#include "trousers/tss.h"
17
#include "trousers/trousers.h"
18
#include "spi_internal_types.h"
19
#include "spi_utils.h"
20
#include "capabilities.h"
25
Tspi_TPM_CreateEndorsementKey(TSS_HTPM hTPM, /* in */
26
TSS_HKEY hKey, /* in */
27
TSS_VALIDATION * pValidationData) /* in, out */
29
TCPA_NONCE antiReplay;
40
TSS_HCONTEXT tspContext;
43
memset(&pubEK, 0, sizeof(TCPA_PUBKEY));
44
memset(&dummyKey, 0, sizeof(TCPA_KEY));
46
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
49
if ((result = obj_rsakey_get_blob(hKey, &ekSize, &ek)))
53
if ((result = Trspi_UnloadBlob_KEY(&offset, ek, &dummyKey)))
57
Trspi_LoadBlob_KEY_PARMS(&offset, ek, &dummyKey.algorithmParms);
58
free_key_refs(&dummyKey);
61
if (pValidationData == NULL) {
62
if ((result = internal_GetRandomNonce(tspContext, &antiReplay))) {
63
LogError("Failed to create random nonce");
64
return TSPERR(TSS_E_INTERNAL_ERROR);
67
if (pValidationData->ulExternalDataLength < sizeof(antiReplay.nonce))
68
return TSPERR(TSS_E_BAD_PARAMETER);
70
memcpy(antiReplay.nonce, pValidationData->rgbExternalData,
71
sizeof(antiReplay.nonce));
74
if ((result = TCSP_CreateEndorsementKeyPair(tspContext, antiReplay, ekSize, ek, &newEKSize,
78
if (pValidationData == NULL) {
80
Trspi_LoadBlob(&offset, newEKSize, hashBlob, newEK);
81
Trspi_LoadBlob(&offset, 20, hashBlob, antiReplay.nonce);
83
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hash.digest);
85
if (memcmp(hash.digest, digest.digest, TCPA_SHA1_160_HASH_LEN)) {
86
LogError("Internal verification failed");
87
return TSPERR(TSS_E_INTERNAL_ERROR);
90
pValidationData->rgbData = calloc_tspi(tspContext, newEKSize);
91
if (pValidationData->rgbData == NULL) {
92
LogError("malloc of %u bytes failed.", newEKSize);
93
return TSPERR(TSS_E_OUTOFMEMORY);
95
pValidationData->ulDataLength = newEKSize;
96
memcpy(pValidationData->rgbData, newEK, newEKSize);
97
memcpy(&pValidationData->rgbData[ekSize], antiReplay.nonce,
98
sizeof(antiReplay.nonce));
100
pValidationData->rgbValidationData = calloc_tspi(tspContext,
101
TCPA_SHA1_160_HASH_LEN);
102
if (pValidationData->rgbValidationData == NULL) {
103
LogError("malloc of %d bytes failed.", TCPA_SHA1_160_HASH_LEN);
104
free_tspi(tspContext, pValidationData->rgbData);
105
pValidationData->rgbData = NULL;
106
pValidationData->ulDataLength = 0;
107
return TSPERR(TSS_E_OUTOFMEMORY);
109
pValidationData->ulValidationDataLength = TCPA_SHA1_160_HASH_LEN;
110
memcpy(pValidationData->rgbValidationData, digest.digest, TCPA_SHA1_160_HASH_LEN);
113
if ((result = obj_rsakey_set_pubkey(hKey, FALSE, newEK)) && pValidationData) {
114
free_tspi(tspContext, pValidationData->rgbValidationData);
115
free_tspi(tspContext, pValidationData->rgbData);
116
pValidationData->rgbData = NULL;
117
pValidationData->ulDataLength = 0;
118
pValidationData->rgbValidationData = NULL;
119
pValidationData->ulValidationDataLength = 0;
128
Tspi_TPM_GetPubEndorsementKey(TSS_HTPM hTPM, /* in */
129
TSS_BOOL fOwnerAuthorized, /* in */
130
TSS_VALIDATION *pValidationData, /* in, out */
131
TSS_HKEY *phEndorsementPubKey) /* out */
141
TCPA_NONCE antiReplay;
142
TCPA_DIGEST checkSum;
144
TSS_HCONTEXT tspContext;
147
memset(&pubKey, 0, sizeof(TCPA_PUBKEY));
149
if (phEndorsementPubKey == NULL)
150
return TSPERR(TSS_E_BAD_PARAMETER);
152
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
155
if (fOwnerAuthorized) {
156
if ((result = obj_tpm_get_policy(hTPM, &hPolicy)))
160
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerReadPubek, hashblob);
161
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
163
if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_OwnerReadPubek,
168
if ((result = TCSP_OwnerReadPubek(tspContext, &ownerAuth, &pubEKSize, &pubEK)))
172
Trspi_LoadBlob_UINT32(&offset, result, hashblob);
173
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerReadPubek, hashblob);
174
Trspi_LoadBlob(&offset, pubEKSize, hashblob, pubEK);
175
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
177
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
180
if (pValidationData == NULL) {
181
if ((result = internal_GetRandomNonce(tspContext, &antiReplay))) {
182
LogDebug("Failed to generate random nonce");
183
return TSPERR(TSS_E_INTERNAL_ERROR);
186
if (pValidationData->ulExternalDataLength < sizeof(antiReplay.nonce))
187
return TSPERR(TSS_E_BAD_PARAMETER);
189
memcpy(antiReplay.nonce, pValidationData->rgbExternalData,
190
sizeof(antiReplay.nonce));
193
/* call down to the TPM */
194
if ((result = TCSP_ReadPubek(tspContext, antiReplay, &pubEKSize, &pubEK,
198
/* validate the returned hash, or set up the return so that the user can */
199
if (pValidationData == NULL) {
201
Trspi_LoadBlob(&offset, pubEKSize, hashblob, pubEK);
202
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, hashblob, antiReplay.nonce);
203
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
205
/* check validation of the entire pubkey structure */
206
if (memcmp(digest.digest, checkSum.digest, TCPA_SHA1_160_HASH_LEN)) {
207
/* validation failed, unload the pubEK in order to hash
208
* just the pubKey portion of the pubEK. This is done on
209
* Atmel chips specifically.
212
memset(&pubKey, 0, sizeof(TCPA_PUBKEY));
213
if ((result = Trspi_UnloadBlob_PUBKEY(&offset, pubEK, &pubKey)))
217
Trspi_LoadBlob(&offset, pubKey.pubKey.keyLength, hashblob,
219
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, hashblob,
221
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
223
if (memcmp(digest.digest, checkSum.digest,
224
TCPA_SHA1_160_HASH_LEN)) {
225
result = TSPERR(TSS_E_VALIDATION_FAILED);
230
/* validate the entire TCPA_PUBKEY structure */
231
pValidationData->ulDataLength = pubEKSize + TCPA_SHA1_160_HASH_LEN;
232
pValidationData->rgbData = calloc_tspi(tspContext,
233
pValidationData->ulDataLength);
234
if (pValidationData->rgbData == NULL) {
235
LogError("malloc of %u bytes failed.",
236
pValidationData->ulDataLength);
237
pValidationData->ulDataLength = 0;
238
return TSPERR(TSS_E_OUTOFMEMORY);
241
memcpy(pValidationData->rgbData, pubEK, pubEKSize);
242
memcpy(&pValidationData->rgbData[pubEKSize], antiReplay.nonce,
243
TCPA_SHA1_160_HASH_LEN);
245
pValidationData->ulValidationDataLength = TCPA_SHA1_160_HASH_LEN;
246
pValidationData->rgbValidationData = calloc_tspi(tspContext,
247
TCPA_SHA1_160_HASH_LEN);
248
if (pValidationData->rgbValidationData == NULL) {
249
LogError("malloc of %d bytes failed.", TCPA_SHA1_160_HASH_LEN);
250
pValidationData->ulValidationDataLength = 0;
251
pValidationData->ulDataLength = 0;
252
free_tspi(tspContext,pValidationData->rgbData);
253
result = TSPERR(TSS_E_OUTOFMEMORY);
257
memcpy(pValidationData->rgbValidationData, checkSum.digest,
258
TCPA_SHA1_160_HASH_LEN);
262
if ((result = obj_rsakey_add(tspContext,
263
TSS_KEY_SIZE_2048|TSS_KEY_TYPE_LEGACY,
267
if ((result = obj_rsakey_set_pubkey(retKey, FALSE, pubEK)))
270
*phEndorsementPubKey = retKey;
278
Tspi_TPM_TakeOwnership(TSS_HTPM hTPM, /* in */
279
TSS_HKEY hKeySRK, /* in */
280
TSS_HKEY hEndorsementPubKey) /* in */
283
TSS_HCONTEXT tspContext;
284
BYTE encOwnerAuth[256];
285
UINT32 encOwnerAuthLength;
286
BYTE encSRKAuth[256];
287
UINT32 encSRKAuthLength;
293
UINT32 srkKeyBlobLength;
295
TSS_HPOLICY hOwnerPolicy;
296
UINT32 newSrkBlobSize;
297
BYTE *newSrkBlob = NULL;
298
BYTE oldAuthDataUsage;
301
/* The first step is to get context and to get the SRK Key Blob.
302
* If these succeed, then the auth should be init'd. */
304
if (hEndorsementPubKey == NULL_HKEY) {
305
if ((result = Tspi_TPM_GetPubEndorsementKey(hTPM, FALSE, NULL, &hPubEK))) {
309
hPubEK = hEndorsementPubKey;
312
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
315
/* Get the srkKeyData */
316
if ((result = obj_rsakey_get_blob(hKeySRK, &srkKeyBlobLength, &srkKeyBlob)))
319
/* Need to check for Atmel bug where authDataUsage is changed */
320
oldAuthDataUsage = srkKeyBlob[10];
321
LogDebug("oldAuthDataUsage is %.2X. Wait to see if it changes", oldAuthDataUsage);
323
/* Now call the module that will encrypt the secrets. This
324
* will either get the secrets from the policy objects or
325
* use the callback function to encrypt the secrets */
327
if ((result = secret_TakeOwnership(hPubEK,
337
/* Now, take ownership is ready to call. The auth structure should be complete
338
* and the encrypted data structures should be ready */
340
if ((result = TCSP_TakeOwnership(tspContext, TCPA_PID_OWNER, encOwnerAuthLength,
341
encOwnerAuth, encSRKAuthLength, encSRKAuth,
342
srkKeyBlobLength, srkKeyBlob, &privAuth, &newSrkBlobSize,
346
/* The final step is to validate the return Auth */
349
Trspi_LoadBlob_UINT32(&offset, result, hashblob);
350
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_TakeOwnership, hashblob);
351
Trspi_LoadBlob(&offset, newSrkBlobSize, hashblob, newSrkBlob);
352
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
354
if ((result = obj_tpm_get_policy(hTPM, &hOwnerPolicy))) {
358
if ((result = obj_policy_validate_auth_oiap(hOwnerPolicy, &digest, &privAuth))) {
363
/* Now that it's all happy, stuff the keyBlob into the object
364
* If atmel, need to adjust the authDataUsage if it changed */
365
if (oldAuthDataUsage != newSrkBlob[10]) { /* hardcoded blob stuff */
366
LogDebug("auth data usage changed. Atmel bug. Fixing in key object");
367
newSrkBlob[10] = oldAuthDataUsage; /* this will fix it */
370
result = obj_rsakey_set_tcpakey(hKeySRK, newSrkBlobSize, newSrkBlob);
376
/* The SRK is loaded at this point, so insert it into the key handle list */
377
return obj_rsakey_set_tcs_handle(hKeySRK, TPM_KEYHND_SRK);
381
Tspi_TPM_CollateIdentityRequest(TSS_HTPM hTPM, /* in */
382
TSS_HKEY hKeySRK, /* in */
383
TSS_HKEY hCAPubKey, /* in */
384
UINT32 ulIdentityLabelLength, /* in */
385
BYTE * rgbIdentityLabelData, /* in */
386
TSS_HKEY hIdentityKey, /* in */
387
TSS_ALGORITHM_ID algID, /* in */
388
UINT32 * pulTcpaIdentityReqLength, /* out */
389
BYTE ** prgbTcpaIdentityReq) /* out */
391
TCPA_ENCAUTH encAuthUsage;
392
TCPA_ENCAUTH encAuthMig;
393
BYTE sharedSecret[20];
394
TPM_AUTH srkAuth, ownerAuth;
397
BYTE hashblob[USHRT_MAX], idReqBlob[USHRT_MAX], testblob[USHRT_MAX];
399
TSS_HPOLICY hSRKPolicy, hIDPolicy, hCAPolicy, hTPMPolicy;
400
UINT32 caKeyBlobSize, idKeySize, idPubSize;
401
BYTE *caKeyBlob, *idKey, *newIdKey, *idPub;
402
TCPA_NONCE nonceEvenOSAP;
404
TCPA_CHOSENID_HASH chosenIDHash = { { 0, } };
405
UINT32 pcIdentityBindingSize;
406
BYTE *prgbIdentityBinding = NULL;
407
UINT32 pcEndorsementCredentialSize;
408
BYTE *prgbEndorsementCredential = NULL;
409
UINT32 pcPlatformCredentialSize;
410
BYTE *prgbPlatformCredential = NULL;
411
UINT32 pcConformanceCredentialSize;
412
BYTE *prgbConformanceCredential = NULL;
413
#define CHOSENID_BLOB_SIZE 2048
414
BYTE chosenIDBlob[CHOSENID_BLOB_SIZE];
415
TSS_HCONTEXT tspContext;
416
UINT32 encSymKeySize = 256, tmp;
417
BYTE encSymKey[256], *cb_var;
419
TPM_AUTH *pSrkAuth = &srkAuth;
420
TCPA_IDENTITY_REQ rgbTcpaIdentityReq;
421
TCPA_KEY_PARMS symParms, asymParms;
422
TCPA_SYMMETRIC_KEY symKey;
426
if (pulTcpaIdentityReqLength == NULL || prgbTcpaIdentityReq == NULL)
427
return TSPERR(TSS_E_BAD_PARAMETER);
429
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
432
if ((result = obj_tpm_get_cb12(hTPM, TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY, &tmp,
436
cb = (TSS_CALLBACK *)cb_var;
437
if (cb->callback == NULL) {
438
free_tspi(tspContext, cb);
443
if ((result = obj_rsakey_get_policy(hKeySRK, TSS_POLICY_USAGE,
444
&hSRKPolicy, &usesAuth)))
447
if ((result = obj_tpm_get_policy(hTPM, &hTPMPolicy)))
450
if ((result = obj_rsakey_get_policy(hCAPubKey, TSS_POLICY_USAGE,
454
if ((result = obj_rsakey_get_policy(hIdentityKey, TSS_POLICY_USAGE,
458
/* setup the symmetric key's parms. */
459
memset(&symParms, 0, sizeof(TCPA_KEY_PARMS));
462
symParms.algorithmID = TCPA_ALG_AES;
463
symKey.algId = TCPA_ALG_AES;
467
symParms.algorithmID = TCPA_ALG_DES;
468
symKey.algId = TCPA_ALG_DES;
472
symParms.algorithmID = TCPA_ALG_3DES;
473
symKey.algId = TCPA_ALG_3DES;
477
result = TSPERR(TSS_E_BAD_PARAMETER);
482
/* No symmetric key encryption schemes existed in the 1.1 time frame */
483
symParms.encScheme = TCPA_ES_NONE;
485
/* get the CA Pubkey's encryption scheme */
486
if ((result = obj_rsakey_get_es(hCAPubKey, &tmp)))
487
return TSPERR(TSS_E_BAD_PARAMETER);
490
case TSS_ES_RSAESPKCSV15:
491
padding = TR_RSA_PKCS1_PADDING;
493
case TSS_ES_RSAESOAEP_SHA1_MGF1:
494
padding = TR_RSA_PKCS1_OAEP_PADDING;
499
padding = TR_RSA_NO_PADDING;
504
if ((result = obj_rsakey_get_blob(hIdentityKey, &idKeySize, &idKey)))
507
if ((result = obj_rsakey_get_blob(hCAPubKey, &caKeyBlobSize, &caKeyBlob)))
511
memset(&caKey, 0, sizeof(TCPA_KEY));
512
if ((result = Trspi_UnloadBlob_KEY(&offset, caKeyBlob, &caKey)))
515
/* ChosenID hash = SHA1(label || TCPA_PUBKEY(CApub)) */
517
Trspi_LoadBlob(&offset, ulIdentityLabelLength, chosenIDBlob, rgbIdentityLabelData);
518
Trspi_LoadBlob_KEY_PARMS(&offset, chosenIDBlob, &caKey.algorithmParms);
519
Trspi_LoadBlob_STORE_PUBKEY(&offset, chosenIDBlob, &caKey.pubKey);
521
if (offset > CHOSENID_BLOB_SIZE)
522
return TSPERR(TSS_E_INTERNAL_ERROR);
524
if ((result = Trspi_Hash(TSS_HASH_SHA1, offset, chosenIDBlob, chosenIDHash.digest))) {
525
free_key_refs(&caKey);
529
/* use chosenIDBlob temporarily */
531
Trspi_LoadBlob_KEY_PARMS(&offset, chosenIDBlob, &caKey.algorithmParms);
534
if ((result = Trspi_UnloadBlob_KEY_PARMS(&offset, chosenIDBlob, &asymParms)))
537
if ((result = secret_PerformXOR_OSAP(hTPMPolicy, hIDPolicy,
538
NULL_HPOLICY, hTPM, TCPA_ET_OWNER,
539
TPM_KEYHND_SRK, &encAuthUsage,
540
&encAuthMig, sharedSecret,
541
&ownerAuth, &nonceEvenOSAP)))
544
/* Hash the Auth data */
546
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_MakeIdentity, hashblob);
547
Trspi_LoadBlob(&offset, 20, hashblob, encAuthUsage.authdata);
548
Trspi_LoadBlob(&offset, 20, hashblob, chosenIDHash.digest);
549
Trspi_LoadBlob(&offset, idKeySize, hashblob, idKey);
550
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
554
if ((result = secret_PerformAuth_OIAP(hKeySRK,
555
TPM_ORD_MakeIdentity,
564
if ((result = secret_PerformAuth_OSAP(hTPM, TPM_ORD_MakeIdentity,
565
hTPMPolicy, hIDPolicy,
566
NULL_HPOLICY, sharedSecret,
567
&ownerAuth, digest.digest,
571
if ((result = TCSP_MakeIdentity(tspContext, encAuthUsage, chosenIDHash, idKeySize, idKey,
572
pSrkAuth, &ownerAuth, &idKeySize, &newIdKey,
573
&pcIdentityBindingSize, &prgbIdentityBinding,
574
&pcEndorsementCredentialSize, &prgbEndorsementCredential,
575
&pcPlatformCredentialSize, &prgbPlatformCredential,
576
&pcConformanceCredentialSize, &prgbConformanceCredential)))
580
Trspi_LoadBlob_UINT32(&offset, result, hashblob);
581
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_MakeIdentity, hashblob);
582
Trspi_LoadBlob(&offset, idKeySize, hashblob, newIdKey);
583
Trspi_LoadBlob_UINT32(&offset, pcIdentityBindingSize, hashblob);
584
Trspi_LoadBlob(&offset, pcIdentityBindingSize, hashblob,
585
prgbIdentityBinding);
587
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
589
if ((result = secret_ValidateAuth_OSAP(hTPM, TPM_ORD_MakeIdentity,
590
hTPMPolicy, hIDPolicy,
591
NULL_HPOLICY, sharedSecret,
592
&ownerAuth, digest.digest,
596
if (usesAuth == TRUE) {
597
if ((result = obj_policy_validate_auth_oiap(hSRKPolicy,
603
if ((result = obj_rsakey_set_tcpakey(hIdentityKey, idKeySize, newIdKey))) {
609
if ((result = obj_rsakey_get_pub_blob(hIdentityKey, &idPubSize, &idPub)))
612
/* set up the TCPA_IDENTITY_PROOF structure */
613
/* XXX This should be DER encoded first. TPM1.1b section 9.4 */
615
Trspi_LoadBlob_TSS_VERSION(&offset, hashblob, VERSION_1_1);
616
Trspi_LoadBlob_UINT32(&offset, ulIdentityLabelLength, hashblob);
617
Trspi_LoadBlob_UINT32(&offset, pcIdentityBindingSize, hashblob);
618
Trspi_LoadBlob_UINT32(&offset, pcEndorsementCredentialSize, hashblob);
619
Trspi_LoadBlob_UINT32(&offset, pcPlatformCredentialSize, hashblob);
620
Trspi_LoadBlob_UINT32(&offset, pcConformanceCredentialSize, hashblob);
621
Trspi_LoadBlob(&offset, idPubSize, hashblob, idPub);
622
free_tspi(tspContext, idPub);
623
Trspi_LoadBlob(&offset, ulIdentityLabelLength, hashblob, rgbIdentityLabelData);
624
Trspi_LoadBlob(&offset, pcIdentityBindingSize, hashblob, prgbIdentityBinding);
625
Trspi_LoadBlob(&offset, pcEndorsementCredentialSize, hashblob, prgbEndorsementCredential);
626
Trspi_LoadBlob(&offset, pcPlatformCredentialSize, hashblob, prgbPlatformCredential);
627
Trspi_LoadBlob(&offset, pcConformanceCredentialSize, hashblob, prgbConformanceCredential);
629
if (cb && cb->callback) {
630
/* Alloc the space for the callback to copy into. The additional 32 bytes will
631
* attempt to account for padding that the symmetric encryption will do. */
632
rgbTcpaIdentityReq.asymBlob = calloc(1, (int)offset + 32);
633
rgbTcpaIdentityReq.symBlob = calloc(1, (int)offset + 32);
634
if (rgbTcpaIdentityReq.asymBlob == NULL ||
635
rgbTcpaIdentityReq.symBlob == NULL) {
636
free(rgbTcpaIdentityReq.asymBlob);
637
free(rgbTcpaIdentityReq.symBlob);
638
LogError("malloc of %" PRIu64 " bytes failed", offset);
639
free_tspi(tspContext, cb);
640
result = TSPERR(TSS_E_OUTOFMEMORY);
643
rgbTcpaIdentityReq.asymSize = (UINT32)offset + 32;
644
rgbTcpaIdentityReq.symSize = (UINT32)offset + 32;
646
if ((result = ((TSS_RESULT (*)(PVOID, UINT32, BYTE *, UINT32, UINT32 *, BYTE *,
647
UINT32 *, BYTE *))cb->callback)(cb->appData, (UINT32)offset,
649
&rgbTcpaIdentityReq.asymSize,
650
rgbTcpaIdentityReq.asymBlob,
651
&rgbTcpaIdentityReq.symSize,
652
rgbTcpaIdentityReq.symBlob))) {
653
LogDebug("CollateIdentityRequest callback returned error 0x%x", result);
654
free_tspi(tspContext, cb);
658
/* generate the symmetric key. */
659
if ((result = get_local_random(tspContext, symKey.size, &symKey.data)))
662
/* No symmetric key encryption schemes existed in the 1.1 time frame */
663
symKey.encScheme = TCPA_ES_NONE;
665
/* encrypt the proof */
666
rgbTcpaIdentityReq.symSize = sizeof(testblob);
667
if ((result = Trspi_SymEncrypt(algID, TR_SYM_MODE_CBC, symKey.data, NULL, hashblob,
668
offset, testblob, &rgbTcpaIdentityReq.symSize)))
671
rgbTcpaIdentityReq.symBlob = testblob;
673
/* XXX This should be DER encoded first. TPM1.1b section 9.4 */
675
Trspi_LoadBlob_SYMMETRIC_KEY(&offset, hashblob, &symKey);
677
if ((result = Trspi_RSA_Public_Encrypt(hashblob, offset, encSymKey, &encSymKeySize,
678
caKey.pubKey.key, caKey.pubKey.keyLength,
682
rgbTcpaIdentityReq.asymSize = encSymKeySize;
683
rgbTcpaIdentityReq.asymBlob = encSymKey;
686
rgbTcpaIdentityReq.asymAlgorithm = asymParms;
687
rgbTcpaIdentityReq.symAlgorithm = symParms;
689
/* XXX This should be DER encoded first. TPM1.1b section 9.4 */
691
Trspi_LoadBlob_IDENTITY_REQ(&offset, idReqBlob, &rgbTcpaIdentityReq);
693
if (cb && cb->callback) {
694
free(rgbTcpaIdentityReq.symBlob);
695
free(rgbTcpaIdentityReq.asymBlob);
696
free_tspi(tspContext, cb);
699
if ((*prgbTcpaIdentityReq = calloc_tspi(tspContext, offset)) == NULL) {
700
result = TSPERR(TSS_E_OUTOFMEMORY);
704
memcpy(*prgbTcpaIdentityReq, idReqBlob, offset);
705
*pulTcpaIdentityReqLength = offset;
707
free_key_refs(&caKey);
708
free(prgbIdentityBinding);
709
free(prgbEndorsementCredential);
710
free(prgbPlatformCredential);
711
free(prgbConformanceCredential);
717
Tspi_TPM_ActivateIdentity(TSS_HTPM hTPM, /* in */
718
TSS_HKEY hIdentKey, /* in */
719
UINT32 ulAsymCAContentsBlobLength, /* in */
720
BYTE * rgbAsymCAContentsBlob, /* in */
721
UINT32 ulSymCAAttestationBlobLength, /* in */
722
BYTE * rgbSymCAAttestationBlob, /* in */
723
UINT32 * pulCredentialLength, /* out */
724
BYTE ** prgbCredential) /* out */
728
TSS_HCONTEXT tspContext;
729
TSS_HPOLICY hIDPolicy, hTPMPolicy;
731
BYTE hashblob[0x1000], credBlob[0x1000];
734
TCS_KEY_HANDLE tcsKeyHandle;
736
TPM_AUTH *pIDKeyAuth;
737
BYTE *symKeyBlob, *credCallback, *cb_var;
738
UINT32 symKeyBlobLen, credLen, tmp;
739
TCPA_SYMMETRIC_KEY symKey;
741
TCPA_SYM_CA_ATTESTATION symCAAttestation;
743
if (pulCredentialLength == NULL || prgbCredential == NULL)
744
return TSPERR(TSS_E_BAD_PARAMETER);
746
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
749
if ((result = obj_tpm_get_cb12(hTPM, TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY, &tmp,
753
cb = (TSS_CALLBACK *)cb_var;
754
if (cb->callback == NULL) {
755
free_tspi(tspContext, cb);
759
if ((result = obj_rsakey_get_tcs_handle(hIdentKey, &tcsKeyHandle)))
762
if ((result = obj_rsakey_get_policy(hIdentKey, TSS_POLICY_USAGE,
763
&hIDPolicy, &usesAuth)))
766
if ((result = obj_tpm_get_policy(hTPM, &hTPMPolicy)))
770
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_ActivateTPMIdentity, hashblob);
771
Trspi_LoadBlob_UINT32(&offset, ulAsymCAContentsBlobLength, hashblob);
772
Trspi_LoadBlob(&offset, ulAsymCAContentsBlobLength, hashblob,
773
rgbAsymCAContentsBlob);
774
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
777
if ((result = secret_PerformAuth_OIAP(hIDPolicy,
778
TPM_ORD_ActivateTPMIdentity,
782
pIDKeyAuth = &idKeyAuth;
787
if ((result = secret_PerformAuth_OIAP(hTPM,
788
TPM_ORD_ActivateTPMIdentity,
793
if ((result = TCSP_ActivateTPMIdentity(tspContext, tcsKeyHandle, ulAsymCAContentsBlobLength,
794
rgbAsymCAContentsBlob, pIDKeyAuth, &ownerAuth,
795
&symKeyBlobLen, &symKeyBlob)))
799
Trspi_LoadBlob_UINT32(&offset, result, hashblob);
800
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_ActivateTPMIdentity, hashblob);
801
Trspi_LoadBlob(&offset, symKeyBlobLen, hashblob, symKeyBlob);
802
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
805
if ((result = obj_policy_validate_auth_oiap(hIDPolicy, &digest, &idKeyAuth))) {
806
LogDebugFn("Identity key auth validation of the symmetric key failed.");
811
if ((result = obj_policy_validate_auth_oiap(hTPMPolicy, &digest, &ownerAuth))) {
812
LogDebugFn("Owner auth validation of the symmetric key failed.");
817
if ((result = Trspi_UnloadBlob_SYM_CA_ATTESTATION(&offset, rgbSymCAAttestationBlob,
818
&symCAAttestation))) {
819
LogDebugFn("Error unloading CA's attestation blob.");
823
if (cb && cb->callback) {
824
/* alloc the space for the callback to copy into */
825
credCallback = calloc(1, ulSymCAAttestationBlobLength);
826
if (credCallback == NULL) {
827
LogDebug("malloc of %u bytes failed", ulSymCAAttestationBlobLength);
828
free(symCAAttestation.credential);
830
free_tspi(tspContext, cb);
831
return TSPERR(TSS_E_INTERNAL_ERROR);
833
credLen = ulSymCAAttestationBlobLength;
835
if ((result = ((TSS_RESULT (*)(PVOID, UINT32, BYTE *, UINT32, BYTE *, UINT32 *,
836
BYTE *))cb->callback)(cb->appData, symKeyBlobLen, symKeyBlob,
837
symCAAttestation.credSize,
838
symCAAttestation.credential,
839
&credLen, credCallback))) {
840
LogDebug("ActivateIdentity callback returned error 0x%x", result);
841
free(symCAAttestation.credential);
843
free_tspi(tspContext, cb);
845
return TSPERR(TSS_E_INTERNAL_ERROR);
847
free(symCAAttestation.credential);
848
free_tspi(tspContext, cb);
851
if ((*prgbCredential = calloc_tspi(tspContext, credLen)) == NULL) {
853
return TSPERR(TSS_E_OUTOFMEMORY);
856
memcpy(*prgbCredential, credCallback, credLen);
857
*pulCredentialLength = credLen;
863
/* decrypt the symmetric blob using the recovered symmetric key */
865
if ((result = Trspi_UnloadBlob_SYMMETRIC_KEY(&offset, symKeyBlob, &symKey))) {
866
free(symCAAttestation.credential);
872
if ((result = Trspi_SymDecrypt(symKey.algId, symKey.encScheme, symKey.data, NULL,
873
symCAAttestation.credential, symCAAttestation.credSize,
874
credBlob, &credLen))) {
875
free(symCAAttestation.credential);
879
free(symCAAttestation.credential);
881
if ((*prgbCredential = calloc_tspi(tspContext, credLen)) == NULL) {
883
return TSPERR(TSS_E_OUTOFMEMORY);
887
memcpy(*prgbCredential, credBlob, credLen);
888
*pulCredentialLength = credLen;
894
Tspi_TPM_ClearOwner(TSS_HTPM hTPM, /* in */
895
TSS_BOOL fForcedClear) /* in */
897
TSS_HCONTEXT tspContext;
900
TCPA_DIGEST hashDigest;
905
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
908
if (!fForcedClear) { /* TPM_OwnerClear */
909
if ((result = obj_tpm_get_policy(hTPM, &hPolicy)))
912
/* Now do some Hash'ing */
914
hashBlob = malloc(sizeof(UINT32));
915
if (hashBlob == NULL) {
916
LogError("malloc of %zd bytes failed.", sizeof(UINT32));
917
return TSPERR(TSS_E_OUTOFMEMORY);
919
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerClear, hashBlob);
920
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
922
/* hashDigest now has the hash result */
924
if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_OwnerClear,
925
hPolicy, &hashDigest,
929
if ((result = TCSP_OwnerClear(tspContext, &auth)))
934
hashBlob = malloc(2 * sizeof(UINT32));
935
if (hashBlob == NULL) {
936
LogError("malloc of %zd bytes failed.", 2 * sizeof(UINT32));
937
return TSPERR(TSS_E_OUTOFMEMORY);
939
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
940
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerClear, hashBlob);
941
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
944
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth)))
947
if ((result = TCSP_ForceClear(tspContext)))
955
Tspi_TPM_SetStatus(TSS_HTPM hTPM, /* in */
956
TSS_FLAG statusFlag, /* in */
957
TSS_BOOL fTpmState) /* in */
963
TCPA_DIGEST hashDigest;
964
TSS_HCONTEXT tspContext;
967
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
970
if ((result = obj_tpm_get_policy(hTPM, &hPolicy)))
973
switch (statusFlag) {
974
case TSS_TPMSTATUS_DISABLEOWNERCLEAR:
975
hashBlob = malloc(sizeof(UINT32));
976
if (hashBlob == NULL) {
977
LogError("malloc of %zd bytes failed.", sizeof(UINT32));
978
return TSPERR(TSS_E_OUTOFMEMORY);
981
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DisableOwnerClear, hashBlob);
982
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
985
if ((result = secret_PerformAuth_OIAP(hTPM,
986
TPM_ORD_DisableOwnerClear,
987
hPolicy, &hashDigest,
991
if ((result = TCSP_DisableOwnerClear(tspContext, &auth)))
995
hashBlob = malloc(2 * sizeof(UINT32));
996
if (hashBlob == NULL) {
997
LogError("malloc of %zd bytes failed.", 2 * sizeof(UINT32));
998
return TSPERR(TSS_E_OUTOFMEMORY);
1000
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1001
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DisableOwnerClear, hashBlob);
1002
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1005
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth)))
1008
case TSS_TPMSTATUS_DISABLEFORCECLEAR:
1009
result = TCSP_DisableForceClear(tspContext);
1011
case TSS_TPMSTATUS_OWNERSETDISABLE:
1013
hashBlob = malloc(sizeof(UINT32) + sizeof(TSS_BOOL));
1014
if (hashBlob == NULL) {
1015
LogError("malloc of %zd bytes failed.", sizeof(UINT32) + sizeof(TSS_BOOL));
1016
return TSPERR(TSS_E_OUTOFMEMORY);
1019
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerSetDisable, hashBlob);
1020
hashBlob[(offset++)] = fTpmState;
1021
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1024
if ((result = secret_PerformAuth_OIAP(hTPM,
1025
TPM_ORD_OwnerSetDisable,
1026
hPolicy, &hashDigest,
1030
if ((result = TCSP_OwnerSetDisable(tspContext, fTpmState, &auth)))
1034
hashBlob = malloc(8);
1035
if (hashBlob == NULL) {
1036
LogError("malloc of %zd bytes failed.", 2 * sizeof(UINT32));
1037
return TSPERR(TSS_E_OUTOFMEMORY);
1039
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1040
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_OwnerSetDisable, hashBlob);
1041
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1044
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth)))
1047
case TSS_TPMSTATUS_PHYSICALDISABLE:
1049
result = TCSP_PhysicalDisable(tspContext);
1051
result = TCSP_PhysicalEnable(tspContext);
1053
case TSS_TPMSTATUS_PHYSICALSETDEACTIVATED:
1054
result = TCSP_PhysicalSetDeactivated(tspContext, fTpmState);
1056
case TSS_TPMSTATUS_SETTEMPDEACTIVATED:
1057
result = TCSP_SetTempDeactivated(tspContext);
1059
case TSS_TPMSTATUS_SETOWNERINSTALL:
1060
result = TCSP_SetOwnerInstall(tspContext, fTpmState);
1062
case TSS_TPMSTATUS_DISABLEPUBEKREAD:
1064
hashBlob = malloc(sizeof(UINT32));
1065
if (hashBlob == NULL) {
1066
LogError("malloc of %zd bytes failed.", sizeof(UINT32));
1067
return TSPERR(TSS_E_OUTOFMEMORY);
1070
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DisablePubekRead, hashBlob);
1071
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1074
if ((result = secret_PerformAuth_OIAP(hTPM,
1075
TPM_ORD_DisablePubekRead,
1076
hPolicy, &hashDigest,
1080
if ((result = TCSP_DisablePubekRead(tspContext, &auth)))
1084
hashBlob = malloc(2 * sizeof(UINT32));
1085
if (hashBlob == NULL) {
1086
LogError("malloc of %zd bytes failed.", 2 * sizeof(UINT32));
1087
return TSPERR(TSS_E_OUTOFMEMORY);
1089
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1090
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DisablePubekRead, hashBlob);
1091
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1094
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth)))
1097
#ifndef TSS_SPEC_COMPLIANCE
1098
case TSS_TPMSTATUS_PHYSPRES_LIFETIMELOCK:
1099
/* set the lifetime lock bit */
1100
result = TCSP_PhysicalPresence(tspContext, TCPA_PHYSICAL_PRESENCE_LIFETIME_LOCK);
1102
case TSS_TPMSTATUS_PHYSPRES_HWENABLE:
1103
/* set the HW enable bit */
1104
result = TCSP_PhysicalPresence(tspContext, TCPA_PHYSICAL_PRESENCE_HW_ENABLE);
1106
case TSS_TPMSTATUS_PHYSPRES_CMDENABLE:
1107
/* set the command enable bit */
1108
result = TCSP_PhysicalPresence(tspContext, TCPA_PHYSICAL_PRESENCE_CMD_ENABLE);
1110
case TSS_TPMSTATUS_PHYSPRES_LOCK:
1111
/* set the physical presence lock bit */
1112
result = TCSP_PhysicalPresence(tspContext, TCPA_PHYSICAL_PRESENCE_LOCK);
1114
case TSS_TPMSTATUS_PHYSPRESENCE:
1115
/* set the physical presence state */
1116
result = TCSP_PhysicalPresence(tspContext, (fTpmState ?
1117
TCPA_PHYSICAL_PRESENCE_PRESENT :
1118
TCPA_PHYSICAL_PRESENCE_NOTPRESENT));
1122
return TSPERR(TSS_E_BAD_PARAMETER);
1130
Tspi_TPM_GetStatus(TSS_HTPM hTPM, /* in */
1131
TSS_FLAG statusFlag, /* in */
1132
TSS_BOOL * pfTpmState) /* out */
1134
TSS_HCONTEXT tspContext;
1139
if (pfTpmState == NULL)
1140
return TSPERR(TSS_E_BAD_PARAMETER);
1142
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1145
if ((result = get_tpm_flags(tspContext, hTPM, &volFlags, &nonVolFlags)))
1148
switch (statusFlag) {
1149
case TSS_TPMSTATUS_DISABLEOWNERCLEAR:
1150
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_OWNER_CLEARABLE);
1152
case TSS_TPMSTATUS_DISABLEFORCECLEAR:
1153
*pfTpmState = BOOL(volFlags & TPM11_VOL_PRES_CLEARABLE);
1155
case TSS_TPMSTATUS_DISABLED:
1156
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_DISABLED);
1158
case TSS_TPMSTATUS_PHYSICALSETDEACTIVATED:
1159
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_DEACTIVATED);
1161
case TSS_TPMSTATUS_SETTEMPDEACTIVATED:
1162
*pfTpmState = BOOL(volFlags & TPM11_VOL_TEMP_DEACTIVATED);
1164
case TSS_TPMSTATUS_SETOWNERINSTALL:
1165
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_OWNABLE);
1167
case TSS_TPMSTATUS_DISABLEPUBEKREAD:
1168
*pfTpmState = INVBOOL(nonVolFlags & TPM11_NONVOL_READABLE_PUBEK);
1170
case TSS_TPMSTATUS_ALLOWMAINTENANCE:
1171
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_ALLOW_MAINT);
1173
case TSS_TPMSTATUS_PHYSPRES_LIFETIMELOCK:
1174
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_LIFETIME_LOCK);
1176
case TSS_TPMSTATUS_PHYSPRES_HWENABLE:
1177
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_HW_PRES);
1179
case TSS_TPMSTATUS_PHYSPRES_CMDENABLE:
1180
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_CMD_PRES);
1182
case TSS_TPMSTATUS_CEKP_USED:
1183
*pfTpmState = BOOL(nonVolFlags & TPM11_NONVOL_CEKP_USED);
1185
case TSS_TPMSTATUS_PHYSPRESENCE:
1186
*pfTpmState = BOOL(volFlags & TPM11_VOL_PRES);
1188
case TSS_TPMSTATUS_PHYSPRES_LOCK:
1189
*pfTpmState = BOOL(volFlags & TPM11_VOL_PRES_LOCK);
1193
return TSPERR(TSS_E_BAD_PARAMETER);
1201
Tspi_TPM_SelfTestFull(TSS_HTPM hTPM) /* in */
1204
TSS_HCONTEXT tspContext;
1206
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1209
return TCSP_SelfTestFull(tspContext);
1213
Tspi_TPM_CertifySelfTest(TSS_HTPM hTPM, /* in */
1214
TSS_HKEY hKey, /* in */
1215
TSS_VALIDATION *pValidationData) /* in, out */
1222
TCPA_NONCE antiReplay;
1225
TSS_HPOLICY hPolicy;
1226
TCS_KEY_HANDLE keyTCSKeyHandle;
1227
BYTE *keyData = NULL;
1229
TCPA_KEY keyContainer;
1232
TSS_HCONTEXT tspContext;
1235
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1238
if ((result = obj_rsakey_get_policy(hKey, TSS_POLICY_USAGE,
1239
&hPolicy, &useAuth)))
1242
if ((result = obj_rsakey_get_tcs_handle(hKey, &keyTCSKeyHandle)))
1245
if (pValidationData == NULL) {
1246
if ((result = internal_GetRandomNonce(tspContext, &antiReplay))) {
1247
LogError("Failed creating random nonce");
1248
return TSPERR(TSS_E_INTERNAL_ERROR);
1251
if (pValidationData->ulExternalDataLength < sizeof(antiReplay.nonce))
1252
return TSPERR(TSS_E_BAD_PARAMETER);
1254
memcpy(antiReplay.nonce, pValidationData->rgbExternalData,
1255
sizeof(antiReplay.nonce));
1259
LogDebug("Uses Auth");
1261
/* === now setup the auth's */
1262
hashBlob = malloc(sizeof(UINT32) + sizeof(TCPA_NONCE));
1263
if (hashBlob == NULL) {
1264
LogError("malloc of %zd bytes failed.", sizeof(UINT32) + sizeof(TCPA_NONCE));
1265
return TSPERR(TSS_E_OUTOFMEMORY);
1268
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CertifySelfTest, hashBlob);
1269
Trspi_LoadBlob(&offset, sizeof(TCPA_NONCE), hashBlob, antiReplay.nonce);
1270
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hash.digest);
1273
if ((result = secret_PerformAuth_OIAP(hKey,
1274
TPM_ORD_CertifySelfTest,
1278
pKeyAuth = &keyAuth;
1280
LogDebug("No Auth");
1284
if ((result = TCSP_CertifySelfTest(tspContext, keyTCSKeyHandle, antiReplay, pKeyAuth,
1285
&outDataSize, &outData)))
1291
hashBlob = malloc((3 * sizeof(UINT32)) + outDataSize);
1292
if (hashBlob == NULL) {
1293
LogError("malloc of %zd bytes failed.", (3 * sizeof(UINT32)) + outDataSize);
1294
return TSPERR(TSS_E_OUTOFMEMORY);
1296
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1297
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CertifySelfTest, hashBlob);
1298
Trspi_LoadBlob_UINT32(&offset, outDataSize, hashBlob);
1299
Trspi_LoadBlob(&offset, outDataSize, hashBlob, outData);
1300
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hash.digest);
1303
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hash, &keyAuth)))
1307
if (pValidationData == NULL) {
1308
if ((result = Tspi_GetAttribData(hKey, TSS_TSPATTRIB_KEY_BLOB,
1309
TSS_TSPATTRIB_KEYBLOB_BLOB, &keyDataSize, &keyData))) {
1310
LogError("Failed call to GetAttribData to get key blob");
1311
return TSPERR(TSS_E_INTERNAL_ERROR);
1315
memset(&keyContainer, 0, sizeof(TCPA_KEY));
1316
if ((result = Trspi_UnloadBlob_KEY(&offset, keyData, &keyContainer)))
1320
hashBlob = malloc(sizeof(UINT32) + sizeof(TCPA_NONCE) + strlen("Test Passed"));
1321
if (hashBlob == NULL) {
1322
LogError("malloc of %zd bytes failed.", sizeof(UINT32) + sizeof(TCPA_NONCE)
1323
+ strlen("Test Passed"));
1324
free_key_refs(&keyContainer);
1325
return TSPERR(TSS_E_OUTOFMEMORY);
1327
Trspi_LoadBlob(&offset, strlen("Test Passed"), hashBlob, (BYTE *)"Test Passed");
1328
Trspi_LoadBlob(&offset, sizeof(TCPA_NONCE), hashBlob, antiReplay.nonce);
1329
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CertifySelfTest, hashBlob);
1331
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hash.digest);
1334
if ((result = Trspi_Verify(TSS_HASH_SHA1, hash.digest, 20,
1335
keyContainer.pubKey.key, keyContainer.pubKey.keyLength,
1336
outData, outDataSize))) {
1338
free_key_refs(&keyContainer);
1339
return TSPERR(TSS_E_VERIFICATION_FAILED);
1343
pValidationData->ulDataLength = sizeof(TCPA_NONCE) + sizeof(UINT32) +
1344
strlen("Test Passed");
1345
pValidationData->rgbData = calloc_tspi(tspContext, pValidationData->ulDataLength);
1346
if (pValidationData->rgbData == NULL) {
1347
LogError("malloc of %u bytes failed.", pValidationData->ulDataLength);
1348
pValidationData->ulDataLength = 0;
1349
return TSPERR(TSS_E_OUTOFMEMORY);
1352
Trspi_LoadBlob(&offset, strlen("Test Passed"), pValidationData->rgbData,
1353
(BYTE *)"Test Passed");
1354
Trspi_LoadBlob(&offset, sizeof(TCPA_NONCE), pValidationData->rgbData,
1356
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CertifySelfTest, pValidationData->rgbData);
1357
pValidationData->ulValidationDataLength = outDataSize;
1358
pValidationData->rgbValidationData = calloc_tspi(tspContext, outDataSize);
1359
if (pValidationData->rgbValidationData == NULL) {
1360
free_tspi(tspContext, pValidationData->rgbData);
1361
pValidationData->rgbData = NULL;
1362
pValidationData->ulDataLength = 0;
1363
LogError("malloc of %u bytes failed.",
1364
pValidationData->ulValidationDataLength);
1365
pValidationData->ulValidationDataLength = 0;
1366
return TSPERR(TSS_E_OUTOFMEMORY);
1368
memcpy(pValidationData->rgbValidationData, outData, outDataSize);
1376
Tspi_TPM_GetTestResult(TSS_HTPM hTPM, /* in */
1377
UINT32 * pulTestResultLength, /* out */
1378
BYTE ** prgbTestResult) /* out */
1380
TSS_HCONTEXT tspContext;
1383
if (pulTestResultLength == NULL || prgbTestResult == NULL)
1384
return TSPERR(TSS_E_BAD_PARAMETER);
1386
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1389
return TCSP_GetTestResult(tspContext, pulTestResultLength, prgbTestResult);
1393
Tspi_TPM_GetCapability(TSS_HTPM hTPM, /* in */
1394
TSS_FLAG capArea, /* in */
1395
UINT32 ulSubCapLength, /* in */
1396
BYTE * rgbSubCap, /* in */
1397
UINT32 * pulRespDataLength, /* out */
1398
BYTE ** prgbRespData) /* out */
1400
TSS_HCONTEXT tspContext;
1401
TCPA_CAPABILITY_AREA tcsCapArea;
1402
UINT32 tcsSubCap = 0;
1403
UINT32 tcsSubCapContainer;
1405
UINT32 nonVolFlags, volFlags, respLen, correct_endianess = 0;
1408
TSS_BOOL fOwnerAuth = FALSE; /* flag for caps that need owner auth */
1410
if (pulRespDataLength == NULL || prgbRespData == NULL)
1411
return TSPERR(TSS_E_BAD_PARAMETER);
1413
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1416
/* Verify the caps and subcaps */
1418
case TSS_TPMCAP_ORD:
1419
if ((ulSubCapLength != sizeof(UINT32)) || !rgbSubCap)
1420
return TSPERR(TSS_E_BAD_PARAMETER);
1422
tcsCapArea = TCPA_CAP_ORD;
1423
tcsSubCap = *(UINT32 *)rgbSubCap;
1425
case TSS_TPMCAP_FLAG:
1428
case TSS_TPMCAP_ALG: /* Queries whether an algorithm is supported by the TPM. */
1429
if ((ulSubCapLength != sizeof(UINT32)) || !rgbSubCap)
1430
return TSPERR(TSS_E_BAD_PARAMETER);
1432
tcsCapArea = TCPA_CAP_ALG;
1433
switch (*(UINT32 *)rgbSubCap) {
1435
tcsSubCap = TCPA_ALG_RSA;
1438
tcsSubCap = TCPA_ALG_AES;
1441
tcsSubCap = TCPA_ALG_3DES;
1444
tcsSubCap = TCPA_ALG_DES;
1447
tcsSubCap = *(UINT32 *)rgbSubCap;
1451
case TSS_TPMCAP_PROPERTY: /* Determines a physical property of the TPM. */
1452
if ((ulSubCapLength != sizeof(UINT32)) || !rgbSubCap)
1453
return TSPERR(TSS_E_BAD_PARAMETER);
1455
tcsCapArea = TCPA_CAP_PROPERTY;
1456
tcsSubCapContainer = *(UINT32 *)rgbSubCap;
1458
if (tcsSubCapContainer == TSS_TPMCAP_PROP_PCR) {
1459
tcsSubCap = TPM_CAP_PROP_PCR;
1460
correct_endianess = 1;
1461
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_DIR) {
1462
tcsSubCap = TPM_CAP_PROP_DIR;
1463
correct_endianess = 1;
1464
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_SLOTS) {
1465
tcsSubCap = TPM_CAP_PROP_SLOTS;
1466
correct_endianess = 1;
1467
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_MANUFACTURER) {
1468
tcsSubCap = TPM_CAP_PROP_MANUFACTURER;
1470
return TSPERR(TSS_E_BAD_PARAMETER);
1472
case TSS_TPMCAP_VERSION: /* Queries the current TPM version. */
1473
tcsCapArea = TCPA_CAP_VERSION;
1476
return TSPERR(TSS_E_BAD_PARAMETER);
1481
/* do an owner authorized get capability call */
1482
if ((result = get_tpm_flags(tspContext, hTPM, &volFlags, &nonVolFlags)))
1485
respLen = 2 * sizeof(UINT32);
1486
respData = calloc_tspi(tspContext, respLen);
1487
if (respData == NULL) {
1488
LogError("malloc of %d bytes failed.", respLen);
1489
return TSPERR(TSS_E_OUTOFMEMORY);
1493
Trspi_LoadBlob_UINT32(&offset, nonVolFlags, respData);
1494
Trspi_LoadBlob_UINT32(&offset, volFlags, respData);
1496
*pulRespDataLength = respLen;
1497
*prgbRespData = respData;
1499
tcsSubCap = endian32(tcsSubCap);
1501
result = TCSP_GetCapability(tspContext, tcsCapArea, ulSubCapLength,
1502
(BYTE *)&tcsSubCap, &respLen, &respData);
1504
*prgbRespData = calloc_tspi(tspContext, respLen);
1505
if (*prgbRespData == NULL) {
1507
LogError("malloc of %d bytes failed.", respLen);
1508
return TSPERR(TSS_E_OUTOFMEMORY);
1511
*pulRespDataLength = respLen;
1512
memcpy(*prgbRespData, respData, respLen);
1515
if (*pulRespDataLength == sizeof(UINT32) && correct_endianess) {
1516
*((UINT32 *)(*prgbRespData)) = endian32(*((UINT32 *)(*prgbRespData)));
1524
Tspi_TPM_GetCapabilitySigned(TSS_HTPM hTPM, /* in */
1525
TSS_HTPM hKey, /* in */
1526
TSS_FLAG capArea, /* in */
1527
UINT32 ulSubCapLength, /* in */
1528
BYTE * rgbSubCap, /* in */
1529
TSS_VALIDATION * pValidationData, /* in, out */
1530
UINT32 * pulRespDataLength, /* out */
1531
BYTE ** prgbRespData) /* out */
1535
* Function was found to have a vulnerability, so implementation is not
1536
* required by the TSS 1.1b spec.
1538
return TSPERR(TSS_E_NOTIMPL);
1541
TCS_CONTEXT_HANDLE tcsContext;
1545
TCPA_DIGEST hashDigest;
1546
TCPA_VERSION version;
1547
TSS_HPOLICY hPolicy;
1548
TCPA_NONCE antiReplay;
1549
TCS_KEY_HANDLE tcsKeyHandle;
1550
TCPA_CAPABILITY_AREA tcsCapArea;
1551
UINT32 tcsSubCapContainer;
1557
TCPA_KEY keyContainer;
1559
if (pulRespDataLength == NULL || prgbRespData == NULL)
1560
return TSPERR(TSS_E_BAD_PARAMETER);
1562
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1565
if ((result = obj_tpm_is_connected(hTPM, &tcsContext)))
1568
if ((result = obj_rsakey_get_tcs_handle(hKey, &tcsKeyHandle)))
1571
if ((result = obj_rsakey_get_policy(hKey, TSS_POLICY_USAGE, &hPolicy, NULL)))
1574
/* Verify the caps and subcaps */
1577
case TSS_TPMCAP_ALG: /* Queries whether an algorithm is supported. */
1578
tcsCapArea = TCPA_CAP_ALG;
1580
case TSS_TPMCAP_PROPERTY: /* Determines a physical property of the TPM. */
1581
tcsCapArea = TCPA_CAP_PROPERTY;
1582
tcsSubCapContainer = Decode_UINT32(rgbSubCap);
1583
if (tcsSubCapContainer == TSS_TPMCAP_PROP_PCR) {
1584
UINT32ToArray(TCPA_CAP_PROP_PCR, tcsSubCap);
1585
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_DIR) {
1586
UINT32ToArray(TCPA_CAP_PROP_DIR, tcsSubCap);
1587
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_SLOTS) {
1588
UINT32ToArray(TCPA_CAP_PROP_SLOTS, tcsSubCap);
1589
} else if (tcsSubCapContainer == TSS_TPMCAP_PROP_MANUFACTURER) {
1590
UINT32ToArray(TCPA_CAP_PROP_MANUFACTURER, tcsSubCap);
1592
return TSPERR(TSS_E_BAD_PARAMETER);
1594
case TSS_TPMCAP_VERSION: /* Queries the current TPM version. */
1595
tcsCapArea = TCPA_CAP_VERSION;
1598
return TSPERR(TSS_E_BAD_PARAMETER);
1601
/* If we get to this point, then neither getCapOwner nor an internal
1602
* getCap was called. */
1603
if (pValidationData == NULL) {
1604
if ((result = internal_GetRandomNonce(tcsContext, &antiReplay))) {
1605
LogError("Failed creating random nonce");
1606
return TSPERR(TSS_E_INTERNAL_ERROR);
1609
if (pValidationData->ulExternalDataLength < sizeof(antiReplay.nonce))
1610
return TSPERR(TSS_E_BAD_PARAMETER);
1612
memcpy(antiReplay.nonce, pValidationData->rgbExternalData,
1613
sizeof(antiReplay.nonce));
1616
/* Now do some Hashing */
1618
hashBlob = malloc((3 * sizeof(UINT32)) + sizeof(TCPA_NONCE) + ulSubCapLength);
1619
if (hashBlob == NULL) {
1620
LogError("malloc of %zd bytes failed.", (3 * sizeof(UINT32)) + sizeof(TCPA_NONCE)
1622
return TSPERR(TSS_E_OUTOFMEMORY);
1624
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_GetCapabilitySigned, hashBlob);
1625
Trspi_LoadBlob(&offset, sizeof(TCPA_NONCE), hashBlob, antiReplay.nonce);
1626
Trspi_LoadBlob_UINT32(&offset, tcsCapArea, hashBlob);
1627
Trspi_LoadBlob_UINT32(&offset, ulSubCapLength, hashBlob);
1628
Trspi_LoadBlob(&offset, ulSubCapLength, hashBlob, rgbSubCap);
1629
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1632
/* hashDigest now has the hash result */
1633
if ((result = secret_PerformAuth_OIAP(hKey, TPM_ORD_GetCapabilitySigned,
1634
hPolicy, &hashDigest, &auth)))
1637
if ((result = TCSP_GetCapabilitySigned(tcsContext,
1638
tcsKeyHandle, antiReplay,
1642
&auth, &version, pulRespDataLength,
1648
/* validate return auth */
1650
hashBlob = malloc(20 + *pulRespDataLength + sigSize);
1651
if (hashBlob == NULL) {
1652
LogError("malloc of %d bytes failed.", 20 + *pulRespDataLength + sigSize);
1654
return TSPERR(TSS_E_OUTOFMEMORY);
1656
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1657
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_GetCapabilitySigned, hashBlob);
1658
Trspi_LoadBlob_TCPA_VERSION(&offset, hashBlob, version);
1659
Trspi_LoadBlob_UINT32(&offset, *pulRespDataLength, hashBlob);
1660
Trspi_LoadBlob(&offset, *pulRespDataLength, hashBlob, *prgbRespData);
1661
Trspi_LoadBlob_UINT32(&offset, sigSize, hashBlob);
1662
Trspi_LoadBlob(&offset, sigSize, hashBlob, sig);
1663
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1666
if ((result = obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth))) {
1671
if (pValidationData == NULL) {
1672
if ((result = Tspi_GetAttribData(hKey, TSS_TSPATTRIB_KEY_BLOB,
1673
TSS_TSPATTRIB_KEYBLOB_BLOB, &keyDataSize, &keyData))) {
1675
LogError("Failed call to GetAttribData to get key blob");
1676
return TSPERR(TSS_E_INTERNAL_ERROR);
1680
Trspi_UnloadBlob_KEY(tspContext, &offset, keyData, &keyContainer);
1683
hashBlob = malloc(*pulRespDataLength + sizeof(TCPA_NONCE));
1684
if (hashBlob == NULL) {
1685
LogError("malloc of %zd bytes failed.", *pulRespDataLength + sizeof(TCPA_NONCE));
1687
return TSPERR(TSS_E_OUTOFMEMORY);
1689
Trspi_LoadBlob(&offset, *pulRespDataLength, hashBlob, *prgbRespData);
1690
Trspi_LoadBlob(&offset, sizeof(TCPA_NONCE), hashBlob, antiReplay.nonce);
1692
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
1695
if ((result = Trspi_Verify(TSS_HASH_SHA1, hashDigest.digest, 20,
1696
keyContainer.pubKey.key, keyContainer.pubKey.keyLength,
1699
return TSPERR(TSS_E_VERIFICATION_FAILED);
1703
pValidationData->DataLength = *pulRespDataLength + 20;
1704
pValidationData->Data = calloc_tspi(tspContext, *pulRespDataLength);
1705
if (pValidationData->Data == NULL) {
1706
LogError("malloc of %d bytes failed.", *pulRespDataLength);
1708
return TSPERR(TSS_E_OUTOFMEMORY);
1710
memcpy(pValidationData->Data, *prgbRespData, *pulRespDataLength);
1711
memcpy(&pValidationData->Data[(*pulRespDataLength)], antiReplay.nonce, 20);
1712
pValidationData->ValidationDataLength = sigSize;
1713
pValidationData->ValidationData = calloc_tspi(tspContext, sigSize);
1714
if (pValidationData->ValidationData == NULL) {
1715
LogError("malloc of %d bytes failed.", sigSize);
1717
return TSPERR(TSS_E_OUTOFMEMORY);
1719
memcpy(pValidationData->ValidationData, sig, sigSize);
1727
Tspi_TPM_CreateMaintenanceArchive(TSS_HTPM hTPM, /* in */
1728
TSS_BOOL fGenerateRndNumber, /* in */
1729
UINT32 * pulRndNumberLength, /* out */
1730
BYTE ** prgbRndNumber, /* out */
1731
UINT32 * pulArchiveDataLength, /* out */
1732
BYTE ** prgbArchiveData) /* out */
1735
TSS_HCONTEXT tspContext;
1736
TSS_HPOLICY hOwnerPolicy;
1742
if (pulArchiveDataLength == NULL || prgbArchiveData == NULL)
1743
return TSPERR(TSS_E_BAD_PARAMETER);
1745
if (fGenerateRndNumber &&
1746
(pulRndNumberLength == NULL || prgbRndNumber == NULL))
1747
return TSPERR(TSS_E_BAD_PARAMETER);
1749
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1752
if ((result = Tspi_GetPolicyObject(hTPM, TSS_POLICY_USAGE, &hOwnerPolicy)))
1756
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CreateMaintenanceArchive, hashBlob);
1757
Trspi_LoadBlob_BYTE(&offset, fGenerateRndNumber, hashBlob);
1758
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
1760
if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_CreateMaintenanceArchive,
1761
hOwnerPolicy, &digest,
1765
if ((result = TCSP_CreateMaintenanceArchive(tspContext, fGenerateRndNumber, &ownerAuth,
1766
pulRndNumberLength, prgbRndNumber,
1767
pulArchiveDataLength, prgbArchiveData)))
1771
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1772
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_CreateMaintenanceArchive, hashBlob);
1773
Trspi_LoadBlob_UINT32(&offset, *pulRndNumberLength, hashBlob);
1774
Trspi_LoadBlob(&offset, *pulRndNumberLength, hashBlob, *prgbRndNumber);
1775
Trspi_LoadBlob_UINT32(&offset, *pulArchiveDataLength, hashBlob);
1776
Trspi_LoadBlob(&offset, *pulArchiveDataLength, hashBlob, *prgbArchiveData);
1777
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
1779
if ((result = obj_policy_validate_auth_oiap(hOwnerPolicy, &digest, &ownerAuth)))
1786
Tspi_TPM_KillMaintenanceFeature(TSS_HTPM hTPM) /* in */
1789
TSS_HCONTEXT tspContext;
1790
TSS_HPOLICY hOwnerPolicy;
1796
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1799
if ((result = Tspi_GetPolicyObject(hTPM, TSS_POLICY_USAGE, &hOwnerPolicy)))
1803
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_KillMaintenanceFeature, hashBlob);
1804
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
1806
if ((result = secret_PerformAuth_OIAP(hTPM,
1807
TPM_ORD_KillMaintenanceFeature,
1808
hOwnerPolicy, &digest,
1812
if ((result = TCSP_KillMaintenanceFeature(tspContext, &ownerAuth)))
1816
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
1817
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_KillMaintenanceFeature, hashBlob);
1818
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
1820
if ((result = obj_policy_validate_auth_oiap(hOwnerPolicy, &digest, &ownerAuth)))
1827
Tspi_TPM_LoadMaintenancePubKey(TSS_HTPM hTPM, /* in */
1828
TSS_HKEY hMaintenanceKey, /* in */
1829
TSS_VALIDATION * pValidationData) /* in, out */
1832
TSS_HCONTEXT tspContext;
1833
TCPA_DIGEST checkSum, digest;
1837
BYTE hashBlob[512], *pubBlob;
1839
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1842
if (pValidationData == NULL) {
1843
if ((result = internal_GetRandomNonce(tspContext, &nonce)))
1846
if (pValidationData->ulExternalDataLength < sizeof(nonce.nonce))
1847
return TSPERR(TSS_E_BAD_PARAMETER);
1849
memcpy(&nonce.nonce, pValidationData->rgbExternalData, sizeof(nonce.nonce));
1852
if ((result = obj_rsakey_get_pub_blob(hMaintenanceKey, &pubBlobSize, &pubBlob)))
1855
if ((result = TCSP_LoadManuMaintPub(tspContext, nonce, pubBlobSize, pubBlob, &checkSum)))
1859
Trspi_LoadBlob(&offset, pubBlobSize, hashBlob, pubBlob);
1860
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, hashBlob, (BYTE *)&nonce.nonce);
1862
if (pValidationData == NULL) {
1863
if ((result = Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest)))
1866
if (memcmp(&digest.digest, &checkSum.digest, TCPA_SHA1_160_HASH_LEN))
1867
result = TSPERR(TSS_E_FAIL);
1869
if ((pValidationData->rgbData = calloc_tspi(tspContext, offset)) == NULL)
1870
return TSPERR(TSS_E_OUTOFMEMORY);
1872
pValidationData->ulDataLength = offset;
1873
memcpy(pValidationData->rgbData, hashBlob, offset);
1875
if ((pValidationData->rgbValidationData = calloc_tspi(tspContext,
1876
TCPA_SHA1_160_HASH_LEN))
1878
free_tspi(tspContext, pValidationData->rgbData);
1879
pValidationData->rgbData = NULL;
1880
pValidationData->ulDataLength = 0;
1881
return TSPERR(TSS_E_OUTOFMEMORY);
1883
pValidationData->ulValidationDataLength = TCPA_SHA1_160_HASH_LEN;
1885
memcpy(pValidationData->rgbValidationData, checkSum.digest, TCPA_SHA1_160_HASH_LEN);
1892
Tspi_TPM_CheckMaintenancePubKey(TSS_HTPM hTPM, /* in */
1893
TSS_HKEY hMaintenanceKey, /* in */
1894
TSS_VALIDATION * pValidationData) /* in, out */
1897
TSS_HCONTEXT tspContext;
1898
TCPA_DIGEST checkSum, digest;
1902
BYTE hashBlob[512], *pubBlob;
1904
if ((pValidationData && hMaintenanceKey) || (!pValidationData && !hMaintenanceKey))
1905
return TSPERR(TSS_E_BAD_PARAMETER);
1907
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1910
if (pValidationData == NULL) {
1911
if ((result = internal_GetRandomNonce(tspContext, &nonce)))
1914
if (pValidationData->ulExternalDataLength < sizeof(nonce.nonce))
1915
return TSPERR(TSS_E_BAD_PARAMETER);
1917
memcpy(&nonce.nonce, pValidationData->rgbExternalData, sizeof(nonce.nonce));
1920
if ((result = TCSP_ReadManuMaintPub(tspContext, nonce, &checkSum)))
1923
if (pValidationData == NULL) {
1924
if ((result = obj_rsakey_get_pub_blob(hMaintenanceKey, &pubBlobSize, &pubBlob)))
1928
Trspi_LoadBlob(&offset, pubBlobSize, hashBlob, pubBlob);
1929
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, hashBlob, (BYTE *)&nonce.nonce);
1931
if ((result = Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest))) {
1932
free_tspi(tspContext, pubBlob);
1936
if (memcmp(&digest.digest, &checkSum.digest, TCPA_SHA1_160_HASH_LEN))
1937
result = TSPERR(TSS_E_FAIL);
1939
free_tspi(tspContext, pubBlob);
1941
/* Ignore Data and DataLength, the application must already have this data.
1942
* Do, however, copy out the checksum so that the application can verify */
1943
if ((pValidationData->rgbValidationData = calloc_tspi(tspContext,
1944
TCPA_SHA1_160_HASH_LEN))
1946
return TSPERR(TSS_E_OUTOFMEMORY);
1948
pValidationData->ulValidationDataLength = TCPA_SHA1_160_HASH_LEN;
1949
memcpy(pValidationData->rgbValidationData, checkSum.digest, TCPA_SHA1_160_HASH_LEN);
1956
Tspi_TPM_GetRandom(TSS_HTPM hTPM, /* in */
1957
UINT32 ulRandomDataLength, /* in */
1958
BYTE ** prgbRandomData) /* out */
1960
TSS_HCONTEXT tspContext;
1963
if (prgbRandomData == NULL || ulRandomDataLength > 4096)
1964
return TSPERR(TSS_E_BAD_PARAMETER);
1966
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1969
if (ulRandomDataLength == 0)
1972
if ((result = TCSP_GetRandom(tspContext, ulRandomDataLength, prgbRandomData)))
1979
Tspi_TPM_StirRandom(TSS_HTPM hTPM, /* in */
1980
UINT32 ulEntropyDataLength, /* in */
1981
BYTE * rgbEntropyData) /* in */
1984
TSS_HCONTEXT tspContext;
1986
if (ulEntropyDataLength > 0 && rgbEntropyData == NULL)
1987
return TSPERR(TSS_E_BAD_PARAMETER);
1989
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
1992
if ((result = TCSP_StirRandom(tspContext, ulEntropyDataLength, rgbEntropyData)))
1999
Tspi_TPM_AuthorizeMigrationTicket(TSS_HTPM hTPM, /* in */
2000
TSS_HKEY hMigrationKey, /* in */
2001
TSS_MIGRATION_SCHEME migrationScheme, /* in */
2002
UINT32 * pulMigTicketLength, /* out */
2003
BYTE ** prgbMigTicket) /* out */
2006
BYTE hashblob[0x1000];
2009
TSS_HPOLICY hOwnerPolicy;
2010
UINT32 migrationKeySize;
2011
BYTE *migrationKeyBlob;
2013
BYTE pubKeyBlob[0x1000];
2016
TSS_HCONTEXT tspContext;
2017
UINT32 tpmMigrationScheme;
2019
if (pulMigTicketLength == NULL || prgbMigTicket == NULL)
2020
return TSPERR(TSS_E_BAD_PARAMETER);
2022
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2025
/* get the tpm Policy */
2026
if ((result = Tspi_GetPolicyObject(hTPM, TSS_POLICY_USAGE, &hOwnerPolicy)))
2029
switch (migrationScheme) {
2030
case TSS_MS_MIGRATE:
2031
tpmMigrationScheme = TCPA_MS_MIGRATE;
2034
tpmMigrationScheme = TCPA_MS_REWRAP;
2037
tpmMigrationScheme = TCPA_MS_MAINT;
2040
return TSPERR(TSS_E_BAD_PARAMETER);
2044
/* Get the migration key blob */
2045
if ((result = obj_rsakey_get_blob(hMigrationKey,
2046
&migrationKeySize, &migrationKeyBlob)))
2049
/* First, turn the keyBlob into a TCPA_KEY structure */
2051
memset(&tcpaKey, 0, sizeof(TCPA_KEY));
2052
if ((result = Trspi_UnloadBlob_KEY(&offset, migrationKeyBlob, &tcpaKey))) {
2053
free_tspi(tspContext, migrationKeyBlob);
2056
free_tspi(tspContext, migrationKeyBlob);
2058
/* Then pull the _PUBKEY portion out of that struct into a blob */
2060
Trspi_LoadBlob_KEY_PARMS(&offset, pubKeyBlob, &tcpaKey.algorithmParms);
2061
Trspi_LoadBlob_STORE_PUBKEY(&offset, pubKeyBlob, &tcpaKey.pubKey);
2062
pubKeySize = offset;
2063
free_key_refs(&tcpaKey);
2067
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_AuthorizeMigrationKey, hashblob);
2068
Trspi_LoadBlob_UINT16(&offset, tpmMigrationScheme, hashblob);
2069
Trspi_LoadBlob(&offset, pubKeySize, hashblob, pubKeyBlob);
2070
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
2072
if ((result = secret_PerformAuth_OIAP(hTPM,
2073
TPM_ORD_AuthorizeMigrationKey,
2074
hOwnerPolicy, &digest,
2079
if ((result = TCSP_AuthorizeMigrationKey(tspContext, migrationScheme, pubKeySize,
2080
pubKeyBlob, &ownerAuth, pulMigTicketLength,
2086
Trspi_LoadBlob_UINT32(&offset, result, hashblob);
2087
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_AuthorizeMigrationKey, hashblob);
2088
Trspi_LoadBlob(&offset, *pulMigTicketLength, hashblob, *prgbMigTicket);
2089
Trspi_Hash(TSS_HASH_SHA1, offset, hashblob, digest.digest);
2091
if ((result = obj_policy_validate_auth_oiap(hOwnerPolicy, &digest, &ownerAuth))) {
2092
free_tspi(tspContext, prgbMigTicket);
2100
Tspi_TPM_GetEvent(TSS_HTPM hTPM, /* in */
2101
UINT32 ulPcrIndex, /* in */
2102
UINT32 ulEventNumber, /* in */
2103
TSS_PCR_EVENT * pPcrEvent) /* out */
2105
TSS_HCONTEXT tspContext;
2107
TSS_PCR_EVENT *event = NULL;
2109
if (pPcrEvent == NULL)
2110
return TSPERR(TSS_E_BAD_PARAMETER);
2112
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2115
if ((result = TCS_GetPcrEvent(tspContext, ulPcrIndex, &ulEventNumber, &event)))
2118
memcpy(pPcrEvent, event, sizeof(TSS_PCR_EVENT));
2125
Tspi_TPM_GetEvents(TSS_HTPM hTPM, /* in */
2126
UINT32 ulPcrIndex, /* in */
2127
UINT32 ulStartNumber, /* in */
2128
UINT32 * pulEventNumber, /* in, out */
2129
TSS_PCR_EVENT ** prgbPcrEvents) /* out */
2131
TSS_HCONTEXT tspContext;
2133
TSS_PCR_EVENT *events = NULL;
2135
if (pulEventNumber == NULL)
2136
return TSPERR(TSS_E_BAD_PARAMETER);
2138
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2141
if (prgbPcrEvents) {
2142
if ((result = TCS_GetPcrEventsByPcr(tspContext, ulPcrIndex, ulStartNumber,
2143
pulEventNumber, &events)))
2146
*prgbPcrEvents = events;
2148
/* if the pointer to receive events is NULL, the app only
2149
* wants a total number of events for this PCR. */
2150
if ((result = TCS_GetPcrEvent(tspContext, ulPcrIndex, pulEventNumber, NULL)))
2158
Tspi_TPM_GetEventLog(TSS_HTPM hTPM, /* in */
2159
UINT32 * pulEventNumber, /* out */
2160
TSS_PCR_EVENT ** prgbPcrEvents) /* out */
2162
TSS_HCONTEXT tspContext;
2165
if (pulEventNumber == NULL)
2166
return TSPERR(TSS_E_BAD_PARAMETER);
2168
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2171
/* if the pointer to receive events is NULL, the app only wants a
2172
* total number of events for all PCRs. */
2173
if (prgbPcrEvents == NULL) {
2174
UINT16 numPcrs = get_num_pcrs(tspContext); /* XXX Error check needed */
2175
UINT32 i, numEvents = 0;
2177
*pulEventNumber = 0;
2178
for (i = 0; i < numPcrs; i++) {
2179
if ((result = TCS_GetPcrEvent(tspContext, i, &numEvents, NULL)))
2182
*pulEventNumber += numEvents;
2185
return TCS_GetPcrEventLog(tspContext, pulEventNumber, prgbPcrEvents);
2192
Tspi_TPM_Quote(TSS_HTPM hTPM, /* in */
2193
TSS_HKEY hIdentKey, /* in */
2194
TSS_HPCRS hPcrComposite, /* in */
2195
TSS_VALIDATION * pValidationData) /* in, out */
2199
TPM_AUTH *pPrivAuth = &privAuth;
2201
BYTE hashBlob[1000];
2202
TCPA_DIGEST digest, composite;
2203
TCS_KEY_HANDLE tcsKeyHandle;
2204
TSS_HPOLICY hPolicy;
2205
TCPA_NONCE antiReplay;
2208
TCPA_PCR_SELECTION pcrSelect;
2209
UINT32 validationLength = 0;
2210
BYTE *validationData = NULL;
2211
UINT32 pcrDataOutSize;
2215
TCPA_KEY keyContainer;
2216
BYTE quoteinfo[1024];
2218
TSS_HCONTEXT tspContext;
2220
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2223
if (hPcrComposite && !obj_is_pcrs(hPcrComposite))
2224
return TSPERR(TSS_E_INVALID_HANDLE);
2226
/* get the identKey Policy */
2227
if ((result = obj_rsakey_get_policy(hIdentKey, TSS_POLICY_USAGE,
2228
&hPolicy, &usesAuth)))
2231
/* get the Identity TCS keyHandle */
2232
if ((result = obj_rsakey_get_tcs_handle(hIdentKey, &tcsKeyHandle)))
2235
if (pValidationData == NULL) {
2236
if ((result = internal_GetRandomNonce(tspContext, &antiReplay)))
2239
if (pValidationData->ulExternalDataLength < sizeof(antiReplay.nonce))
2240
return TSPERR(TSS_E_BAD_PARAMETER);
2242
memcpy(antiReplay.nonce, pValidationData->rgbExternalData,
2243
sizeof(antiReplay.nonce));
2247
if (hPcrComposite) {
2249
/* calling get_composite first forces the TSP to call the TCS
2250
* to make sure the pcr selection structure is correct */
2251
if ((result = obj_pcrs_get_composite(hPcrComposite, &composite)))
2254
if ((result = obj_pcrs_get_selection(hPcrComposite, &pcrSelect)))
2257
Trspi_LoadBlob_PCR_SELECTION(&offset, pcrData, &pcrSelect);
2258
pcrDataSize = offset;
2259
free(pcrSelect.pcrSelect);
2263
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_Quote, hashBlob);
2264
Trspi_LoadBlob(&offset, 20, hashBlob, antiReplay.nonce);
2265
Trspi_LoadBlob(&offset, pcrDataSize, hashBlob, pcrData);
2266
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
2269
if ((result = secret_PerformAuth_OIAP(hIdentKey, TPM_ORD_Quote,
2274
pPrivAuth = &privAuth;
2279
if ((result = TCSP_Quote(tspContext, tcsKeyHandle, antiReplay, pcrDataSize, pcrData,
2280
pPrivAuth, &pcrDataOutSize, &pcrDataOut, &validationLength,
2285
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
2286
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_Quote, hashBlob);
2287
Trspi_LoadBlob(&offset, pcrDataOutSize, hashBlob, pcrDataOut);
2288
Trspi_LoadBlob_UINT32(&offset, validationLength, hashBlob);
2289
Trspi_LoadBlob(&offset, validationLength, hashBlob, validationData);
2290
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, digest.digest);
2292
if (usesAuth == TRUE) {
2293
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &privAuth))) {
2295
free(validationData);
2300
if (hPcrComposite) {
2301
TCPA_PCR_COMPOSITE pcrComp;
2304
if ((result = Trspi_UnloadBlob_PCR_COMPOSITE(&offset, pcrDataOut,
2307
free(validationData);
2311
if ((result = obj_pcrs_set_values(hPcrComposite, &pcrComp))) {
2313
free(validationData);
2318
if ((result = Tspi_GetAttribData(hIdentKey, TSS_TSPATTRIB_KEY_BLOB,
2319
TSS_TSPATTRIB_KEYBLOB_BLOB,
2320
&keyDataSize, &keyData))) {
2322
free(validationData);
2326
/* create the validation data */
2328
memset(&keyContainer, 0, sizeof(TCPA_KEY));
2329
if ((result = Trspi_UnloadBlob_KEY(&offset, keyData, &keyContainer)))
2332
/* creating pcrCompositeHash */
2333
Trspi_Hash(TSS_HASH_SHA1, pcrDataOutSize, pcrDataOut, digest.digest);
2336
/* generate Quote_info struct */
2337
/* 1. add version */
2339
Trspi_LoadBlob_TCPA_VERSION(&offset, quoteinfo, keyContainer.ver);
2341
quoteinfo[offset++] = 'Q';
2342
quoteinfo[offset++] = 'U';
2343
quoteinfo[offset++] = 'O';
2344
quoteinfo[offset++] = 'T';
2345
/* 3. Composite Hash */
2346
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, quoteinfo,
2348
/* 4. AntiReplay Nonce */
2349
Trspi_LoadBlob(&offset, TCPA_SHA1_160_HASH_LEN, quoteinfo,
2352
if (pValidationData == NULL) {
2353
/* validate the data here */
2354
Trspi_Hash(TSS_HASH_SHA1, offset, quoteinfo, digest.digest);
2356
if ((result = Trspi_Verify(TSS_HASH_SHA1, digest.digest, 20,
2357
keyContainer.pubKey.key,
2358
keyContainer.pubKey.keyLength,
2360
validationLength))) {
2361
free_key_refs(&keyContainer);
2362
free(validationData);
2365
free_key_refs(&keyContainer);
2367
free_key_refs(&keyContainer);
2369
pValidationData->rgbValidationData = calloc_tspi(tspContext, validationLength);
2370
if (pValidationData->rgbValidationData == NULL) {
2371
LogError("malloc of %u bytes failed.", validationLength);
2372
return TSPERR(TSS_E_OUTOFMEMORY);
2374
pValidationData->ulValidationDataLength = validationLength;
2375
memcpy(pValidationData->rgbValidationData, validationData, validationLength);
2376
free(validationData);
2378
pValidationData->rgbData = calloc_tspi(tspContext, offset);
2379
if (pValidationData->rgbData == NULL) {
2380
LogError("malloc of %" PRIu64 " bytes failed.", offset);
2381
free_tspi(tspContext, pValidationData->rgbValidationData);
2382
pValidationData->rgbValidationData = NULL;
2383
pValidationData->ulValidationDataLength = 0;
2384
return TSPERR(TSS_E_OUTOFMEMORY);
2386
pValidationData->ulDataLength = (UINT32)offset;
2387
memcpy(pValidationData->rgbData, quoteinfo, offset);
2394
Tspi_TPM_PcrExtend(TSS_HTPM hTPM, /* in */
2395
UINT32 ulPcrIndex, /* in */
2396
UINT32 ulPcrDataLength, /* in */
2397
BYTE *pbPcrData, /* in */
2398
TSS_PCR_EVENT *pPcrEvent, /* in */
2399
UINT32 * pulPcrValueLength, /* out */
2400
BYTE ** prgbPcrValue) /* out */
2402
TCPA_PCRVALUE outDigest;
2404
BYTE *extendData, *hashData;
2406
UINT32 number, dataSize;
2407
TSS_HCONTEXT tspContext;
2410
if (pulPcrValueLength == NULL || prgbPcrValue == NULL)
2411
return TSPERR(TSS_E_BAD_PARAMETER);
2413
if (ulPcrDataLength > 0 && pbPcrData == NULL)
2414
return TSPERR(TSS_E_BAD_PARAMETER);
2416
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2420
dataSize = (2 * sizeof(UINT32)) + pPcrEvent->ulEventLength + ulPcrDataLength;
2421
if ((hashData = malloc(dataSize)) == NULL) {
2422
LogError("malloc of %u bytes failed.", dataSize);
2423
return TSPERR(TSS_E_OUTOFMEMORY);
2426
/* Create data to extend according to the TSS 1.2 spec section 2.6.2
2427
* 'TSS_PCR_EVENT', in the 'rgbPcrValue' parameter description. */
2429
Trspi_LoadBlob_UINT32(&offset, ulPcrIndex, hashData);
2430
Trspi_LoadBlob(&offset, ulPcrDataLength, hashData, pbPcrData);
2431
Trspi_LoadBlob_UINT32(&offset, pPcrEvent->eventType, hashData);
2432
Trspi_LoadBlob(&offset, pPcrEvent->ulEventLength, hashData, pPcrEvent->rgbEvent);
2433
if ((result = Trspi_Hash(TSS_HASH_SHA1, offset, hashData, digest.digest))) {
2439
extendData = (BYTE *)&digest.digest;
2441
if (ulPcrDataLength != TCPA_SHA1_160_HASH_LEN)
2442
return TSPERR(TSS_E_BAD_PARAMETER);
2444
extendData = pbPcrData;
2447
if ((result = TCSP_Extend(tspContext, ulPcrIndex, *(TCPA_DIGEST *)extendData, &outDigest)))
2450
/* log the event structure if its passed in */
2452
/* Set the PCR index in the event struct */
2453
pPcrEvent->ulPcrIndex = ulPcrIndex;
2455
/* Allocate space for and set the data extended into the TPM in the event struct */
2456
if ((pPcrEvent->rgbPcrValue = calloc_tspi(tspContext,
2457
TCPA_SHA1_160_HASH_LEN)) == NULL) {
2458
LogError("malloc of %d bytes failed.", TCPA_SHA1_160_HASH_LEN);
2459
return TSPERR(TSS_E_OUTOFMEMORY);
2462
memcpy(pPcrEvent->rgbPcrValue, extendData, TCPA_SHA1_160_HASH_LEN);
2463
pPcrEvent->ulPcrValueLength = TCPA_SHA1_160_HASH_LEN;
2465
/* Set the version info in the event struct */
2466
memcpy(&pPcrEvent->versionInfo, &VERSION_1_1, sizeof(TCPA_VERSION));
2468
/* Send the log to the TCS */
2469
if ((result = TCS_LogPcrEvent(tspContext, *pPcrEvent, &number)))
2473
*prgbPcrValue = calloc_tspi(tspContext, sizeof(TCPA_PCRVALUE));
2474
if (*prgbPcrValue == NULL) {
2475
LogError("malloc of %zd bytes failed.", sizeof(TCPA_PCRVALUE));
2476
return TSPERR(TSS_E_OUTOFMEMORY);
2479
memcpy(*prgbPcrValue, &outDigest, sizeof(TCPA_PCRVALUE));
2480
*pulPcrValueLength = sizeof(TCPA_PCRVALUE);
2486
Tspi_TPM_PcrRead(TSS_HTPM hTPM, /* in */
2487
UINT32 ulPcrIndex, /* in */
2488
UINT32 *pulPcrValueLength, /* out */
2489
BYTE **prgbPcrValue) /* out */
2491
TCPA_PCRVALUE outDigest;
2493
TSS_HCONTEXT tspContext;
2495
if (pulPcrValueLength == NULL || prgbPcrValue == NULL)
2496
return TSPERR(TSS_E_BAD_PARAMETER);
2498
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2501
if ((result = TCSP_PcrRead(tspContext, ulPcrIndex, &outDigest)))
2504
*prgbPcrValue = calloc_tspi(tspContext, sizeof(TCPA_PCRVALUE));
2505
if (*prgbPcrValue == NULL) {
2506
LogError("malloc of %zd bytes failed.", sizeof(TCPA_PCRVALUE));
2507
return TSPERR(TSS_E_OUTOFMEMORY);
2509
memcpy(*prgbPcrValue, outDigest.digest, sizeof(TCPA_PCRVALUE));
2510
*pulPcrValueLength = sizeof(TCPA_PCRVALUE);
2516
Tspi_TPM_DirWrite(TSS_HTPM hTPM, /* in */
2517
UINT32 ulDirIndex, /* in */
2518
UINT32 ulDirDataLength, /* in */
2519
BYTE * rgbDirData) /* in */
2521
TSS_HCONTEXT tspContext;
2524
TCPA_DIGEST hashDigest;
2527
TSS_HPOLICY hPolicy;
2528
TCPA_DIRVALUE dirValue = { { 0 } };
2530
if (rgbDirData == NULL || (ulDirDataLength != (UINT32)sizeof(TCPA_DIRVALUE)))
2531
return TSPERR(TSS_E_BAD_PARAMETER);
2533
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2536
if ((result = obj_tpm_get_policy(hTPM, &hPolicy)))
2539
memcpy((BYTE *)&dirValue, rgbDirData, ulDirDataLength);
2541
/* hash to be used for the OIAP calc */
2543
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DirWriteAuth, hashBlob);
2544
Trspi_LoadBlob_UINT32(&offset, ulDirIndex, hashBlob);
2545
Trspi_LoadBlob(&offset, (UINT32)sizeof(TCPA_DIRVALUE), hashBlob, (BYTE *)&dirValue);
2546
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
2548
/* hashDigest now has the hash result */
2549
if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_DirWriteAuth,
2550
hPolicy, &hashDigest,
2554
if ((result = TCSP_DirWriteAuth(tspContext, ulDirIndex, dirValue, &auth)))
2558
Trspi_LoadBlob_UINT32(&offset, result, hashBlob);
2559
Trspi_LoadBlob_UINT32(&offset, TPM_ORD_DirWriteAuth, hashBlob);
2560
Trspi_Hash(TSS_HASH_SHA1, offset, hashBlob, hashDigest.digest);
2562
return obj_policy_validate_auth_oiap(hPolicy, &hashDigest, &auth);
2566
Tspi_TPM_DirRead(TSS_HTPM hTPM, /* in */
2567
UINT32 ulDirIndex, /* in */
2568
UINT32 * pulDirDataLength, /* out */
2569
BYTE ** prgbDirData) /* out */
2571
TCPA_DIRVALUE dirValue;
2573
TSS_HCONTEXT tspContext;
2575
if (pulDirDataLength == NULL || prgbDirData == NULL)
2576
return TSPERR(TSS_E_BAD_PARAMETER);
2578
if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
2581
if ((result = TCSP_DirRead(tspContext, ulDirIndex, &dirValue)))
2584
*pulDirDataLength = 20;
2585
*prgbDirData = calloc_tspi(tspContext, *pulDirDataLength);
2586
if (*prgbDirData == NULL) {
2587
LogError("malloc of %d bytes failed.", *pulDirDataLength);
2588
return TSPERR(TSS_E_OUTOFMEMORY);
2590
memcpy(*prgbDirData, dirValue.digest, *pulDirDataLength);