/*
 * Copyright 2015 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef __TPM2_SESSION_FP_H
#define __TPM2_SESSION_FP_H

UINT32 SessionCapGetActiveAvail(
        void
        );
UINT32 SessionCapGetActiveNumber(
        void
        );
TPMI_YES_NO SessionCapGetLoaded(
        TPMI_SH_POLICY      handle,             // IN: start handle
        UINT32              count,              // IN: count of returned handle
        TPML_HANDLE        *handleList          // OUT: list of handle
);
UINT32 SessionCapGetLoadedAvail(
        void
        );
UINT32 SessionCapGetLoadedNumber(
        void
        );
TPMI_YES_NO SessionCapGetSaved(
        TPMI_SH_HMAC        handle,             // IN: start handle
        UINT32              count,              // IN: count of returned handle
        TPML_HANDLE        *handleList          // OUT: list of handle
);
void SessionComputeBoundEntity(
        TPMI_DH_ENTITY      entityHandle,     // IN: handle of entity
        TPM2B_NAME         *bind              // OUT: binding value
        );
TPM_RC SessionContextLoad(
        SESSION            *session,            // IN: session structure from saved context
        TPM_HANDLE         *handle              // IN/OUT: session handle
                          );
TPM_RC SessionContextSave (
        TPM_HANDLE                 handle,           // IN: session handle
        CONTEXT_COUNTER           *contextID         // OUT: assigned contextID
                           );
TPM_RC SessionCreate(
        TPM_SE               sessionType,        //   IN: the session type
        TPMI_ALG_HASH        authHash,           //   IN: the hash algorithm
        TPM2B_NONCE         *nonceCaller,        //   IN: initial nonceCaller
        TPMT_SYM_DEF        *symmetric,          //   IN: the symmetric algorithm
        TPMI_DH_ENTITY       bind,               //   IN: the bind object
        TPM2B_DATA          *seed,               //   IN: seed data
        TPM_HANDLE          *sessionHandle       //   OUT: the session handle
        );
void SessionFlush(
        TPM_HANDLE           handle             // IN: loaded or saved session handle
);
SESSION *SessionGet(
        TPM_HANDLE           handle              // IN: session handle
);
void SessionInitPolicyData(
        SESSION            *session           // IN: session handle
        );
BOOL SessionIsLoaded(
        TPM_HANDLE             handle                // IN: session handle
                     );
BOOL SessionIsSaved(
        TPM_HANDLE            handle                // IN: session handle
                    );
BOOL SessionPCRValueIsCurrent(
        TPMI_SH_POLICY        handle                // IN: session handle
        );
void SessionResetPolicyData(
        SESSION            *session             // IN: the session to reset
        );
void SessionStartup(
        STARTUP_TYPE         type
        );

#endif // __TPM2_SESSION_FP_H
