You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.2 KiB
67 lines
2.2 KiB
// 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; |
|
}
|
|
|