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.
93 lines
3.4 KiB
93 lines
3.4 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 "Attest_spt_fp.h" |
|
#include "GetSessionAuditDigest_fp.h" |
|
// |
|
// |
|
// Error Returns Meaning |
|
// |
|
// TPM_RC_KEY key referenced by signHandle is not a signing key |
|
// TPM_RC_SCHEME inScheme is incompatible with signHandle type; or both scheme and |
|
// key's default scheme are empty; or scheme is empty while key's |
|
// default scheme requires explicit input scheme (split signing); or non- |
|
// empty default key scheme differs from scheme |
|
// TPM_RC_TYPE sessionHandle does not reference an audit session |
|
// TPM_RC_VALUE digest generated for the given scheme is greater than the modulus of |
|
// signHandle (for an RSA key); invalid commit status or failed to |
|
// generate r value (for an ECC key) |
|
// |
|
TPM_RC |
|
TPM2_GetSessionAuditDigest( |
|
GetSessionAuditDigest_In *in, // IN: input parameter list |
|
GetSessionAuditDigest_Out *out // OUT: output parameter list |
|
) |
|
{ |
|
TPM_RC result; |
|
SESSION *session; |
|
TPMS_ATTEST auditInfo; |
|
|
|
// Input Validation |
|
|
|
// SessionAuditDigest specific input validation |
|
// Get session pointer |
|
session = SessionGet(in->sessionHandle); |
|
|
|
// session must be an audit session |
|
if(session->attributes.isAudit == CLEAR) |
|
return TPM_RC_TYPE + RC_GetSessionAuditDigest_sessionHandle; |
|
|
|
// Command Output |
|
|
|
// Filling in attest information |
|
// Common fields |
|
result = FillInAttestInfo(in->signHandle, |
|
&in->inScheme, |
|
&in->qualifyingData, |
|
&auditInfo); |
|
if(result != TPM_RC_SUCCESS) |
|
{ |
|
if(result == TPM_RC_KEY) |
|
return TPM_RC_KEY + RC_GetSessionAuditDigest_signHandle; |
|
else |
|
return RcSafeAddToResult(result, RC_GetSessionAuditDigest_inScheme); |
|
} |
|
|
|
// SessionAuditDigest specific fields |
|
// Attestation type |
|
auditInfo.type = TPM_ST_ATTEST_SESSION_AUDIT; |
|
|
|
// Copy digest |
|
auditInfo.attested.sessionAudit.sessionDigest = session->u2.auditDigest; |
|
|
|
// Exclusive audit session |
|
if(g_exclusiveAuditSession == in->sessionHandle) |
|
auditInfo.attested.sessionAudit.exclusiveSession = TRUE; |
|
else |
|
auditInfo.attested.sessionAudit.exclusiveSession = FALSE; |
|
|
|
// Sign attestation structure. A NULL signature will be returned if |
|
// signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE, |
|
// TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at |
|
// this point |
|
result = SignAttestInfo(in->signHandle, |
|
&in->inScheme, |
|
&auditInfo, |
|
&in->qualifyingData, |
|
&out->auditInfo, |
|
&out->signature); |
|
if(result != TPM_RC_SUCCESS) |
|
return result; |
|
|
|
// orderly state should be cleared because of the reporting of clock info |
|
// if signing happens |
|
if(in->signHandle != TPM_RH_NULL) |
|
g_clearOrderly = TRUE; |
|
|
|
return TPM_RC_SUCCESS; |
|
}
|
|
|