1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
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 */
|