1 /*
2 * Copyright (c) 2010-2012 United States Government, as represented by
3 * the Secretary of Defense. All rights reserved.
4 *
5 * based off of the original tools/vtpm_manager code base which is:
6 * Copyright (c) 2005, Intel Corp.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
19 * * Neither the name of Intel Corporation nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34 * OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36
37 #ifndef MARSHAL_H
38 #define MARSHAL_H
39
40 #include <stdlib.h>
41 #include <mini-os/byteorder.h>
42 #include <mini-os/endian.h>
43 #include "tcg.h"
44
45 typedef enum UnpackPtr {
46 UNPACK_ALIAS,
47 UNPACK_ALLOC
48 } UnpackPtr;
49
50 static
pack_BYTE(BYTE * ptr,BYTE t)51 inline BYTE* pack_BYTE(BYTE* ptr, BYTE t) {
52 ptr[0] = t;
53 return ++ptr;
54 }
55
56 static
unpack_BYTE(BYTE * ptr,BYTE * t)57 inline BYTE* unpack_BYTE(BYTE* ptr, BYTE* t) {
58 t[0] = ptr[0];
59 return ++ptr;
60 }
61
62 static
unpack3_BYTE(BYTE * ptr,UINT32 * pos,UINT32 max,BYTE * t)63 inline int unpack3_BYTE(BYTE* ptr, UINT32* pos, UINT32 max, BYTE *t)
64 {
65 if (*pos + 1 > max)
66 return TPM_SIZE;
67 unpack_BYTE(ptr + *pos, t);
68 *pos += 1;
69 return 0;
70 }
71
72
73 #define pack_BOOL(p, t) pack_BYTE(p, t)
74 #define unpack_BOOL(p, t) unpack_BYTE(p, t)
75 #define unpack3_BOOL(p, x, m, t) unpack3_BYTE(p, x, m, t)
76 #define sizeof_BOOL(t) 1
77
78 static
pack_UINT16(void * ptr,UINT16 t)79 inline BYTE* pack_UINT16(void* ptr, UINT16 t) {
80 UINT16* p = ptr;
81 *p = cpu_to_be16(t);
82 return ptr + sizeof(UINT16);
83 }
84
85 static
unpack_UINT16(void * ptr,UINT16 * t)86 inline BYTE* unpack_UINT16(void* ptr, UINT16* t) {
87 UINT16* p = ptr;
88 *t = be16_to_cpu(*p);
89 return ptr + sizeof(UINT16);
90 }
91
92 static
unpack3_UINT16(BYTE * ptr,UINT32 * pos,UINT32 max,UINT16 * t)93 inline int unpack3_UINT16(BYTE* ptr, UINT32* pos, UINT32 max, UINT16 *t)
94 {
95 if (*pos + 2 > max)
96 return TPM_SIZE;
97 unpack_UINT16(ptr + *pos, t);
98 *pos += 2;
99 return 0;
100 }
101
102 static
pack_UINT32(void * ptr,UINT32 t)103 inline BYTE* pack_UINT32(void* ptr, UINT32 t) {
104 UINT32* p = ptr;
105 *p = cpu_to_be32(t);
106 return ptr + sizeof(UINT32);
107 }
108
109 static
unpack_UINT32(void * ptr,UINT32 * t)110 inline BYTE* unpack_UINT32(void* ptr, UINT32* t) {
111 UINT32* p = ptr;
112 *t = be32_to_cpu(*p);
113 return ptr + sizeof(UINT32);
114 }
115
116 static
unpack3_UINT32(BYTE * ptr,UINT32 * pos,UINT32 max,UINT32 * t)117 inline int unpack3_UINT32(BYTE* ptr, UINT32* pos, UINT32 max, UINT32 *t)
118 {
119 if (*pos + 4 > max)
120 return TPM_SIZE;
121 unpack_UINT32(ptr + *pos, t);
122 *pos += 4;
123 return 0;
124 }
125
126 #define sizeof_BYTE(x) 1
127 #define sizeof_UINT16(x) 2
128 #define sizeof_UINT32(x) 4
129
130 #define pack_TPM_RESULT(p, t) pack_UINT32(p, t)
131 #define pack_TPM_PCRINDEX(p, t) pack_UINT32(p, t)
132 #define pack_TPM_DIRINDEX(p, t) pack_UINT32(p, t)
133 #define pack_TPM_HANDLE(p, t) pack_UINT32(p, t)
134 #define pack_TPM_AUTHHANDLE(p, t) pack_TPM_HANDLE(p, t)
135 #define pack_TCPA_HASHHANDLE(p, t) pack_TPM_HANDLE(p, t)
136 #define pack_TCPA_HMACHANDLE(p, t) pack_TPM_HANDLE(p, t)
137 #define pack_TCPA_ENCHANDLE(p, t) pack_TPM_HANDLE(p, t)
138 #define pack_TPM_KEY_HANDLE(p, t) pack_TPM_HANDLE(p, t)
139 #define pack_TCPA_ENTITYHANDLE(p, t) pack_TPM_HANDLE(p, t)
140 #define pack_TPM_RESOURCE_TYPE(p, t) pack_UINT32(p, t)
141 #define pack_TPM_COMMAND_CODE(p, t) pack_UINT32(p, t)
142 #define pack_TPM_PROTOCOL_ID(p, t) pack_UINT16(p, t)
143 #define pack_TPM_AUTH_DATA_USAGE(p, t) pack_BYTE(p, t)
144 #define pack_TPM_ENTITY_TYPE(p, t) pack_UINT16(p, t)
145 #define pack_TPM_ALGORITHM_ID(p, t) pack_UINT32(p, t)
146 #define pack_TPM_KEY_USAGE(p, t) pack_UINT16(p, t)
147 #define pack_TPM_STARTUP_TYPE(p, t) pack_UINT16(p, t)
148 #define pack_TPM_CAPABILITY_AREA(p, t) pack_UINT32(p, t)
149 #define pack_TPM_ENC_SCHEME(p, t) pack_UINT16(p, t)
150 #define pack_TPM_SIG_SCHEME(p, t) pack_UINT16(p, t)
151 #define pack_TPM_MIGRATE_SCHEME(p, t) pack_UINT16(p, t)
152 #define pack_TPM_PHYSICAL_PRESENCE(p, t) pack_UINT16(p, t)
153 #define pack_TPM_KEY_FLAGS(p, t) pack_UINT32(p, t)
154 #define pack_TPM_LOCALITY_SELECTION(p, t) pack_BYTE(p, t)
155
156 #define unpack_TPM_RESULT(p, t) unpack_UINT32(p, t)
157 #define unpack_TPM_PCRINDEX(p, t) unpack_UINT32(p, t)
158 #define unpack_TPM_DIRINDEX(p, t) unpack_UINT32(p, t)
159 #define unpack_TPM_HANDLE(p, t) unpack_UINT32(p, t)
160 #define unpack_TPM_AUTHHANDLE(p, t) unpack_TPM_HANDLE(p, t)
161 #define unpack_TCPA_HASHHANDLE(p, t) unpack_TPM_HANDLE(p, t)
162 #define unpack_TCPA_HMACHANDLE(p, t) unpack_TPM_HANDLE(p, t)
163 #define unpack_TCPA_ENCHANDLE(p, t) unpack_TPM_HANDLE(p, t)
164 #define unpack_TPM_KEY_HANDLE(p, t) unpack_TPM_HANDLE(p, t)
165 #define unpack_TCPA_ENTITYHANDLE(p, t) unpack_TPM_HANDLE(p, t)
166 #define unpack_TPM_RESOURCE_TYPE(p, t) unpack_UINT32(p, t)
167 #define unpack_TPM_COMMAND_CODE(p, t) unpack_UINT32(p, t)
168 #define unpack_TPM_PROTOCOL_ID(p, t) unpack_UINT16(p, t)
169 #define unpack_TPM_AUTH_DATA_USAGE(p, t) unpack_BYTE(p, t)
170 #define unpack_TPM_ENTITY_TYPE(p, t) unpack_UINT16(p, t)
171 #define unpack_TPM_ALGORITHM_ID(p, t) unpack_UINT32(p, t)
172 #define unpack_TPM_KEY_USAGE(p, t) unpack_UINT16(p, t)
173 #define unpack_TPM_STARTUP_TYPE(p, t) unpack_UINT16(p, t)
174 #define unpack_TPM_CAPABILITY_AREA(p, t) unpack_UINT32(p, t)
175 #define unpack_TPM_ENC_SCHEME(p, t) unpack_UINT16(p, t)
176 #define unpack_TPM_SIG_SCHEME(p, t) unpack_UINT16(p, t)
177 #define unpack_TPM_MIGRATE_SCHEME(p, t) unpack_UINT16(p, t)
178 #define unpack_TPM_PHYSICAL_PRESENCE(p, t) unpack_UINT16(p, t)
179 #define unpack_TPM_KEY_FLAGS(p, t) unpack_UINT32(p, t)
180 #define unpack_TPM_LOCALITY_SELECTION(p, t) unpack_BYTE(p, t)
181
182 #define unpack3_TPM_RESULT(p, l, m, t) unpack3_UINT32(p, l, m, t)
183 #define unpack3_TPM_PCRINDEX(p, l, m, t) unpack3_UINT32(p, l, m, t)
184 #define unpack3_TPM_DIRINDEX(p, l, m, t) unpack3_UINT32(p, l, m, t)
185 #define unpack3_TPM_HANDLE(p, l, m, t) unpack3_UINT32(p, l, m, t)
186 #define unpack3_TPM_AUTHHANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
187 #define unpack3_TCPA_HASHHANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
188 #define unpack3_TCPA_HMACHANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
189 #define unpack3_TCPA_ENCHANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
190 #define unpack3_TPM_KEY_HANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
191 #define unpack3_TCPA_ENTITYHANDLE(p, l, m, t) unpack3_TPM_HANDLE(p, l, m, t)
192 #define unpack3_TPM_RESOURCE_TYPE(p, l, m, t) unpack3_UINT32(p, l, m, t)
193 #define unpack3_TPM_COMMAND_CODE(p, l, m, t) unpack3_UINT32(p, l, m, t)
194 #define unpack3_TPM_PROTOCOL_ID(p, l, m, t) unpack3_UINT16(p, l, m, t)
195 #define unpack3_TPM_AUTH_DATA_USAGE(p, l, m, t) unpack3_BYTE(p, l, m, t)
196 #define unpack3_TPM_ENTITY_TYPE(p, l, m, t) unpack3_UINT16(p, l, m, t)
197 #define unpack3_TPM_ALGORITHM_ID(p, l, m, t) unpack3_UINT32(p, l, m, t)
198 #define unpack3_TPM_KEY_USAGE(p, l, m, t) unpack3_UINT16(p, l, m, t)
199 #define unpack3_TPM_STARTUP_TYPE(p, l, m, t) unpack3_UINT16(p, l, m, t)
200 #define unpack3_TPM_CAPABILITY_AREA(p, l, m, t) unpack3_UINT32(p, l, m, t)
201 #define unpack3_TPM_ENC_SCHEME(p, l, m, t) unpack3_UINT16(p, l, m, t)
202 #define unpack3_TPM_SIG_SCHEME(p, l, m, t) unpack3_UINT16(p, l, m, t)
203 #define unpack3_TPM_MIGRATE_SCHEME(p, l, m, t) unpack3_UINT16(p, l, m, t)
204 #define unpack3_TPM_PHYSICAL_PRESENCE(p, l, m, t) unpack3_UINT16(p, l, m, t)
205 #define unpack3_TPM_KEY_FLAGS(p, l, m, t) unpack3_UINT32(p, l, m, t)
206 #define unpack3_TPM_LOCALITY_SELECTION(p, l, m, t) unpack3_BYTE(p, l, m, t)
207 #define unpack3_TPM_DEEP_QUOTE_INFO(p, l, m, t) unpack3_UINT32(p, l, m, t)
208
209 #define sizeof_TPM_RESULT(t) sizeof_UINT32(t)
210 #define sizeof_TPM_PCRINDEX(t) sizeof_UINT32(t)
211 #define sizeof_TPM_DIRINDEX(t) sizeof_UINT32(t)
212 #define sizeof_TPM_HANDLE(t) sizeof_UINT32(t)
213 #define sizeof_TPM_AUTHHANDLE(t) sizeof_TPM_HANDLE(t)
214 #define sizeof_TCPA_HASHHANDLE(t) sizeof_TPM_HANDLE(t)
215 #define sizeof_TCPA_HMACHANDLE(t) sizeof_TPM_HANDLE(t)
216 #define sizeof_TCPA_ENCHANDLE(t) sizeof_TPM_HANDLE(t)
217 #define sizeof_TPM_KEY_HANDLE(t) sizeof_TPM_HANDLE(t)
218 #define sizeof_TCPA_ENTITYHANDLE(t) sizeof_TPM_HANDLE(t)
219 #define sizeof_TPM_RESOURCE_TYPE(t) sizeof_UINT32(t)
220 #define sizeof_TPM_COMMAND_CODE(t) sizeof_UINT32(t)
221 #define sizeof_TPM_PROTOCOL_ID(t) sizeof_UINT16(t)
222 #define sizeof_TPM_AUTH_DATA_USAGE(t) sizeof_BYTE(t)
223 #define sizeof_TPM_ENTITY_TYPE(t) sizeof_UINT16(t)
224 #define sizeof_TPM_ALGORITHM_ID(t) sizeof_UINT32(t)
225 #define sizeof_TPM_KEY_USAGE(t) sizeof_UINT16(t)
226 #define sizeof_TPM_STARTUP_TYPE(t) sizeof_UINT16(t)
227 #define sizeof_TPM_CAPABILITY_AREA(t) sizeof_UINT32(t)
228 #define sizeof_TPM_ENC_SCHEME(t) sizeof_UINT16(t)
229 #define sizeof_TPM_SIG_SCHEME(t) sizeof_UINT16(t)
230 #define sizeof_TPM_MIGRATE_SCHEME(t) sizeof_UINT16(t)
231 #define sizeof_TPM_PHYSICAL_PRESENCE(t) sizeof_UINT16(t)
232 #define sizeof_TPM_KEY_FLAGS(t) sizeof_UINT32(t)
233 #define sizeof_TPM_LOCALITY_SELECTION(t) sizeof_BYTE(t)
234
235 #define pack_TPM_AUTH_HANDLE(p, t) pack_UINT32(p, t)
236 #define pack_TCS_CONTEXT_HANDLE(p, t) pack_UINT32(p, t)
237 #define pack_TCS_KEY_HANDLE(p, t) pack_UINT32(p, t)
238
239 #define unpack_TPM_AUTH_HANDLE(p, t) unpack_UINT32(p, t)
240 #define unpack_TCS_CONTEXT_HANDLE(p, t) unpack_UINT32(p, t)
241 #define unpack_TCS_KEY_HANDLE(p, t) unpack_UINT32(p, t)
242
243 #define sizeof_TPM_AUTH_HANDLE(t) sizeof_UINT32(t)
244 #define sizeof_TCS_CONTEXT_HANDLE(t) sizeof_UINT32(t)
245 #define sizeof_TCS_KEY_HANDLE(t) sizeof_UINT32(t)
246
247
248 static
pack_BUFFER(BYTE * ptr,const BYTE * buf,UINT32 size)249 inline BYTE* pack_BUFFER(BYTE* ptr, const BYTE* buf, UINT32 size) {
250 memcpy(ptr, buf, size);
251 return ptr + size;
252 }
253
254 static
unpack_BUFFER(BYTE * ptr,BYTE * buf,UINT32 size)255 inline BYTE* unpack_BUFFER(BYTE* ptr, BYTE* buf, UINT32 size) {
256 memcpy(buf, ptr, size);
257 return ptr + size;
258 }
259
260 static
unpack3_BUFFER(BYTE * ptr,UINT32 * pos,UINT32 max,BYTE * buf,UINT32 size)261 inline int unpack3_BUFFER(BYTE* ptr, UINT32* pos, UINT32 max, BYTE* buf, UINT32 size) {
262 if (*pos + size > max)
263 return TPM_SIZE;
264 memcpy(buf, ptr + *pos, size);
265 *pos += size;
266 return 0;
267 }
268
269 #define sizeof_BUFFER(b, s) s
270
271 static
unpack_ALIAS(BYTE * ptr,BYTE ** buf,UINT32 size)272 inline BYTE* unpack_ALIAS(BYTE* ptr, BYTE** buf, UINT32 size) {
273 *buf = ptr;
274 return ptr + size;
275 }
276
277 static
unpack_ALLOC(BYTE * ptr,BYTE ** buf,UINT32 size)278 inline BYTE* unpack_ALLOC(BYTE* ptr, BYTE** buf, UINT32 size) {
279 if(size) {
280 *buf = malloc(size);
281 memcpy(*buf, ptr, size);
282 } else {
283 *buf = NULL;
284 }
285 return ptr + size;
286 }
287
288 static
unpack_PTR(BYTE * ptr,BYTE ** buf,UINT32 size,UnpackPtr alloc)289 inline BYTE* unpack_PTR(BYTE* ptr, BYTE** buf, UINT32 size, UnpackPtr alloc) {
290 if(alloc == UNPACK_ALLOC) {
291 return unpack_ALLOC(ptr, buf, size);
292 } else {
293 return unpack_ALIAS(ptr, buf, size);
294 }
295 }
296
297 static
unpack3_PTR(BYTE * ptr,UINT32 * pos,UINT32 max,BYTE ** buf,UINT32 size,UnpackPtr alloc)298 inline int unpack3_PTR(BYTE* ptr, UINT32* pos, UINT32 max, BYTE** buf, UINT32 size, UnpackPtr alloc) {
299 if (size > max || *pos + size > max)
300 return TPM_SIZE;
301 if (alloc == UNPACK_ALLOC) {
302 unpack_ALLOC(ptr + *pos, buf, size);
303 } else {
304 unpack_ALIAS(ptr + *pos, buf, size);
305 }
306 *pos += size;
307 return 0;
308 }
309 #define unpack3_VPTR(ptr, pos, max, buf, size, alloc) unpack3_PTR(ptr, pos, max, (void*)(buf), size, alloc)
310
311 static
pack_TPM_AUTHDATA(BYTE * ptr,const TPM_AUTHDATA * d)312 inline BYTE* pack_TPM_AUTHDATA(BYTE* ptr, const TPM_AUTHDATA* d) {
313 return pack_BUFFER(ptr, *d, TPM_DIGEST_SIZE);
314 }
315
316 static
unpack_TPM_AUTHDATA(BYTE * ptr,TPM_AUTHDATA * d)317 inline BYTE* unpack_TPM_AUTHDATA(BYTE* ptr, TPM_AUTHDATA* d) {
318 return unpack_BUFFER(ptr, *d, TPM_DIGEST_SIZE);
319 }
320
321 static
unpack3_TPM_AUTHDATA(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_AUTHDATA * d)322 inline int unpack3_TPM_AUTHDATA(BYTE* ptr, UINT32* pos, UINT32 len, TPM_AUTHDATA* d) {
323 return unpack3_BUFFER(ptr, pos, len, *d, TPM_DIGEST_SIZE);
324 }
325
326 #define sizeof_TPM_AUTHDATA(d) TPM_DIGEST_SIZE
327
328 #define pack_TPM_SECRET(p, t) pack_TPM_AUTHDATA(p, t)
329 #define pack_TPM_ENCAUTH(p, t) pack_TPM_AUTHDATA(p, t)
330 #define pack_TPM_PAYLOAD_TYPE(p, t) pack_BYTE(p, t)
331 #define pack_TPM_TAG(p, t) pack_UINT16(p, t)
332 #define pack_TPM_STRUCTURE_TAG(p, t) pack_UINT16(p, t)
333
334 #define unpack_TPM_SECRET(p, t) unpack_TPM_AUTHDATA(p, t)
335 #define unpack_TPM_ENCAUTH(p, t) unpack_TPM_AUTHDATA(p, t)
336 #define unpack_TPM_PAYLOAD_TYPE(p, t) unpack_BYTE(p, t)
337 #define unpack_TPM_TAG(p, t) unpack_UINT16(p, t)
338 #define unpack_TPM_STRUCTURE_TAG(p, t) unpack_UINT16(p, t)
339 #define unpack3_TPM_STRUCTURE_TAG(p, l, m, t) unpack3_UINT16(p, l, m, t)
340
341 #define sizeof_TPM_SECRET(t) sizeof_TPM_AUTHDATA(t)
342 #define sizeof_TPM_ENCAUTH(t) sizeof_TPM_AUTHDATA(t)
343 #define sizeof_TPM_PAYLOAD_TYPE(t) sizeof_BYTE(t)
344 #define sizeof_TPM_TAG(t) sizeof_UINT16(t)
345 #define sizeof_TPM_STRUCTURE_TAG(t) sizeof_UINT16(t)
346
347 static
pack_TPM_VERSION(BYTE * ptr,const TPM_VERSION * t)348 inline BYTE* pack_TPM_VERSION(BYTE* ptr, const TPM_VERSION* t) {
349 ptr[0] = t->major;
350 ptr[1] = t->minor;
351 ptr[2] = t->revMajor;
352 ptr[3] = t->revMinor;
353 return ptr + 4;
354 }
355
356 static
unpack_TPM_VERSION(BYTE * ptr,TPM_VERSION * t)357 inline BYTE* unpack_TPM_VERSION(BYTE* ptr, TPM_VERSION* t) {
358 t->major = ptr[0];
359 t->minor = ptr[1];
360 t->revMajor = ptr[2];
361 t->revMinor = ptr[3];
362 return ptr + 4;
363 }
364
365 static
unpack3_TPM_VERSION(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_VERSION * t)366 inline int unpack3_TPM_VERSION(BYTE* ptr, UINT32 *pos, UINT32 max, TPM_VERSION* t) {
367 if (*pos + 4 > max)
368 return TPM_SIZE;
369 ptr += *pos;
370 t->major = ptr[0];
371 t->minor = ptr[1];
372 t->revMajor = ptr[2];
373 t->revMinor = ptr[3];
374 *pos += 4;
375 return 0;
376 }
377
378 #define sizeof_TPM_VERSION(x) 4
379
380 static
pack_TPM_CAP_VERSION_INFO(BYTE * ptr,const TPM_CAP_VERSION_INFO * v)381 inline BYTE* pack_TPM_CAP_VERSION_INFO(BYTE* ptr, const TPM_CAP_VERSION_INFO* v) {
382 ptr = pack_TPM_STRUCTURE_TAG(ptr, v->tag);
383 ptr = pack_TPM_VERSION(ptr, &v->version);
384 ptr = pack_UINT16(ptr, v->specLevel);
385 ptr = pack_BYTE(ptr, v->errataRev);
386 ptr = pack_BUFFER(ptr, v->tpmVendorID, sizeof(v->tpmVendorID));
387 ptr = pack_UINT16(ptr, v->vendorSpecificSize);
388 ptr = pack_BUFFER(ptr, v->vendorSpecific, v->vendorSpecificSize);
389 return ptr;
390 }
391
392 static
unpack_TPM_CAP_VERSION_INFO(BYTE * ptr,TPM_CAP_VERSION_INFO * v,UnpackPtr alloc)393 inline BYTE* unpack_TPM_CAP_VERSION_INFO(BYTE* ptr, TPM_CAP_VERSION_INFO* v, UnpackPtr alloc) {
394 ptr = unpack_TPM_STRUCTURE_TAG(ptr, &v->tag);
395 ptr = unpack_TPM_VERSION(ptr, &v->version);
396 ptr = unpack_UINT16(ptr, &v->specLevel);
397 ptr = unpack_BYTE(ptr, &v->errataRev);
398 ptr = unpack_BUFFER(ptr, v->tpmVendorID, sizeof(v->tpmVendorID));
399 ptr = unpack_UINT16(ptr, &v->vendorSpecificSize);
400 ptr = unpack_PTR(ptr, &v->vendorSpecific, v->vendorSpecificSize, alloc);
401 return ptr;
402 }
403
404 static
pack_TPM_DIGEST(BYTE * ptr,const TPM_DIGEST * d)405 inline BYTE* pack_TPM_DIGEST(BYTE* ptr, const TPM_DIGEST* d) {
406 return pack_BUFFER(ptr, d->digest, TPM_DIGEST_SIZE);
407 }
408
409 static
unpack_TPM_DIGEST(BYTE * ptr,TPM_DIGEST * d)410 inline BYTE* unpack_TPM_DIGEST(BYTE* ptr, TPM_DIGEST* d) {
411 return unpack_BUFFER(ptr, d->digest, TPM_DIGEST_SIZE);
412 }
413
414 static
unpack3_TPM_DIGEST(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_DIGEST * d)415 inline int unpack3_TPM_DIGEST(BYTE* ptr, UINT32* pos, UINT32 max, TPM_DIGEST* d) {
416 return unpack3_BUFFER(ptr, pos, max, d->digest, TPM_DIGEST_SIZE);
417 }
418
419 #define sizeof_TPM_DIGEST(d) TPM_DIGEST_SIZE
420
421 #define pack_TPM_PCRVALUE(ptr, d) pack_TPM_DIGEST(ptr, d)
422 #define unpack_TPM_PCRVALUE(ptr, d) unpack_TPM_DIGEST(ptr, d)
423 #define unpack3_TPM_PCRVALUE(p...) unpack3_TPM_DIGEST(p)
424
425 #define pack_TPM_COMPOSITE_HASH(ptr, d) pack_TPM_DIGEST(ptr, d)
426 #define unpack_TPM_COMPOSITE_HASH(ptr, d) unpack_TPM_DIGEST(ptr, d)
427 #define unpack3_TPM_COMPOSITE_HASH(ptr, p, m, d) unpack3_TPM_DIGEST(ptr, p, m, d)
428 #define sizeof_TPM_COMPOSITE_HASH(d) TPM_DIGEST_SIZE
429
430 #define pack_TPM_DIRVALUE(ptr, d) pack_TPM_DIGEST(ptr, d)
431 #define unpack_TPM_DIRVALUE(ptr, d) unpack_TPM_DIGEST(ptr, d)
432
433 #define pack_TPM_HMAC(ptr, d) pack_TPM_DIGEST(ptr, d)
434 #define unpack_TPM_HMAC(ptr, d) unpack_TPM_DIGEST(ptr, d)
435
436 #define pack_TPM_CHOSENID_HASH(ptr, d) pack_TPM_DIGEST(ptr, d)
437 #define unpack_TPM_CHOSENID_HASH(ptr, d) unpack_TPM_DIGEST(ptr, d)
438
439 static
pack_TPM_NONCE(BYTE * ptr,const TPM_NONCE * n)440 inline BYTE* pack_TPM_NONCE(BYTE* ptr, const TPM_NONCE* n) {
441 return pack_BUFFER(ptr, n->nonce, TPM_DIGEST_SIZE);
442 }
443
444 static
unpack_TPM_NONCE(BYTE * ptr,TPM_NONCE * n)445 inline BYTE* unpack_TPM_NONCE(BYTE* ptr, TPM_NONCE* n) {
446 return unpack_BUFFER(ptr, n->nonce, TPM_DIGEST_SIZE);
447 }
448
449 #define sizeof_TPM_NONCE(x) TPM_DIGEST_SIZE
450
451 static
unpack3_TPM_NONCE(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_NONCE * n)452 inline int unpack3_TPM_NONCE(BYTE* ptr, UINT32* pos, UINT32 max, TPM_NONCE* n) {
453 return unpack3_BUFFER(ptr, pos, max, n->nonce, TPM_DIGEST_SIZE);
454 }
455
456 static
pack_TPM_SYMMETRIC_KEY_PARMS(BYTE * ptr,const TPM_SYMMETRIC_KEY_PARMS * k)457 inline BYTE* pack_TPM_SYMMETRIC_KEY_PARMS(BYTE* ptr, const TPM_SYMMETRIC_KEY_PARMS* k) {
458 ptr = pack_UINT32(ptr, k->keyLength);
459 ptr = pack_UINT32(ptr, k->blockSize);
460 ptr = pack_UINT32(ptr, k->ivSize);
461 return pack_BUFFER(ptr, k->IV, k->ivSize);
462 }
463
464 static
pack_TPM_SYMMETRIC_KEY(BYTE * ptr,const TPM_SYMMETRIC_KEY * k)465 inline BYTE* pack_TPM_SYMMETRIC_KEY(BYTE* ptr, const TPM_SYMMETRIC_KEY* k) {
466 ptr = pack_UINT32(ptr, k->algId);
467 ptr = pack_UINT16(ptr, k->encScheme);
468 ptr = pack_UINT16(ptr, k->size);
469 return pack_BUFFER(ptr, k->data, k->size);
470 }
471
472 static
unpack3_TPM_SYMMETRIC_KEY_PARMS(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_SYMMETRIC_KEY_PARMS * k,UnpackPtr alloc)473 inline int unpack3_TPM_SYMMETRIC_KEY_PARMS(BYTE* ptr, UINT32* pos, UINT32 max, TPM_SYMMETRIC_KEY_PARMS* k, UnpackPtr alloc) {
474 return unpack3_UINT32(ptr, pos, max, &k->keyLength) ||
475 unpack3_UINT32(ptr, pos, max, &k->blockSize) ||
476 unpack3_UINT32(ptr, pos, max, &k->ivSize) ||
477 unpack3_PTR(ptr, pos, max, &k->IV, k->ivSize, alloc);
478 }
479
480 static
sizeof_TPM_SYMMETRIC_KEY_PARMS(const TPM_SYMMETRIC_KEY_PARMS * k)481 inline int sizeof_TPM_SYMMETRIC_KEY_PARMS(const TPM_SYMMETRIC_KEY_PARMS* k) {
482 return 12 + k->ivSize;
483 }
484
485 static
unpack3_TPM_SYMMETRIC_KEY(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_SYMMETRIC_KEY * k,UnpackPtr alloc)486 inline int unpack3_TPM_SYMMETRIC_KEY(BYTE* ptr, UINT32* pos, UINT32 max, TPM_SYMMETRIC_KEY* k, UnpackPtr alloc) {
487 return unpack3_UINT32(ptr, pos, max, &k->algId) ||
488 unpack3_UINT16(ptr, pos, max, &k->encScheme) ||
489 unpack3_UINT16(ptr, pos, max, &k->size) ||
490 unpack3_PTR(ptr, pos, max, &k->data, k->size, alloc);
491 }
492
493 static
pack_TPM_RSA_KEY_PARMS(BYTE * ptr,const TPM_RSA_KEY_PARMS * k)494 inline BYTE* pack_TPM_RSA_KEY_PARMS(BYTE* ptr, const TPM_RSA_KEY_PARMS* k) {
495 ptr = pack_UINT32(ptr, k->keyLength);
496 ptr = pack_UINT32(ptr, k->numPrimes);
497 ptr = pack_UINT32(ptr, k->exponentSize);
498 return pack_BUFFER(ptr, k->exponent, k->exponentSize);
499 }
500
501 static
unpack3_TPM_RSA_KEY_PARMS(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_RSA_KEY_PARMS * k,UnpackPtr alloc)502 inline int unpack3_TPM_RSA_KEY_PARMS(BYTE* ptr, UINT32* pos, UINT32 max, TPM_RSA_KEY_PARMS* k, UnpackPtr alloc) {
503 return unpack3_UINT32(ptr, pos, max, &k->keyLength) ||
504 unpack3_UINT32(ptr, pos, max, &k->numPrimes) ||
505 unpack3_UINT32(ptr, pos, max, &k->exponentSize) ||
506 unpack3_PTR(ptr, pos, max, &k->exponent, k->exponentSize, alloc);
507 }
508
509 static
sizeof_TPM_RSA_KEY_PARMS(const TPM_RSA_KEY_PARMS * k)510 inline int sizeof_TPM_RSA_KEY_PARMS(const TPM_RSA_KEY_PARMS* k) {
511 return 12 + k->exponentSize;
512 }
513
514
515 static
pack_TPM_KEY_PARMS(BYTE * ptr,const TPM_KEY_PARMS * k)516 inline BYTE* pack_TPM_KEY_PARMS(BYTE* ptr, const TPM_KEY_PARMS* k) {
517 ptr = pack_TPM_ALGORITHM_ID(ptr, k->algorithmID);
518 ptr = pack_TPM_ENC_SCHEME(ptr, k->encScheme);
519 ptr = pack_TPM_SIG_SCHEME(ptr, k->sigScheme);
520 ptr = pack_UINT32(ptr, k->parmSize);
521
522 if(k->parmSize) {
523 switch(k->algorithmID) {
524 case TPM_ALG_RSA:
525 return pack_TPM_RSA_KEY_PARMS(ptr, &k->parms.rsa);
526 case TPM_ALG_AES128:
527 case TPM_ALG_AES192:
528 case TPM_ALG_AES256:
529 return pack_TPM_SYMMETRIC_KEY_PARMS(ptr, &k->parms.sym);
530 }
531 }
532 return ptr;
533 }
534
535 static
unpack3_TPM_KEY_PARMS(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_KEY_PARMS * k,UnpackPtr alloc)536 inline int unpack3_TPM_KEY_PARMS(BYTE* ptr, UINT32* pos, UINT32 len, TPM_KEY_PARMS* k, UnpackPtr alloc) {
537 int rc = unpack3_TPM_ALGORITHM_ID(ptr, pos, len, &k->algorithmID) ||
538 unpack3_TPM_ENC_SCHEME(ptr, pos, len, &k->encScheme) ||
539 unpack3_TPM_SIG_SCHEME(ptr, pos, len, &k->sigScheme) ||
540 unpack3_UINT32(ptr, pos, len, &k->parmSize);
541 if (rc || k->parmSize == 0)
542 return rc;
543 switch(k->algorithmID) {
544 case TPM_ALG_RSA:
545 return unpack3_TPM_RSA_KEY_PARMS(ptr, pos, len, &k->parms.rsa, alloc);
546 case TPM_ALG_AES128:
547 case TPM_ALG_AES192:
548 case TPM_ALG_AES256:
549 return unpack3_TPM_SYMMETRIC_KEY_PARMS(ptr, pos, len, &k->parms.sym, alloc);
550 }
551 return TPM_FAIL;
552 }
553
554 static
sizeof_TPM_KEY_PARMS(const TPM_KEY_PARMS * k)555 inline int sizeof_TPM_KEY_PARMS(const TPM_KEY_PARMS* k) {
556 int rc = 0;
557 rc += sizeof_TPM_ALGORITHM_ID(&k->algorithmID);
558 rc += sizeof_TPM_ENC_SCHEME(&k->encScheme);
559 rc += sizeof_TPM_SIG_SCHEME(&k->sigScheme);
560 rc += sizeof_UINT32(&k->parmSize);
561 if (!k->parmSize)
562 return rc;
563 switch(k->algorithmID) {
564 case TPM_ALG_RSA:
565 rc += sizeof_TPM_RSA_KEY_PARMS(&k->parms.rsa);
566 break;
567 case TPM_ALG_AES128:
568 case TPM_ALG_AES192:
569 case TPM_ALG_AES256:
570 rc += sizeof_TPM_SYMMETRIC_KEY_PARMS(&k->parms.sym);
571 break;
572 }
573 return rc;
574 }
575
576 static
pack_TPM_STORE_PUBKEY(BYTE * ptr,const TPM_STORE_PUBKEY * k)577 inline BYTE* pack_TPM_STORE_PUBKEY(BYTE* ptr, const TPM_STORE_PUBKEY* k) {
578 ptr = pack_UINT32(ptr, k->keyLength);
579 ptr = pack_BUFFER(ptr, k->key, k->keyLength);
580 return ptr;
581 }
582
583 static
unpack3_TPM_STORE_PUBKEY(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_STORE_PUBKEY * k,UnpackPtr alloc)584 inline int unpack3_TPM_STORE_PUBKEY(BYTE* ptr, UINT32* pos, UINT32 max, TPM_STORE_PUBKEY* k, UnpackPtr alloc) {
585 return unpack3_UINT32(ptr, pos, max, &k->keyLength) ||
586 unpack3_PTR(ptr, pos, max, &k->key, k->keyLength, alloc);
587 }
588
589 static
sizeof_TPM_STORE_PUBKEY(const TPM_STORE_PUBKEY * k)590 inline int sizeof_TPM_STORE_PUBKEY(const TPM_STORE_PUBKEY* k) {
591 return 4 + k->keyLength;
592 }
593
594 static
pack_TPM_PUBKEY(BYTE * ptr,const TPM_PUBKEY * k)595 inline BYTE* pack_TPM_PUBKEY(BYTE* ptr, const TPM_PUBKEY* k) {
596 ptr = pack_TPM_KEY_PARMS(ptr, &k->algorithmParms);
597 return pack_TPM_STORE_PUBKEY(ptr, &k->pubKey);
598 }
599
600 static
unpack3_TPM_PUBKEY(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_PUBKEY * k,UnpackPtr alloc)601 inline int unpack3_TPM_PUBKEY(BYTE* ptr, UINT32* pos, UINT32 len, TPM_PUBKEY* k, UnpackPtr alloc) {
602 return unpack3_TPM_KEY_PARMS(ptr, pos, len, &k->algorithmParms, alloc) ||
603 unpack3_TPM_STORE_PUBKEY(ptr, pos, len, &k->pubKey, alloc);
604 }
605
606 static
pack_TPM_PCR_SELECTION(BYTE * ptr,const TPM_PCR_SELECTION * p)607 inline BYTE* pack_TPM_PCR_SELECTION(BYTE* ptr, const TPM_PCR_SELECTION* p) {
608 ptr = pack_UINT16(ptr, p->sizeOfSelect);
609 ptr = pack_BUFFER(ptr, p->pcrSelect, p->sizeOfSelect);
610 return ptr;
611 }
612
613 static
unpack_TPM_PCR_SELECTION(BYTE * ptr,TPM_PCR_SELECTION * p,UnpackPtr alloc)614 inline BYTE* unpack_TPM_PCR_SELECTION(BYTE* ptr, TPM_PCR_SELECTION* p, UnpackPtr alloc) {
615 ptr = unpack_UINT16(ptr, &p->sizeOfSelect);
616 ptr = unpack_PTR(ptr, &p->pcrSelect, p->sizeOfSelect, alloc);
617 return ptr;
618 }
619
620 static
unpack3_TPM_PCR_SELECTION(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_PCR_SELECTION * p,UnpackPtr alloc)621 inline int unpack3_TPM_PCR_SELECTION(BYTE* ptr, UINT32* pos, UINT32 max, TPM_PCR_SELECTION* p, UnpackPtr alloc) {
622 return unpack3_UINT16(ptr, pos, max, &p->sizeOfSelect) ||
623 unpack3_PTR(ptr, pos, max, &p->pcrSelect, p->sizeOfSelect, alloc);
624 }
625
626 static
sizeof_TPM_PCR_SELECTION(const TPM_PCR_SELECTION * p)627 inline int sizeof_TPM_PCR_SELECTION(const TPM_PCR_SELECTION* p) {
628 return 2 + p->sizeOfSelect;
629 }
630
631 static
pack_TPM_PCR_INFO(BYTE * ptr,const TPM_PCR_INFO * p)632 inline BYTE* pack_TPM_PCR_INFO(BYTE* ptr, const TPM_PCR_INFO* p) {
633 ptr = pack_TPM_PCR_SELECTION(ptr, &p->pcrSelection);
634 ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtRelease);
635 ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtCreation);
636 return ptr;
637 }
638
639 static
unpack3_TPM_PCR_INFO(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_PCR_INFO * p,UnpackPtr alloc)640 inline int unpack3_TPM_PCR_INFO(BYTE* ptr, UINT32* pos, UINT32 max, TPM_PCR_INFO* p, UnpackPtr alloc) {
641 return unpack3_TPM_PCR_SELECTION(ptr, pos, max, &p->pcrSelection, alloc) ||
642 unpack3_TPM_COMPOSITE_HASH(ptr, pos, max, &p->digestAtRelease) ||
643 unpack3_TPM_COMPOSITE_HASH(ptr, pos, max, &p->digestAtCreation);
644 }
645
646 static
sizeof_TPM_PCR_INFO(const TPM_PCR_INFO * p)647 inline int sizeof_TPM_PCR_INFO(const TPM_PCR_INFO* p) {
648 int rc = 0;
649 rc += sizeof_TPM_PCR_SELECTION(&p->pcrSelection);
650 rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtRelease);
651 rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtCreation);
652 return rc;
653 }
654
655 static
pack_TPM_PCR_INFO_LONG(BYTE * ptr,const TPM_PCR_INFO_LONG * p)656 inline BYTE* pack_TPM_PCR_INFO_LONG(BYTE* ptr, const TPM_PCR_INFO_LONG* p) {
657 ptr = pack_TPM_STRUCTURE_TAG(ptr, p->tag);
658 ptr = pack_TPM_LOCALITY_SELECTION(ptr, p->localityAtCreation);
659 ptr = pack_TPM_LOCALITY_SELECTION(ptr, p->localityAtRelease);
660 ptr = pack_TPM_PCR_SELECTION(ptr, &p->creationPCRSelection);
661 ptr = pack_TPM_PCR_SELECTION(ptr, &p->releasePCRSelection);
662 ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtCreation);
663 ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtRelease);
664 return ptr;
665 }
666
667 static
sizeof_TPM_PCR_INFO_LONG(const TPM_PCR_INFO_LONG * p)668 inline int sizeof_TPM_PCR_INFO_LONG(const TPM_PCR_INFO_LONG* p) {
669 int rc = 0;
670 rc += sizeof_TPM_STRUCTURE_TAG(p->tag);
671 rc += sizeof_TPM_LOCALITY_SELECTION(p->localityAtCreation);
672 rc += sizeof_TPM_LOCALITY_SELECTION(p->localityAtRelease);
673 rc += sizeof_TPM_PCR_SELECTION(&p->creationPCRSelection);
674 rc += sizeof_TPM_PCR_SELECTION(&p->releasePCRSelection);
675 rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtCreation);
676 rc += sizeof_TPM_COMPOSITE_HASH(&p->digestAtRelease);
677 return rc;
678 }
679
680 static
unpack3_TPM_PCR_INFO_LONG(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_PCR_INFO_LONG * p,UnpackPtr alloc)681 inline int unpack3_TPM_PCR_INFO_LONG(BYTE* ptr, UINT32* pos, UINT32 max, TPM_PCR_INFO_LONG* p, UnpackPtr alloc) {
682 return unpack3_TPM_STRUCTURE_TAG(ptr, pos, max, &p->tag) ||
683 unpack3_TPM_LOCALITY_SELECTION(ptr, pos, max,
684 &p->localityAtCreation) ||
685 unpack3_TPM_LOCALITY_SELECTION(ptr, pos, max,
686 &p->localityAtRelease) ||
687 unpack3_TPM_PCR_SELECTION(ptr, pos, max,
688 &p->creationPCRSelection, alloc) ||
689 unpack3_TPM_PCR_SELECTION(ptr, pos, max,
690 &p->releasePCRSelection, alloc) ||
691 unpack3_TPM_COMPOSITE_HASH(ptr, pos, max,
692 &p->digestAtCreation) ||
693 unpack3_TPM_COMPOSITE_HASH(ptr, pos, max, &p->digestAtRelease);
694 }
695
696 static
pack_TPM_PCR_COMPOSITE(BYTE * ptr,const TPM_PCR_COMPOSITE * p)697 inline BYTE* pack_TPM_PCR_COMPOSITE(BYTE* ptr, const TPM_PCR_COMPOSITE* p) {
698 ptr = pack_TPM_PCR_SELECTION(ptr, &p->select);
699 ptr = pack_UINT32(ptr, p->valueSize);
700 ptr = pack_BUFFER(ptr, (const BYTE*)p->pcrValue, p->valueSize);
701 return ptr;
702 }
703
704 static
unpack3_TPM_PCR_COMPOSITE(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_PCR_COMPOSITE * p,UnpackPtr alloc)705 inline int unpack3_TPM_PCR_COMPOSITE(BYTE* ptr, UINT32* pos, UINT32 max, TPM_PCR_COMPOSITE* p, UnpackPtr alloc) {
706 return unpack3_TPM_PCR_SELECTION(ptr, pos, max, &p->select, alloc) ||
707 unpack3_UINT32(ptr, pos, max, &p->valueSize) ||
708 unpack3_PTR(ptr, pos, max, (BYTE**)&p->pcrValue, p->valueSize, alloc);
709 }
710
711 static
pack_TPM_KEY(BYTE * ptr,const TPM_KEY * k)712 inline BYTE* pack_TPM_KEY(BYTE* ptr, const TPM_KEY* k) {
713 ptr = pack_TPM_VERSION(ptr, &k->ver);
714 ptr = pack_TPM_KEY_USAGE(ptr, k->keyUsage);
715 ptr = pack_TPM_KEY_FLAGS(ptr, k->keyFlags);
716 ptr = pack_TPM_AUTH_DATA_USAGE(ptr, k->authDataUsage);
717 ptr = pack_TPM_KEY_PARMS(ptr, &k->algorithmParms);
718 ptr = pack_UINT32(ptr, k->PCRInfoSize);
719 if(k->PCRInfoSize) {
720 ptr = pack_TPM_PCR_INFO(ptr, &k->PCRInfo);
721 }
722 ptr = pack_TPM_STORE_PUBKEY(ptr, &k->pubKey);
723 ptr = pack_UINT32(ptr, k->encDataSize);
724 return pack_BUFFER(ptr, k->encData, k->encDataSize);
725 }
726
727 static
unpack3_TPM_KEY(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_KEY * k,UnpackPtr alloc)728 inline int unpack3_TPM_KEY(BYTE* ptr, UINT32* pos, UINT32 max, TPM_KEY* k, UnpackPtr alloc) {
729 int rc = unpack3_TPM_VERSION(ptr, pos, max, &k->ver) ||
730 unpack3_TPM_KEY_USAGE(ptr, pos, max, &k->keyUsage) ||
731 unpack3_TPM_KEY_FLAGS(ptr, pos, max, &k->keyFlags) ||
732 unpack3_TPM_AUTH_DATA_USAGE(ptr, pos, max, &k->authDataUsage) ||
733 unpack3_TPM_KEY_PARMS(ptr, pos, max, &k->algorithmParms, alloc) ||
734 unpack3_UINT32(ptr, pos, max, &k->PCRInfoSize);
735 if (rc) return rc;
736 if(k->PCRInfoSize) {
737 rc = unpack3_TPM_PCR_INFO(ptr, pos, max, &k->PCRInfo, alloc);
738 }
739 if (rc) return rc;
740 return unpack3_TPM_STORE_PUBKEY(ptr, pos, max, &k->pubKey, alloc) ||
741 unpack3_UINT32(ptr, pos, max, &k->encDataSize) ||
742 unpack3_PTR(ptr, pos, max, &k->encData, k->encDataSize, alloc);
743 }
744
745 static
sizeof_TPM_KEY(const TPM_KEY * k)746 inline int sizeof_TPM_KEY(const TPM_KEY* k) {
747 int rc = 0;
748 rc += sizeof_TPM_VERSION(&k->ver);
749 rc += sizeof_TPM_KEY_USAGE(k->keyUsage);
750 rc += sizeof_TPM_KEY_FLAGS(k->keyFlags);
751 rc += sizeof_TPM_AUTH_DATA_USAGE(k->authDataUsage);
752 rc += sizeof_TPM_KEY_PARMS(&k->algorithmParms);
753 rc += sizeof_UINT32(k->PCRInfoSize);
754 if(k->PCRInfoSize) {
755 rc += sizeof_TPM_PCR_INFO(&k->PCRInfo);
756 }
757 rc += sizeof_TPM_STORE_PUBKEY(&k->pubKey);
758 rc += sizeof_UINT32(k->encDataSize);
759 rc += k->encDataSize;
760 return rc;
761 }
762
763 static
pack_TPM_BOUND_DATA(BYTE * ptr,const TPM_BOUND_DATA * b,UINT32 payloadSize)764 inline BYTE* pack_TPM_BOUND_DATA(BYTE* ptr, const TPM_BOUND_DATA* b, UINT32 payloadSize) {
765 ptr = pack_TPM_VERSION(ptr, &b->ver);
766 ptr = pack_TPM_PAYLOAD_TYPE(ptr, b->payload);
767 return pack_BUFFER(ptr, b->payloadData, payloadSize);
768 }
769
770 static
unpack_TPM_BOUND_DATA(BYTE * ptr,TPM_BOUND_DATA * b,UINT32 payloadSize,UnpackPtr alloc)771 inline BYTE* unpack_TPM_BOUND_DATA(BYTE* ptr, TPM_BOUND_DATA* b, UINT32 payloadSize, UnpackPtr alloc) {
772 ptr = unpack_TPM_VERSION(ptr, &b->ver);
773 ptr = unpack_TPM_PAYLOAD_TYPE(ptr, &b->payload);
774 return unpack_PTR(ptr, &b->payloadData, payloadSize, alloc);
775 }
776
777 static
pack_TPM_STORED_DATA(BYTE * ptr,const TPM_STORED_DATA * d)778 inline BYTE* pack_TPM_STORED_DATA(BYTE* ptr, const TPM_STORED_DATA* d) {
779 ptr = pack_TPM_VERSION(ptr, &d->ver);
780 ptr = pack_UINT32(ptr, d->sealInfoSize);
781 if(d->sealInfoSize) {
782 ptr = pack_TPM_PCR_INFO(ptr, &d->sealInfo);
783 }
784 ptr = pack_UINT32(ptr, d->encDataSize);
785 ptr = pack_BUFFER(ptr, d->encData, d->encDataSize);
786 return ptr;
787 }
788
789 static
sizeof_TPM_STORED_DATA(const TPM_STORED_DATA * d)790 inline int sizeof_TPM_STORED_DATA(const TPM_STORED_DATA* d) {
791 int rv = sizeof_TPM_VERSION(&d->ver) + sizeof_UINT32(d->sealInfoSize);
792 if (d->sealInfoSize) {
793 rv += sizeof_TPM_PCR_INFO(&d->sealInfo);
794 }
795 rv += sizeof_UINT32(d->encDataSize);
796 rv += sizeof_BUFFER(d->encData, d->encDataSize);
797 return rv;
798 }
799
800 static
unpack3_TPM_STORED_DATA(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_STORED_DATA * d,UnpackPtr alloc)801 inline int unpack3_TPM_STORED_DATA(BYTE* ptr, UINT32* pos, UINT32 len, TPM_STORED_DATA* d, UnpackPtr alloc) {
802 int rc = unpack3_TPM_VERSION(ptr, pos, len, &d->ver) ||
803 unpack3_UINT32(ptr, pos, len, &d->sealInfoSize);
804 if (rc)
805 return rc;
806 if (d->sealInfoSize)
807 rc = unpack3_TPM_PCR_INFO(ptr, pos, len, &d->sealInfo, alloc);
808 if (rc)
809 return rc;
810 rc = unpack3_UINT32(ptr, pos, len, &d->encDataSize) ||
811 unpack3_PTR(ptr, pos, len, &d->encData, d->encDataSize, alloc);
812 return rc;
813 }
814
815 static
pack_TPM_STORED_DATA12(BYTE * ptr,const TPM_STORED_DATA12 * d)816 inline BYTE* pack_TPM_STORED_DATA12(BYTE* ptr, const TPM_STORED_DATA12* d) {
817 ptr = pack_TPM_STRUCTURE_TAG(ptr, d->tag);
818 ptr = pack_TPM_ENTITY_TYPE(ptr, d->et);
819 ptr = pack_UINT32(ptr, d->sealInfoLongSize);
820 if(d->sealInfoLongSize) {
821 ptr = pack_TPM_PCR_INFO_LONG(ptr, &d->sealInfoLong);
822 }
823 ptr = pack_UINT32(ptr, d->encDataSize);
824 ptr = pack_BUFFER(ptr, d->encData, d->encDataSize);
825 return ptr;
826 }
827
828 static
sizeof_TPM_STORED_DATA12(const TPM_STORED_DATA12 * d)829 inline int sizeof_TPM_STORED_DATA12(const TPM_STORED_DATA12* d) {
830 int rv = sizeof_TPM_STRUCTURE_TAG(&d->ver) +
831 sizeof_TPM_ENTITY_TYPE(&d->et) +
832 sizeof_UINT32(d->sealInfoLongSize);
833 if (d->sealInfoLongSize) {
834 rv += sizeof_TPM_PCR_INFO_LONG(&d->sealInfoLong);
835 }
836 rv += sizeof_UINT32(d->encDataSize);
837 rv += sizeof_BUFFER(d->encData, d->encDataSize);
838 return rv;
839 }
840
841 static
unpack3_TPM_STORED_DATA12(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_STORED_DATA12 * d,UnpackPtr alloc)842 inline int unpack3_TPM_STORED_DATA12(BYTE* ptr, UINT32* pos, UINT32 len, TPM_STORED_DATA12* d, UnpackPtr alloc) {
843 int rc = unpack3_TPM_STRUCTURE_TAG(ptr, pos, len, &d->tag) ||
844 unpack3_TPM_ENTITY_TYPE(ptr, pos, len, &d->et) ||
845 unpack3_UINT32(ptr, pos, len, &d->sealInfoLongSize);
846 if (rc)
847 return rc;
848 if (d->sealInfoLongSize)
849 rc = unpack3_TPM_PCR_INFO_LONG(ptr, pos, len, &d->sealInfoLong,
850 alloc);
851 if (rc)
852 return rc;
853 rc = unpack3_UINT32(ptr, pos, len, &d->encDataSize) ||
854 unpack3_PTR(ptr, pos, len, &d->encData, d->encDataSize, alloc);
855 return rc;
856 }
857
858 static
pack_TPM_AUTH_SESSION(BYTE * ptr,const TPM_AUTH_SESSION * auth)859 inline BYTE* pack_TPM_AUTH_SESSION(BYTE* ptr, const TPM_AUTH_SESSION* auth) {
860 ptr = pack_TPM_AUTH_HANDLE(ptr, auth->AuthHandle);
861 ptr = pack_TPM_NONCE(ptr, &auth->NonceOdd);
862 ptr = pack_BOOL(ptr, auth->fContinueAuthSession);
863 ptr = pack_TPM_AUTHDATA(ptr, &auth->HMAC);
864 return ptr;
865 }
866
867 static
unpack_TPM_AUTH_SESSION(BYTE * ptr,TPM_AUTH_SESSION * auth)868 inline BYTE* unpack_TPM_AUTH_SESSION(BYTE* ptr, TPM_AUTH_SESSION* auth) {
869 ptr = unpack_TPM_NONCE(ptr, &auth->NonceEven);
870 ptr = unpack_BOOL(ptr, &auth->fContinueAuthSession);
871 ptr = unpack_TPM_AUTHDATA(ptr, &auth->HMAC);
872 return ptr;
873 }
874
875 static
unpack3_TPM_AUTH_SESSION(BYTE * ptr,UINT32 * pos,UINT32 len,TPM_AUTH_SESSION * auth)876 inline int unpack3_TPM_AUTH_SESSION(BYTE* ptr, UINT32* pos, UINT32 len, TPM_AUTH_SESSION* auth) {
877 return unpack3_TPM_NONCE(ptr, pos, len, &auth->NonceEven) ||
878 unpack3_BOOL(ptr, pos, len, &auth->fContinueAuthSession) ||
879 unpack3_TPM_AUTHDATA(ptr, pos, len, &auth->HMAC);
880 }
881
882
883 static
sizeof_TPM_AUTH_SESSION(const TPM_AUTH_SESSION * auth)884 inline int sizeof_TPM_AUTH_SESSION(const TPM_AUTH_SESSION* auth) {
885 int rv = 0;
886 rv += sizeof_TPM_AUTH_HANDLE(auth->AuthHandle);
887 rv += sizeof_TPM_NONCE(&auth->NonceOdd);
888 rv += sizeof_BOOL(auth->fContinueAuthSession);
889 rv += sizeof_TPM_AUTHDATA(&auth->HMAC);
890 return rv;
891 }
892
893 static
pack_TPM_RQU_HEADER(BYTE * ptr,TPM_TAG tag,UINT32 size,TPM_COMMAND_CODE ord)894 inline BYTE* pack_TPM_RQU_HEADER(BYTE* ptr,
895 TPM_TAG tag,
896 UINT32 size,
897 TPM_COMMAND_CODE ord) {
898 ptr = pack_UINT16(ptr, tag);
899 ptr = pack_UINT32(ptr, size);
900 return pack_UINT32(ptr, ord);
901 }
902
903 static
unpack_TPM_RQU_HEADER(BYTE * ptr,TPM_TAG * tag,UINT32 * size,TPM_COMMAND_CODE * ord)904 inline BYTE* unpack_TPM_RQU_HEADER(BYTE* ptr,
905 TPM_TAG* tag,
906 UINT32* size,
907 TPM_COMMAND_CODE* ord) {
908 ptr = unpack_UINT16(ptr, tag);
909 ptr = unpack_UINT32(ptr, size);
910 ptr = unpack_UINT32(ptr, ord);
911 return ptr;
912 }
913
914 static
unpack3_TPM_RQU_HEADER(BYTE * ptr,UINT32 * pos,UINT32 max,TPM_TAG * tag,UINT32 * size,TPM_COMMAND_CODE * ord)915 inline int unpack3_TPM_RQU_HEADER(BYTE* ptr, UINT32* pos, UINT32 max,
916 TPM_TAG* tag, UINT32* size, TPM_COMMAND_CODE* ord) {
917 return
918 unpack3_UINT16(ptr, pos, max, tag) ||
919 unpack3_UINT32(ptr, pos, max, size) ||
920 unpack3_UINT32(ptr, pos, max, ord);
921 }
922
923 #define pack_TPM_RSP_HEADER(p, t, s, r) pack_TPM_RQU_HEADER(p, t, s, r)
924 #define unpack_TPM_RSP_HEADER(p, t, s, r) unpack_TPM_RQU_HEADER(p, t, s, r)
925 #define unpack3_TPM_RSP_HEADER(p, l, m, t, s, r) unpack3_TPM_RQU_HEADER(p, l, m, t, s, r)
926
927 #endif
928