1 // This file was extracted from the TCG Published
2 // Trusted Platform Module Library
3 // Part 3: Commands
4 // Family "2.0"
5 // Level 00 Revision 01.16
6 // October 30, 2014
7 
8 #include "InternalRoutines.h"
9 #include "Attest_spt_fp.h"
10 #include "GetSessionAuditDigest_fp.h"
11 //
12 //
13 //     Error Returns                 Meaning
14 //
15 //     TPM_RC_KEY                    key referenced by signHandle is not a signing key
16 //     TPM_RC_SCHEME                 inScheme is incompatible with signHandle type; or both scheme and
17 //                                   key's default scheme are empty; or scheme is empty while key's
18 //                                   default scheme requires explicit input scheme (split signing); or non-
19 //                                   empty default key scheme differs from scheme
20 //     TPM_RC_TYPE                   sessionHandle does not reference an audit session
21 //     TPM_RC_VALUE                  digest generated for the given scheme is greater than the modulus of
22 //                                   signHandle (for an RSA key); invalid commit status or failed to
23 //                                   generate r value (for an ECC key)
24 //
25 TPM_RC
TPM2_GetSessionAuditDigest(GetSessionAuditDigest_In * in,GetSessionAuditDigest_Out * out)26 TPM2_GetSessionAuditDigest(
27    GetSessionAuditDigest_In      *in,                // IN: input parameter list
28    GetSessionAuditDigest_Out     *out                // OUT: output parameter list
29    )
30 {
31    TPM_RC                  result;
32    SESSION                *session;
33    TPMS_ATTEST             auditInfo;
34 
35 // Input Validation
36 
37    // SessionAuditDigest specific input validation
38    // Get session pointer
39    session = SessionGet(in->sessionHandle);
40 
41    // session must be an audit session
42    if(session->attributes.isAudit == CLEAR)
43        return TPM_RC_TYPE + RC_GetSessionAuditDigest_sessionHandle;
44 
45 // Command Output
46 
47    // Filling in attest information
48    // Common fields
49    result = FillInAttestInfo(in->signHandle,
50                              &in->inScheme,
51                              &in->qualifyingData,
52                              &auditInfo);
53    if(result != TPM_RC_SUCCESS)
54    {
55        if(result == TPM_RC_KEY)
56            return TPM_RC_KEY + RC_GetSessionAuditDigest_signHandle;
57        else
58            return RcSafeAddToResult(result, RC_GetSessionAuditDigest_inScheme);
59    }
60 
61    // SessionAuditDigest specific fields
62    // Attestation type
63    auditInfo.type = TPM_ST_ATTEST_SESSION_AUDIT;
64 
65    // Copy digest
66    auditInfo.attested.sessionAudit.sessionDigest = session->u2.auditDigest;
67 
68    // Exclusive audit session
69    if(g_exclusiveAuditSession == in->sessionHandle)
70        auditInfo.attested.sessionAudit.exclusiveSession = TRUE;
71    else
72        auditInfo.attested.sessionAudit.exclusiveSession = FALSE;
73 
74    // Sign attestation structure. A NULL signature will be returned if
75    // signHandle is TPM_RH_NULL. A TPM_RC_NV_UNAVAILABLE, TPM_RC_NV_RATE,
76    // TPM_RC_VALUE, TPM_RC_SCHEME or TPM_RC_ATTRIBUTES error may be returned at
77    // this point
78    result = SignAttestInfo(in->signHandle,
79                            &in->inScheme,
80                            &auditInfo,
81                            &in->qualifyingData,
82                            &out->auditInfo,
83                            &out->signature);
84    if(result != TPM_RC_SUCCESS)
85        return result;
86 
87    // orderly state should be cleared because of the reporting of clock info
88    // if signing happens
89    if(in->signHandle != TPM_RH_NULL)
90        g_clearOrderly = TRUE;
91 
92    return TPM_RC_SUCCESS;
93 }
94