blob: ad94272359826f149f53388f2cb7806c9d05219d [file] [log] [blame]
/* Software-based Trusted Platform Module (TPM) Emulator
* Copyright (C) 2004-2010 Mario Strasser <mast@gmx.net>
*
* This module is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This module is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* $Id: tpm_handles.c 364 2010-02-11 10:24:45Z mast $
*/
#include "tpm_emulator.h"
#include "tpm_handles.h"
#include "tpm_data.h"
TPM_KEY_DATA *tpm_get_key_slot(TPM_KEY_HANDLE handle)
{
if (handle == TPM_INVALID_HANDLE) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_KEYS) return NULL;
return &tpmData.permanent.data.keys[handle];
}
TPM_SESSION_DATA *tpm_get_session_slot(TPM_HANDLE handle)
{
if (handle == TPM_INVALID_HANDLE) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_SESSIONS) return NULL;
return &tpmData.stany.data.sessions[handle];
}
TPM_DAA_SESSION_DATA *tpm_get_daa_slot(TPM_HANDLE handle)
{
if (handle == TPM_INVALID_HANDLE) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_SESSIONS_DAA) return NULL;
return &tpmData.stany.data.sessionsDAA[handle];
}
TPM_KEY_DATA *tpm_get_key(TPM_KEY_HANDLE handle)
{
/* handle reserved key handles */
switch (handle) {
case TPM_KH_EK:
case TPM_KH_OWNER:
case TPM_KH_REVOKE:
case TPM_KH_TRANSPORT:
case TPM_KH_OPERATOR:
case TPM_KH_ADMIN:
return NULL;
case TPM_KH_SRK:
debug("SRK valid? %d", tpmData.permanent.data.srk.payload);
return (tpmData.permanent.data.srk.payload) ?
&tpmData.permanent.data.srk : NULL;
}
if (handle == TPM_INVALID_HANDLE
|| (handle >> 24) != TPM_RT_KEY) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_KEYS
|| !tpmData.permanent.data.keys[handle].payload) return NULL;
return &tpmData.permanent.data.keys[handle];
}
TPM_SESSION_DATA *tpm_get_auth(TPM_AUTHHANDLE handle)
{
if (handle == TPM_INVALID_HANDLE
|| (handle >> 24) != TPM_RT_AUTH) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_SESSIONS
|| (tpmData.stany.data.sessions[handle].type != TPM_ST_OIAP
&& tpmData.stany.data.sessions[handle].type != TPM_ST_OSAP
&& tpmData.stany.data.sessions[handle].type != TPM_ST_DSAP)) return NULL;
return &tpmData.stany.data.sessions[handle];
}
TPM_SESSION_DATA *tpm_get_transport(TPM_TRANSHANDLE handle)
{
if (handle == TPM_INVALID_HANDLE
|| (handle >> 24) != TPM_RT_TRANS) return NULL;
handle &= 0x00ffffff;
if (handle >= TPM_MAX_SESSIONS
|| tpmData.stany.data.sessions[handle].type != TPM_ST_TRANSPORT) return NULL;
return &tpmData.stany.data.sessions[handle];
}
TPM_COUNTER_VALUE *tpm_get_counter(TPM_COUNT_ID handle)
{
if ((handle == TPM_INVALID_HANDLE) || ((handle >> 24) != TPM_RT_COUNTER))
return NULL;
handle &= 0x00ffffff;
if ((handle >= TPM_MAX_COUNTERS)
|| !tpmData.permanent.data.counters[handle].valid) return NULL;
return &tpmData.permanent.data.counters[handle];
}
TPM_DAA_SESSION_DATA *tpm_get_daa(TPM_DAAHANDLE handle)
{
if ((handle == TPM_INVALID_HANDLE) || ((handle >> 24) != TPM_RT_DAA_TPM))
return NULL;
handle &= 0x00ffffff;
if ((handle >= TPM_MAX_SESSIONS_DAA)
|| (tpmData.stany.data.sessionsDAA[handle].type != TPM_ST_DAA)) return NULL;
return &tpmData.stany.data.sessionsDAA[handle];
}