Home | History | Annotate | Line # | Download | only in tspi
      1 
      2 /*
      3  * Licensed Materials - Property of IBM
      4  *
      5  * trousers - An open source TCG Software Stack
      6  *
      7  * (C) Copyright International Business Machines Corp. 2004-2007
      8  *
      9  */
     10 
     11 #include <stdlib.h>
     12 #include <stdio.h>
     13 #include <string.h>
     14 #include <inttypes.h>
     15 
     16 #include "trousers/tss.h"
     17 #include "trousers/trousers.h"
     18 #include "trousers_types.h"
     19 #include "spi_utils.h"
     20 #include "capabilities.h"
     21 #include "tsplog.h"
     22 #include "obj.h"
     23 
     24 
     25 TSS_RESULT
     26 owner_get_pubek(TSS_HCONTEXT tspContext, TSS_HTPM hTPM, TSS_HKEY *hPubEk)
     27 {
     28 	TSS_RESULT result;
     29 	UINT32 tpmVersion, pubEKSize;
     30 	TSS_HPOLICY hPolicy;
     31 	Trspi_HashCtx hashCtx;
     32 	BYTE *pubEK = NULL;
     33 	TSS_HKEY hRetKey;
     34 	TPM_AUTH ownerAuth;
     35 	TPM_DIGEST digest;
     36 
     37 
     38 	if ((result = obj_context_get_tpm_version(tspContext, &tpmVersion)))
     39 		return result;
     40 
     41 	if ((result = obj_tpm_get_policy(hTPM, TSS_POLICY_USAGE, &hPolicy)))
     42 		return result;
     43 
     44 	switch (tpmVersion) {
     45 	case 2:
     46 		result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
     47 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_OwnerReadInternalPub);
     48 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_KH_EK);
     49 		if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
     50 			goto done;
     51 
     52 		if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_OwnerReadInternalPub,
     53 						      hPolicy, FALSE, &digest, &ownerAuth)))
     54 			goto done;
     55 
     56 		if ((result = TCS_API(tspContext)->OwnerReadInternalPub(tspContext, TPM_KH_EK,
     57 									&ownerAuth, &pubEKSize,
     58 									&pubEK)))
     59 			goto done;
     60 
     61 		result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
     62 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_SUCCESS);
     63 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_OwnerReadInternalPub);
     64 		result |= Trspi_HashUpdate(&hashCtx, pubEKSize, pubEK);
     65 		if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
     66 			goto done;
     67 
     68 		if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
     69 			goto done;
     70 		break;
     71 	default:
     72 		result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
     73 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_OwnerReadPubek);
     74 		if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
     75 			goto done;
     76 
     77 		if ((result = secret_PerformAuth_OIAP(hTPM, TPM_ORD_OwnerReadPubek, hPolicy, FALSE,
     78 						      &digest, &ownerAuth)))
     79 			goto done;
     80 
     81 		if ((result = TCS_API(tspContext)->OwnerReadPubek(tspContext, &ownerAuth,
     82 								  &pubEKSize, &pubEK)))
     83 			goto done;
     84 
     85 		result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
     86 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_SUCCESS);
     87 		result |= Trspi_Hash_UINT32(&hashCtx, TPM_ORD_OwnerReadPubek);
     88 		result |= Trspi_HashUpdate(&hashCtx, pubEKSize, pubEK);
     89 		if ((result |= Trspi_HashFinal(&hashCtx, digest.digest)))
     90 			goto done;
     91 
     92 		if ((result = obj_policy_validate_auth_oiap(hPolicy, &digest, &ownerAuth)))
     93 			goto done;
     94 
     95 		break;
     96 	}
     97 
     98 	if ((result = obj_rsakey_add(tspContext, TSS_KEY_SIZE_2048|TSS_KEY_TYPE_LEGACY, &hRetKey)))
     99 		goto done;
    100 
    101 	if ((result = obj_rsakey_set_pubkey(hRetKey, TRUE, pubEK)))
    102 		goto done;
    103 
    104 	*hPubEk = hRetKey;
    105 done:
    106 	free(pubEK);
    107 	return result;
    108 }
    109