Topic: MakeCredential/ActivateCredential Using EK
Hello,
I am working with wolfTPM to perform remote attestation. I ran the "Remote Attestation Examples" provided and it worked. But in my use case I'm working with the EK instead the SRK (wich is the key used in the examples). I had succes using makeCredential with EK Handle, but no success solving the challenge using activateCredential and EK Handle. The response code returned is TPM_RC_AUTH_UNAVAILABLE, more specifically this is the message returned:
TPM2_ActivateCredentials failed 0x12f: TPM_RC_AUTH_UNAVAILABLE: The authValue or authPolicy is not available for selected entity
Here is a code snippet just to make it more clear. I tried to modify the code to guarantee the authorization for EK Handle, but no success. Do you have any idea how to solve this problem?
/* Activate Credential command */
XMEMSET(&cmdIn.policyCommandCode, 0, sizeof(cmdIn.policyCommandCode));
cmdIn.policyCommandCode.policySession = tpmSession.handle.hndl;
cmdIn.policyCommandCode.code = TPM_CC_ActivateCredential;
rc = TPM2_PolicyCommandCode(&cmdIn.policyCommandCode);
if (rc != TPM_RC_SUCCESS) {
printf("policyCommandCode failed 0x%x: %s\n", rc, TPM2_GetRCString(rc));
goto exit;
}
printf("TPM2_policyCommandCode success\n"); /* No command response payload */
/* Prepare Key Auths in correct order for ActivateCredential */
wolfTPM2_SetAuthHandle(&dev, 0, &akKey.handle);
//wolfTPM2_SetAuthHandle(&dev, 1, &storage.handle);
wolfTPM2_SetAuthHandle(&dev, 1, &endorse.handle);
/* Prepare the Activate Credential command */
XMEMSET(&cmdIn.activCred, 0, sizeof(cmdIn.activCred));
XMEMSET(&cmdOut.activCred, 0, sizeof(cmdOut.activCred));
cmdIn.activCred.activateHandle = akKey.handle.hndl;
cmdIn.activCred.keyHandle = endorse.handle.hndl;
/* Read credential from server response */
decodeChallengeFromServerUsingEK(&cmdIn.activCred);
printf("Read credential and secret from Server response\n");
/* All required data to verify the credential is prepared */
rc = TPM2_ActivateCredential(&cmdIn.activCred, &cmdOut.activCred);
if (rc != TPM_RC_SUCCESS) {
printf("TPM2_ActivateCredentials failed 0x%x: %s\n", rc,
TPM2_GetRCString(rc));
goto exit;
}
printf("TPM2_ActivateCredential success\n");
TPM2_PrintBin(cmdOut.activCred.certInfo.buffer, cmdOut.activCred.certInfo.size);
Thanks in advance,
Messias Filho