diff options
Diffstat (limited to 'include/iprt/formats/tpm.h')
-rw-r--r-- | include/iprt/formats/tpm.h | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/include/iprt/formats/tpm.h b/include/iprt/formats/tpm.h new file mode 100644 index 00000000..454a2d4f --- /dev/null +++ b/include/iprt/formats/tpm.h @@ -0,0 +1,313 @@ +/* $Id: tpm.h $ */ +/** @file + * IPRT, TPM common definitions (this is actually a protocol and not a format). + */ + +/* + * Copyright (C) 2021-2022 Oracle and/or its affiliates. + * + * This file is part of VirtualBox base platform packages, as + * available from https://www.virtualbox.org. + * + * This program 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, in version 3 of the + * License. + * + * This program 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses>. + * + * The contents of this file may alternatively be used under the terms + * of the Common Development and Distribution License Version 1.0 + * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included + * in the VirtualBox distribution, in which case the provisions of the + * CDDL are applicable instead of those of the GPL. + * + * You may elect to license modified versions of this file under the + * terms and conditions of either the GPL or the CDDL or both. + * + * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0 + */ + +#ifndef IPRT_INCLUDED_formats_tpm_h +#define IPRT_INCLUDED_formats_tpm_h +#ifndef RT_WITHOUT_PRAGMA_ONCE +# pragma once +#endif + +#include <iprt/asm.h> +#include <iprt/cdefs.h> +#include <iprt/types.h> +#include <iprt/assertcompile.h> +#include <iprt/string.h> + + +/** + * TPM request header (everything big endian). + */ +#pragma pack(1) +typedef struct TPMREQHDR +{ + /** The tag for this request. */ + uint16_t u16Tag; + /** Size of the request in bytes. */ + uint32_t cbReq; + /** The request ordinal to execute. */ + uint32_t u32Ordinal; +} TPMREQHDR; +#pragma pack() +AssertCompileSize(TPMREQHDR, 2 + 4 + 4); +/** Pointer to a TPM request header. */ +typedef TPMREQHDR *PTPMREQHDR; +/** Pointer to a const TPM request header. */ +typedef const TPMREQHDR *PCTPMREQHDR; + + +/** @name TPM 1.2 request tags + * @{ */ +/** Command with no authentication. */ +#define TPM_TAG_RQU_COMMAND UINT16_C(0x00c1) +/** An authenticated command with one authentication handle. */ +#define TPM_TAG_RQU_AUTH1_COMMAND UINT16_C(0x00c2) +/** An authenticated command with two authentication handles. */ +#define TPM_TAG_RQU_AUTH2_COMMAND UINT16_C(0x00c3) +/** @} */ + + +/** @name TPM 2.0 request/response tags + * @{ */ +/** Command with no associated session. */ +#define TPM2_ST_NO_SESSIONS UINT16_C(0x8001) +/** Command with an associated session. */ +#define TPM2_ST_SESSIONS UINT16_C(0x8002) +/** @} */ + + +/** @name TPM 1.2 request ordinals. + * @{ */ +/** Perform a full self test. */ +#define TPM_ORD_SELFTESTFULL UINT32_C(80) +/** Continue the selftest. */ +#define TPM_ORD_CONTINUESELFTEST UINT32_C(83) +/** Return the test result. */ +#define TPM_ORD_GETTESTRESULT UINT32_C(84) +/** Get a capability. */ +#define TPM_ORD_GETCAPABILITY UINT32_C(101) +/** @} */ + + +/** @name TPM 2.0 command codes. + * @{ */ +/** Get a capability. */ +#define TPM2_CC_GET_CAPABILITY UINT32_C(378) +/** @} */ + + +/** @name Defines related to TPM_ORD_GETCAPABILITY. + * @{ */ +/** Return a TPM related property. */ +#define TPM_CAP_PROPERTY UINT32_C(5) + +/** Returns the size of the input buffer. */ +#define TPM_CAP_PROP_INPUT_BUFFER UINT32_C(0x124) + +/** + * TPM_ORD_GETCAPABILITY request. + */ +#pragma pack(1) +typedef struct TPMREQGETCAPABILITY +{ + /** Request header. */ + TPMREQHDR Hdr; + /** The capability group to query. */ + uint32_t u32Cap; + /** Length of the capability. */ + uint32_t u32Length; + /** The sub capability to query. */ + uint32_t u32SubCap; +} TPMREQGETCAPABILITY; +#pragma pack() +/** Pointer to a TPM_ORD_GETCAPABILITY request. */ +typedef TPMREQGETCAPABILITY *PTPMREQGETCAPABILITY; +/** Pointer to a const TPM_ORD_GETCAPABILITY request. */ +typedef const TPMREQGETCAPABILITY *PCTPMREQGETCAPABILITY; +/** @} */ + + +/** @name Defines related to TPM2_CC_GET_CAPABILITY. + * @{ */ +/** Return a TPM related property. */ +#define TPM2_CAP_TPM_PROPERTIES UINT32_C(6) + +/** Returns the size of the input buffer. */ +#define TPM2_PT_INPUT_BUFFER UINT32_C(0x10d) + +/** + * TPM2_CC_GET_CAPABILITY request. + */ +#pragma pack(1) +typedef struct TPM2REQGETCAPABILITY +{ + /** Request header. */ + TPMREQHDR Hdr; + /** The capability group to query. */ + uint32_t u32Cap; + /** Property to query. */ + uint32_t u32Property; + /** Number of values to return. */ + uint32_t u32Count; +} TPM2REQGETCAPABILITY; +#pragma pack() +/** Pointer to a TPM2_CC_GET_CAPABILITY request. */ +typedef TPM2REQGETCAPABILITY *PTPM2REQGETCAPABILITY; +/** Pointer to a const TPM2_CC_GET_CAPABILITY request. */ +typedef const TPM2REQGETCAPABILITY *PCTPM2REQGETCAPABILITY; +/** @} */ + + +/** + * TPM response header (everything big endian). + */ +#pragma pack(1) +typedef struct TPMRESPHDR +{ + /** The tag for this request. */ + uint16_t u16Tag; + /** Size of the response in bytes. */ + uint32_t cbResp; + /** The error code for the response. */ + uint32_t u32ErrCode; +} TPMRESPHDR; +#pragma pack() +AssertCompileSize(TPMRESPHDR, 2 + 4 + 4); +/** Pointer to a TPM response header. */ +typedef TPMRESPHDR *PTPMRESPHDR; +/** Pointer to a const TPM response header. */ +typedef const TPMRESPHDR *PCTPMRESPHDR; + + +/** @name TPM 1.2 response tags + * @{ */ +/** A response from a command with no authentication. */ +#define TPM_TAG_RSP_COMMAND UINT16_C(0x00c4) +/** An authenticated response with one authentication handle. */ +#define TPM_TAG_RSP_AUTH1_COMMAND UINT16_C(0x00c5) +/** An authenticated response with two authentication handles. */ +#define TPM_TAG_RSP_AUTH2_COMMAND UINT16_C(0x00c6) +/** @} */ + + +/** @name TPM status codes. + * @{ */ +#ifndef TPM_SUCCESS +/** Request executed successfully. */ +# define TPM_SUCCESS UINT32_C(0) +#endif +#ifndef TPM_AUTHFAIL +/** Authentication failed. */ +# define TPM_AUTHFAIL UINT32_C(1) +#endif +#ifndef TPM_BADINDEX +/** An index is malformed. */ +# define TPM_BADINDEX UINT32_C(2) +#endif +#ifndef TPM_BAD_PARAMETER +/** A request parameter is invalid. */ +# define TPM_BAD_PARAMETER UINT32_C(3) +#endif +#ifndef TPM_FAIL +/** The TPM failed to execute the request. */ +# define TPM_FAIL UINT32_C(9) +#endif +/** @todo Extend as need arises. */ +/** @} */ + + +/* Some inline helpers to account for the unaligned members of the request and response headers. */ + +/** + * Returns the request tag of the given TPM request header. + * + * @returns TPM request tag in bytes. + * @param pTpmReqHdr Pointer to the TPM request header. + */ +DECLINLINE(uint16_t) RTTpmReqGetTag(PCTPMREQHDR pTpmReqHdr) +{ + return RT_BE2H_U16(pTpmReqHdr->u16Tag); +} + + +/** + * Returns the request size of the given TPM request header. + * + * @returns TPM request size in bytes. + * @param pTpmReqHdr Pointer to the TPM request header. + */ +DECLINLINE(size_t) RTTpmReqGetSz(PCTPMREQHDR pTpmReqHdr) +{ + uint32_t cbReq; + memcpy(&cbReq, &pTpmReqHdr->cbReq, sizeof(pTpmReqHdr->cbReq)); + return RT_BE2H_U32(cbReq); +} + + +/** + * Returns the request ordinal of the given TPM request header. + * + * @returns TPM request ordinal in bytes. + * @param pTpmReqHdr Pointer to the TPM request header. + */ +DECLINLINE(uint32_t) RTTpmReqGetOrdinal(PCTPMREQHDR pTpmReqHdr) +{ + uint32_t u32Ordinal; + memcpy(&u32Ordinal, &pTpmReqHdr->u32Ordinal, sizeof(pTpmReqHdr->u32Ordinal)); + return RT_BE2H_U32(u32Ordinal); +} + + +/** + * Returns the response tag of the given TPM response header. + * + * @returns TPM request tag in bytes. + * @param pTpmRespHdr Pointer to the TPM response header. + */ +DECLINLINE(uint16_t) RTTpmRespGetTag(PCTPMRESPHDR pTpmRespHdr) +{ + return RT_BE2H_U16(pTpmRespHdr->u16Tag); +} + + +/** + * Returns the response size included in the given TPM response header. + * + * @returns TPM response size in bytes. + * @param pTpmRespHdr Pointer to the TPM response header. + */ +DECLINLINE(size_t) RTTpmRespGetSz(PCTPMRESPHDR pTpmRespHdr) +{ + uint32_t cbResp; + memcpy(&cbResp, &pTpmRespHdr->cbResp, sizeof(pTpmRespHdr->cbResp)); + return RT_BE2H_U32(cbResp); +} + + +/** + * Returns the error code of the given TPM response header. + * + * @returns TPM response error code. + * @param pTpmRespHdr Pointer to the TPM response header. + */ +DECLINLINE(uint32_t) RTTpmRespGetErrCode(PCTPMRESPHDR pTpmRespHdr) +{ + uint32_t u32ErrCode; + memcpy(&u32ErrCode, &pTpmRespHdr->u32ErrCode, sizeof(pTpmRespHdr->u32ErrCode)); + return RT_BE2H_U32(u32ErrCode); +} + +#endif /* !IPRT_INCLUDED_formats_tpm_h */ + |