| // This file was extracted from the TCG Published |
| // Trusted Platform Module Library |
| // Part 3: Commands |
| // Family "2.0" |
| // Level 00 Revision 01.16 |
| // October 30, 2014 |
| |
| #include "InternalRoutines.h" |
| #include "VerifySignature_fp.h" |
| // |
| // |
| // Error Returns Meaning |
| // |
| // TPM_RC_ATTRIBUTES keyHandle does not reference a signing key |
| // TPM_RC_SIGNATURE signature is not genuine |
| // TPM_RC_SCHEME CryptVerifySignature() |
| // TPM_RC_HANDLE the input handle is references an HMAC key but the private portion is |
| // not loaded |
| // |
| TPM_RC |
| TPM2_VerifySignature( |
| VerifySignature_In *in, // IN: input parameter list |
| VerifySignature_Out *out // OUT: output parameter list |
| ) |
| { |
| TPM_RC result; |
| TPM2B_NAME name; |
| OBJECT *signObject; |
| TPMI_RH_HIERARCHY hierarchy; |
| |
| // Input Validation |
| |
| // Get sign object pointer |
| signObject = ObjectGet(in->keyHandle); |
| |
| // The object to validate the signature must be a signing key. |
| if(signObject->publicArea.objectAttributes.sign != SET) |
| return TPM_RC_ATTRIBUTES + RC_VerifySignature_keyHandle; |
| |
| // Validate Signature. TPM_RC_SCHEME, TPM_RC_HANDLE or TPM_RC_SIGNATURE |
| // error may be returned by CryptCVerifySignatrue() |
| result = CryptVerifySignature(in->keyHandle, &in->digest, &in->signature); |
| if(result != TPM_RC_SUCCESS) |
| return RcSafeAddToResult(result, RC_VerifySignature_signature); |
| |
| // Command Output |
| |
| hierarchy = ObjectGetHierarchy(in->keyHandle); |
| if( hierarchy == TPM_RH_NULL |
| || signObject->publicArea.nameAlg == TPM_ALG_NULL) |
| { |
| // produce empty ticket if hierarchy is TPM_RH_NULL or nameAlg is |
| // TPM_ALG_NULL |
| out->validation.tag = TPM_ST_VERIFIED; |
| out->validation.hierarchy = TPM_RH_NULL; |
| out->validation.digest.t.size = 0; |
| } |
| else |
| { |
| // Get object name that verifies the signature |
| name.t.size = ObjectGetName(in->keyHandle, &name.t.name); |
| // Compute ticket |
| TicketComputeVerified(hierarchy, &in->digest, &name, &out->validation); |
| } |
| |
| return TPM_RC_SUCCESS; |
| } |