3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2007
17
#include "trousers/tss.h"
18
#include "trousers/trousers.h"
19
#include "trousers_types.h"
20
#include "spi_utils.h"
26
Tspi_TPM_CMKSetRestrictions(TSS_HTPM hTpm, /* in */
27
TSS_CMK_DELEGATE CmkDelegate) /* in */
29
TSS_HCONTEXT hContext;
31
Trspi_HashCtx hashCtx;
36
if ((result = obj_tpm_get_tsp_context(hTpm, &hContext)))
39
if ((result = obj_tpm_get_policy(hTpm, TSS_POLICY_USAGE, &hPolicy)))
42
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
43
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_SetRestrictions);
44
result |= Trspi_Hash_UINT32(&hashCtx, CmkDelegate);
45
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
48
if ((result = secret_PerformAuth_OIAP(hTpm, TPM_ORD_CMK_SetRestrictions,
49
hPolicy, FALSE, &digest, &ownerAuth)))
52
if ((result = RPC_CMK_SetRestrictions(hContext, CmkDelegate, &ownerAuth)))
55
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
56
result |= Trspi_Hash_UINT32(&hashCtx, result);
57
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_SetRestrictions);
58
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
61
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
68
Tspi_TPM_CMKApproveMA(TSS_HTPM hTpm, /* in */
69
TSS_HMIGDATA hMaAuthData) /* in */
71
TSS_HCONTEXT hContext;
77
Trspi_HashCtx hashCtx;
82
if ((result = obj_tpm_get_tsp_context(hTpm, &hContext)))
85
if ((result = obj_tpm_get_policy(hTpm, TSS_POLICY_USAGE, &hPolicy)))
88
if ((result = obj_migdata_get_msa_digest(hMaAuthData, &blobSize, &blob)))
90
memcpy(msaDigest.digest, blob, sizeof(msaDigest.digest));
91
free_tspi(hContext, blob);
93
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
94
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_ApproveMA);
95
result |= Trspi_Hash_DIGEST(&hashCtx, msaDigest.digest);
96
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
99
if ((result = secret_PerformAuth_OIAP(hTpm, TPM_ORD_CMK_ApproveMA,
100
hPolicy, FALSE, &digest, &ownerAuth)))
103
if ((result = RPC_CMK_ApproveMA(hContext, msaDigest, &ownerAuth, &msaHmac)))
106
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
107
result |= Trspi_Hash_UINT32(&hashCtx, result);
108
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_ApproveMA);
109
result |= Trspi_Hash_HMAC(&hashCtx, msaHmac.digest);
110
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
113
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
116
if ((result = obj_migdata_set_msa_hmac(hMaAuthData, sizeof(msaHmac.digest), msaHmac.digest)))
123
Tspi_TPM_CMKCreateTicket(TSS_HTPM hTpm, /* in */
124
TSS_HKEY hVerifyKey, /* in */
125
TSS_HMIGDATA hSigData) /* in */
127
TSS_HCONTEXT hContext;
137
Trspi_HashCtx hashCtx;
142
if ((result = obj_tpm_get_tsp_context(hTpm, &hContext)))
145
if ((result = obj_tpm_get_policy(hTpm, TSS_POLICY_USAGE, &hPolicy)))
148
if ((result = obj_rsakey_get_pub_blob(hVerifyKey, &pubKeySize, &pubKey)))
151
if ((result = obj_migdata_get_sig_data(hSigData, &blobSize, &blob)))
153
memcpy(sigData.digest, blob, sizeof(sigData.digest));
154
free_tspi(hContext, blob);
156
if ((result = obj_migdata_get_sig_value(hSigData, &sigSize, &sig)))
159
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
160
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_CreateTicket);
161
result |= Trspi_HashUpdate(&hashCtx, pubKeySize, pubKey);
162
result |= Trspi_Hash_DIGEST(&hashCtx, sigData.digest);
163
result |= Trspi_Hash_UINT32(&hashCtx, sigSize);
164
result |= Trspi_HashUpdate(&hashCtx, sigSize, sig);
165
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
168
if ((result = secret_PerformAuth_OIAP(hTpm, TPM_ORD_CMK_CreateTicket,
169
hPolicy, FALSE, &digest, &ownerAuth)))
172
if ((result = RPC_CMK_CreateTicket(hContext, pubKeySize, pubKey, sigData, sigSize, sig,
173
&ownerAuth, &sigTicket)))
176
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
177
result |= Trspi_Hash_UINT32(&hashCtx, result);
178
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_CreateTicket);
179
result |= Trspi_Hash_HMAC(&hashCtx, sigTicket.digest);
180
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
183
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
186
if ((result = obj_migdata_set_sig_ticket(hSigData, sizeof(sigTicket.digest), sigTicket.digest)))
190
free_tspi(hContext, pubKey);
191
free_tspi(hContext, sig);
197
Tspi_Key_CMKCreateBlob(TSS_HKEY hKeyToMigrate, /* in */
198
TSS_HKEY hParentKey, /* in */
199
TSS_HMIGDATA hMigrationData, /* in */
200
UINT32* pulRandomLength, /* out */
201
BYTE** prgbRandom) /* out */
203
TSS_HCONTEXT hContext;
206
TCS_KEY_HANDLE tcsKeyHandle;
207
TSS_MIGRATE_SCHEME migScheme;
208
UINT32 migTicketSize;
209
BYTE *migTicket = NULL;
210
TPM_MIGRATIONKEYAUTH tpmMigKeyAuth;
211
UINT32 msaListSize, restrictTicketSize, sigTicketSize, blobSize;
212
BYTE *msaList = NULL, *restrictTicket = NULL, *blob = NULL;
213
BYTE *sigTicket = NULL;
215
BYTE *pubBlob = NULL;
216
TPM_DIGEST srcPubKeyDigest;
218
UINT32 randomDataSize, outDataSize, newBlobSize;
219
BYTE *randomData = NULL, *outData = NULL, *newBlob = NULL;
220
Trspi_HashCtx hashCtx;
222
TPM_AUTH parentAuth, *pAuth;
226
memset(&tssKey, 0, sizeof(tssKey));
228
if (!pulRandomLength || !prgbRandom)
229
return TSPERR(TSS_E_BAD_PARAMETER);
231
if (!obj_rsakey_is_cmk(hKeyToMigrate))
232
return TSPERR(TSS_E_BAD_PARAMETER);
234
if ((result = obj_rsakey_get_tsp_context(hKeyToMigrate, &hContext)))
237
if ((result = obj_rsakey_get_policy(hParentKey, TSS_POLICY_USAGE, &hPolicy, &usageAuth)))
240
if ((result = obj_rsakey_get_tcs_handle(hParentKey, &tcsKeyHandle)))
243
if ((result = obj_migdata_get_ticket_blob(hMigrationData, &migTicketSize, &migTicket)))
246
/* Just to get the migration scheme... */
248
if ((result = Trspi_UnloadBlob_MIGRATIONKEYAUTH(&offset, migTicket, &tpmMigKeyAuth)))
250
/* ... so free everything now */
251
free(tpmMigKeyAuth.migrationKey.algorithmParms.parms);
252
free(tpmMigKeyAuth.migrationKey.pubKey.key);
253
migScheme = tpmMigKeyAuth.migrationScheme;
255
if ((result = obj_rsakey_get_pub_blob(hKeyToMigrate, &pubBlobSize, &pubBlob)))
257
if ((result = obj_migdata_calc_pubkey_digest(pubBlobSize, pubBlob, &srcPubKeyDigest)))
260
if ((result = obj_migdata_get_msa_list_blob(hMigrationData, &msaListSize, &msaList)))
263
if (tpmMigKeyAuth.migrationScheme == TPM_MS_RESTRICT_APPROVE_DOUBLE) {
264
if ((result = obj_migdata_get_cmk_auth_blob(hMigrationData, &restrictTicketSize,
267
if ((result = obj_migdata_get_sig_ticket(hMigrationData, &sigTicketSize,
271
restrictTicketSize = 0;
275
if ((result = obj_rsakey_get_blob(hKeyToMigrate, &blobSize, &blob)))
279
if ((result = UnloadBlob_TSS_KEY(&offset, blob, &tssKey)))
285
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
286
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_CreateBlob);
287
result |= Trspi_Hash_UINT16(&hashCtx, migScheme);
288
result |= Trspi_HashUpdate(&hashCtx, migTicketSize, migTicket);
289
result |= Trspi_Hash_DIGEST(&hashCtx, srcPubKeyDigest.digest);
290
result |= Trspi_Hash_UINT32(&hashCtx, msaListSize);
291
result |= Trspi_HashUpdate(&hashCtx, msaListSize, msaList);
292
result |= Trspi_Hash_UINT32(&hashCtx, restrictTicketSize);
293
result |= Trspi_HashUpdate(&hashCtx, restrictTicketSize, restrictTicket);
294
result |= Trspi_Hash_UINT32(&hashCtx, sigTicketSize);
295
result |= Trspi_HashUpdate(&hashCtx, sigTicketSize, sigTicket);
296
result |= Trspi_Hash_UINT32(&hashCtx, tssKey.encSize);
297
result |= Trspi_HashUpdate(&hashCtx, tssKey.encSize, tssKey.encData);
298
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
301
if ((result = secret_PerformAuth_OIAP(hParentKey, TPM_ORD_CMK_CreateBlob,
302
hPolicy, FALSE, &digest, pAuth)))
307
if ((result = RPC_CMK_CreateBlob(hContext, tcsKeyHandle, migScheme,
308
migTicketSize, migTicket, srcPubKeyDigest, msaListSize, msaList,
309
restrictTicketSize, restrictTicket, sigTicketSize, sigTicket,
310
tssKey.encSize, tssKey.encData, pAuth, &randomDataSize, &randomData,
311
&outDataSize, &outData)))
315
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
316
result |= Trspi_Hash_UINT32(&hashCtx, result);
317
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_CreateBlob);
318
result |= Trspi_Hash_UINT32(&hashCtx, randomDataSize);
319
result |= Trspi_HashUpdate(&hashCtx, randomDataSize, randomData);
320
result |= Trspi_Hash_UINT32(&hashCtx, outDataSize);
321
result |= Trspi_HashUpdate(&hashCtx, outDataSize, outData);
322
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
326
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, pAuth)))
329
/* Create the migdata key blob */
330
free(tssKey.encData);
331
tssKey.encSize = outDataSize;
332
tssKey.encData = outData;
333
/* Set outData to null since it will now be freed during key ref freeing */
337
LoadBlob_TSS_KEY(&offset, NULL, &tssKey);
339
newBlobSize = offset;
340
if ((newBlob = malloc(newBlobSize)) == NULL) {
341
LogError("malloc of %u bytes failed.", newBlobSize);
342
result = TSPERR(TSS_E_OUTOFMEMORY);
346
LoadBlob_TSS_KEY(&offset, newBlob, &tssKey);
348
if ((result = obj_migdata_set_blob(hMigrationData, newBlobSize, newBlob)))
351
if ((*prgbRandom = calloc_tspi(hContext, randomDataSize)) == NULL) {
352
LogError("malloc of %u bytes failed.", randomDataSize);
353
result = TSPERR(TSS_E_OUTOFMEMORY);
356
memcpy(*prgbRandom, randomData, randomDataSize);
357
*pulRandomLength = randomDataSize;
360
free_tspi(hContext, migTicket);
361
free_tspi(hContext, pubBlob);
362
free_tspi(hContext, msaList);
363
free_tspi(hContext, restrictTicket);
364
free_tspi(hContext, sigTicket);
365
free_tspi(hContext, blob);
369
free_key_refs(&tssKey);
375
Tspi_Key_CMKConvertMigration(TSS_HKEY hKeyToMigrate, /* in */
376
TSS_HKEY hParentKey, /* in */
377
TSS_HMIGDATA hMigrationData, /* in */
378
UINT32 ulRandomLength, /* in */
379
BYTE* rgbRandom) /* in */
381
TSS_HCONTEXT hContext;
384
TCS_KEY_HANDLE tcsKeyHandle;
385
TPM_CMK_AUTH restrictTicket;
389
UINT32 migDataSize, msaListSize;
390
BYTE *migData = NULL, *msaList = NULL;
392
BYTE *outData = NULL;
393
Trspi_HashCtx hashCtx;
395
TPM_AUTH parentAuth, *pAuth;
398
if ((result = obj_rsakey_get_tsp_context(hKeyToMigrate, &hContext)))
401
if ((result = obj_rsakey_get_policy(hParentKey, TSS_POLICY_USAGE, &hPolicy, &usageAuth)))
404
if ((result = obj_rsakey_get_tcs_handle(hParentKey, &tcsKeyHandle)))
407
if ((result = obj_migdata_get_cmk_auth(hMigrationData, &restrictTicket)))
410
if ((result = obj_migdata_get_sig_ticket(hMigrationData, &blobSize, &blob)))
412
memcpy(sigTicket.digest, blob, sizeof(sigTicket.digest));
413
free_tspi(hContext, blob);
415
if ((result = obj_migdata_get_blob(hMigrationData, &migDataSize, &migData)))
418
if ((result = obj_migdata_get_msa_list_blob(hMigrationData, &msaListSize, &msaList)))
424
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
425
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_ConvertMigration);
426
result |= Trspi_HashUpdate(&hashCtx, sizeof(restrictTicket),
427
(BYTE *)&restrictTicket);
428
result |= Trspi_Hash_HMAC(&hashCtx, sigTicket.digest);
429
result |= Trspi_HashUpdate(&hashCtx, migDataSize, migData);
430
result |= Trspi_Hash_UINT32(&hashCtx, msaListSize);
431
result |= Trspi_HashUpdate(&hashCtx, msaListSize, msaList);
432
result |= Trspi_Hash_UINT32(&hashCtx, ulRandomLength);
433
result |= Trspi_HashUpdate(&hashCtx, ulRandomLength, rgbRandom);
434
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
437
if ((result = secret_PerformAuth_OIAP(hParentKey, TPM_ORD_CMK_ConvertMigration,
438
hPolicy, FALSE, &digest, pAuth)))
443
if ((result = RPC_CMK_ConvertMigration(hContext, tcsKeyHandle, restrictTicket, sigTicket,
444
migDataSize, migData, msaListSize, msaList, ulRandomLength, rgbRandom,
445
pAuth, &outDataSize, &outData)))
449
result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
450
result |= Trspi_Hash_UINT32(&hashCtx, result);
451
result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_CMK_ConvertMigration);
452
result |= Trspi_Hash_UINT32(&hashCtx, outDataSize);
453
result |= Trspi_HashUpdate(&hashCtx, outDataSize, outData);
454
if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
458
if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, pAuth)))
461
/* Set the key object to the now migrated key */
462
if ((result = obj_rsakey_set_tcpakey(hKeyToMigrate, migDataSize, migData)))
464
if ((result = obj_rsakey_set_privkey(hKeyToMigrate, TRUE, outDataSize, outData)))
466
result = obj_rsakey_set_tcs_handle(hKeyToMigrate, 0);
469
free_tspi(hContext, migData);
470
free_tspi(hContext, msaList);