1 /*
2 * Copyright (c) 2014 Intel Corporation.
3 *
4 * Authors:
5 * Quan Xu <quan.xu@intel.com>
6 *
7 * Copyright (c) 2010-2012 United States Government, as represented by
8 * the Secretary of Defense. All rights reserved.
9 *
10 * based off of the original tools/vtpm_manager code base which is:
11 * Copyright (c) 2005, Intel Corp.
12 * All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 *
18 * * Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * * Redistributions in binary form must reproduce the above
21 * copyright notice, this list of conditions and the following
22 * disclaimer in the documentation and/or other materials provided
23 * with the distribution.
24 * * Neither the name of Intel Corporation nor the names of its
25 * contributors may be used to endorse or promote products derived
26 * from this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 */
41
42 #ifndef TPM2_MARSHAL_H
43 #define TPM2_MARSHAL_H
44
45 #include <stdlib.h>
46 #include <mini-os/byteorder.h>
47 #include <mini-os/endian.h>
48 #include "tcg.h"
49 #include "tpm2_types.h"
50 #include <assert.h>
51
52 #define pack_TPM_BUFFER(ptr, buf, size) pack_BUFFER(ptr, buf, size)
53 #define unpack_TPM_BUFFER(ptr, buf, size) unpack_BUFFER(ptr, buf, size)
54
55 static
pack_BYTE_ARRAY(BYTE * ptr,const BYTE * array,UINT32 size)56 inline BYTE* pack_BYTE_ARRAY(BYTE* ptr, const BYTE* array, UINT32 size)
57 {
58 int i;
59 for (i = 0; i < size; i++)
60 ptr = pack_BYTE(ptr, array[i]);
61 return ptr;
62 }
63
64 static
pack_TPMA_SESSION(BYTE * ptr,const TPMA_SESSION * attr)65 inline BYTE* pack_TPMA_SESSION(BYTE* ptr, const TPMA_SESSION *attr)
66 {
67 return pack_BYTE(ptr, (BYTE)(*attr));
68 }
69
70 static
unpack_TPMA_SESSION(BYTE * ptr,TPMA_SESSION * attr)71 inline BYTE* unpack_TPMA_SESSION(BYTE* ptr, TPMA_SESSION *attr)
72 {
73 return unpack_BYTE(ptr, (BYTE *)attr);
74 }
75
76 static
pack_TPMI_ALG_HASH(BYTE * ptr,const TPMI_ALG_HASH * hash)77 inline BYTE* pack_TPMI_ALG_HASH(BYTE* ptr, const TPMI_ALG_HASH *hash)
78 {
79 return pack_UINT16(ptr, *hash);
80 }
81
82 static
unpack_TPMI_ALG_HASH(BYTE * ptr,TPMI_ALG_HASH * hash)83 inline BYTE* unpack_TPMI_ALG_HASH(BYTE *ptr, TPMI_ALG_HASH *hash)
84 {
85 return unpack_UINT16(ptr, hash);
86 }
87
88 #define pack_TPMA_OBJECT(ptr, t) pack_UINT32(ptr, (UINT32)(*t))
89 #define unpack_TPMA_OBJECT(ptr, t) unpack_UINT32(ptr, (UINT32 *)(t))
90 #define pack_TPM_RH(ptr, t) pack_UINT32(ptr, (UINT32)(*t))
91 #define unpack_TPM_RH(ptr, t) unpack_UINT32(ptr, (UINT32 *)(t))
92 #define pack_TPMA_LOCALITY(ptr, locality) pack_BYTE(ptr, (BYTE)*locality)
93 #define unpack_TPMA_LOCALITY(ptr, locality) unpack_BYTE(ptr, (BYTE *)locality)
94 #define pack_TPM_ST(ptr, tag) pack_UINT16(ptr, *tag)
95 #define unpack_TPM_ST(ptr, tag) unpack_UINT16(ptr, tag)
96 #define pack_TPM_KEY_BITS(ptr, t) pack_UINT16(ptr, *t)
97 #define unpack_TPM_KEY_BITS(ptr, t) unpack_UINT16(ptr, t)
98 #define pack_TPMI_AES_KEY_BITS(ptr, t) pack_TPM_KEY_BITS(ptr, t)
99 #define unpack_TPMI_AES_KEY_BITS(ptr, t) unpack_TPM_KEY_BITS(ptr, t)
100 #define pack_TPMI_RSA_KEY_BITS(ptr, t) pack_TPM_KEY_BITS(ptr, t)
101 #define unpack_TPMI_RSA_KEY_BITS(ptr, t) unpack_TPM_KEY_BITS(ptr, t)
102 #define pack_TPM_ALG_ID(ptr, id) pack_UINT16(ptr, *id)
103 #define unpack_TPM_ALG_ID(ptr, id) unpack_UINT16(ptr, id)
104 #define pack_TPM_ALG_SYM(ptr, t) pack_TPM_ALG_ID(ptr, t)
105 #define unpack_TPM_ALG_SYM(ptr, t) unpack_TPM_ALG_ID(ptr, t)
106 #define pack_TPMI_ALG_ASYM(ptr, asym) pack_TPM_ALG_ID(ptr, asym)
107 #define unpack_TPMI_ALG_ASYM(ptr, asym) unpack_TPM_ALG_ID(ptr, asym)
108 #define pack_TPMI_ALG_SYM_OBJECT(ptr, t) pack_TPM_ALG_ID(ptr, t)
109 #define unpack_TPMI_ALG_SYM_OBJECT(ptr, t) unpack_TPM_ALG_ID(ptr, t)
110 #define pack_TPMI_ALG_SYM_MODE(ptr, t) pack_TPM_ALG_ID(ptr, t)
111 #define unpack_TPMI_ALG_SYM_MODE(ptr, t) unpack_TPM_ALG_ID(ptr, t)
112 #define pack_TPMI_ALG_KDF(ptr, t) pack_TPM_ALG_ID(ptr, t)
113 #define unpack_TPMI_ALG_KDF(ptr, t) unpack_TPM_ALG_ID(ptr, t)
114 #define pack_TPMI_ALG_PUBLIC(ptr, t) pack_TPM_ALG_ID(ptr, t)
115 #define unpack_TPMI_ALG_PUBLIC(ptr, t) unpack_TPM_ALG_ID(ptr, t)
116 #define pack_TPM2_HANDLE(ptr, h) pack_UINT32(ptr, *h)
117 #define unpack_TPM2_HANDLE(ptr, h) unpack_UINT32(ptr, h)
118 #define pack_TPMI_ALG_RSA_SCHEME(ptr, t) pack_TPM_ALG_ID(ptr, t)
119 #define unpack_TPMI_ALG_RSA_SCHEME(ptr, t) unpack_TPM_ALG_ID(ptr, t)
120 #define pack_TPMI_DH_OBJECT(ptr, o) pack_TPM2_HANDLE(ptr, o)
121 #define unpack_TPMI_DH_OBJECT(PTR, O) unpack_TPM2_HANDLE(ptr, o)
122 #define pack_TPMI_RH_HIERACHY(ptr, h) pack_TPM2_HANDLE(ptr, h)
123 #define unpack_TPMI_RH_HIERACHY(ptr, h) unpack_TPM2_HANDLE(ptr, h)
124 #define pack_TPMI_RH_PLATFORM(ptr, p) pack_TPM2_HANDLE(ptr, p)
125 #define unpack_TPMI_RH_PLATFORM(ptr, p) unpack_TPM2_HANDLE(ptr, p)
126 #define pack_TPMI_RH_OWNER(ptr, o) pack_TPM2_HANDLE(ptr, o)
127 #define unpack_TPMI_RH_OWNER(ptr, o) unpack_TPM2_HANDLE(ptr, o)
128 #define pack_TPMI_RH_ENDORSEMENT(ptr, e) pack_TPM2_HANDLE(ptr, e)
129 #define unpack_TPMI_RH_ENDORSEMENT(ptr, e) unpack_TPM2_HANDLE(ptr, e)
130 #define pack_TPMI_RH_LOCKOUT(ptr, l) pack_TPM2_HANDLE(ptr, l)
131 #define unpack_TPMI_RH_LOCKOUT(ptr, l) unpack_TPM2_HANDLE(ptr, l)
132
133 static
pack_TPM2B_DIGEST(BYTE * ptr,const TPM2B_DIGEST * digest)134 inline BYTE* pack_TPM2B_DIGEST(BYTE* ptr, const TPM2B_DIGEST *digest)
135 {
136 ptr = pack_UINT16(ptr, digest->size);
137 ptr = pack_BUFFER(ptr, digest->buffer, digest->size);
138 return ptr;
139 }
140
141 static
unpack_TPM2B_DIGEST(BYTE * ptr,TPM2B_DIGEST * digest)142 inline BYTE* unpack_TPM2B_DIGEST(BYTE* ptr, TPM2B_DIGEST *digest)
143 {
144 ptr = unpack_UINT16(ptr, &digest->size);
145 ptr = unpack_BUFFER(ptr, digest->buffer, digest->size);
146 return ptr;
147 }
148
149 static
pack_TPMT_TK_CREATION(BYTE * ptr,const TPMT_TK_CREATION * ticket)150 inline BYTE* pack_TPMT_TK_CREATION(BYTE* ptr,const TPMT_TK_CREATION *ticket )
151 {
152 ptr = pack_TPM_ST(ptr , &ticket->tag);
153 ptr = pack_TPMI_RH_HIERACHY(ptr , &ticket->hierarchy);
154 ptr = pack_TPM2B_DIGEST(ptr, &ticket->digest);
155 return ptr;
156 }
157
158 static
unpack_TPMT_TK_CREATION(BYTE * ptr,TPMT_TK_CREATION * ticket)159 inline BYTE* unpack_TPMT_TK_CREATION(BYTE* ptr, TPMT_TK_CREATION *ticket )
160 {
161 ptr = unpack_TPM_ST(ptr, &ticket->tag);
162 ptr = unpack_TPMI_RH_HIERACHY(ptr, &ticket->hierarchy);
163 ptr = unpack_TPM2B_DIGEST(ptr, &ticket->digest);
164 return ptr;
165 }
166
167 static
pack_TPM2B_NAME(BYTE * ptr,const TPM2B_NAME * name)168 inline BYTE* pack_TPM2B_NAME(BYTE* ptr,const TPM2B_NAME *name )
169 {
170 ptr = pack_UINT16(ptr, name->size);
171 ptr = pack_TPM_BUFFER(ptr, name->name, name->size);
172 return ptr;
173 }
174
175 static
unpack_TPM2B_NAME(BYTE * ptr,TPM2B_NAME * name)176 inline BYTE* unpack_TPM2B_NAME(BYTE* ptr, TPM2B_NAME *name)
177 {
178 ptr = unpack_UINT16(ptr, &name->size);
179 ptr = unpack_TPM_BUFFER(ptr, name->name, name->size);
180 return ptr;
181 }
182
183 static
pack_TPM2B_NONCE(BYTE * ptr,const TPM2B_NONCE * nonce)184 inline BYTE* pack_TPM2B_NONCE(BYTE* ptr, const TPM2B_NONCE *nonce)
185 {
186 return pack_TPM2B_DIGEST(ptr, (const TPM2B_DIGEST*)nonce);
187 }
188
189 #define unpack_TPM2B_NONCE(ptr, nonce) unpack_TPM2B_DIGEST(ptr, (TPM2B_DIGEST*)nonce)
190
191 static
pack_TPM2B_AUTH(BYTE * ptr,const TPM2B_AUTH * auth)192 inline BYTE* pack_TPM2B_AUTH(BYTE* ptr, const TPM2B_AUTH *auth)
193 {
194 return pack_TPM2B_DIGEST(ptr, (const TPM2B_DIGEST*)auth);
195 }
196
197 #define unpack_TPM2B_AUTH(ptr, auth) unpack_TPM2B_DIGEST(ptr, (TPM2B_DIGEST*)auth)
198
199 static
pack_TPM2B_DATA(BYTE * ptr,const TPM2B_DATA * data)200 inline BYTE* pack_TPM2B_DATA(BYTE* ptr, const TPM2B_DATA *data)
201 {
202 return pack_TPM2B_DIGEST(ptr, (const TPM2B_DIGEST*)data);
203 }
204
205 #define unpack_TPM2B_DATA(ptr, data) unpack_TPM2B_DIGEST(ptr, (TPM2B_DIGEST*)data)
206
207 static
pack_TPM2B_SENSITIVE_DATA(BYTE * ptr,const TPM2B_SENSITIVE_DATA * data)208 inline BYTE* pack_TPM2B_SENSITIVE_DATA(BYTE* ptr, const TPM2B_SENSITIVE_DATA *data)
209 {
210 return pack_TPM2B_DIGEST(ptr, (const TPM2B_DIGEST*)data);
211 }
212
213 #define unpack_TPM2B_SENSITIVE_DATA(ptr, data) unpack_TPM2B_DIGEST(ptr, (TPM2B_DIGEST*)data)
214
215 static
pack_TPM2B_PUBLIC_KEY_RSA(BYTE * ptr,const TPM2B_PUBLIC_KEY_RSA * rsa)216 inline BYTE* pack_TPM2B_PUBLIC_KEY_RSA(BYTE* ptr, const TPM2B_PUBLIC_KEY_RSA *rsa)
217 {
218 return pack_TPM2B_DIGEST(ptr, (const TPM2B_DIGEST*)rsa);
219 }
220
221 #define unpack_TPM2B_PUBLIC_KEY_RSA(ptr, rsa) unpack_TPM2B_DIGEST(ptr, (TPM2B_DIGEST*)rsa)
222
223 static
pack_TPM2B_PRIVATE(BYTE * ptr,const TPM2B_PRIVATE * Private)224 inline BYTE* pack_TPM2B_PRIVATE(BYTE* ptr, const TPM2B_PRIVATE *Private)
225 {
226 ptr = pack_UINT16(ptr, Private->size);
227 ptr = pack_TPM_BUFFER(ptr, Private->buffer, Private->size);
228 return ptr;
229 }
230
231 static
unpack_TPM2B_PRIVATE(BYTE * ptr,TPM2B_PRIVATE * Private)232 inline BYTE* unpack_TPM2B_PRIVATE(BYTE* ptr, TPM2B_PRIVATE *Private)
233 {
234 ptr = unpack_UINT16(ptr, &Private->size);
235 ptr = unpack_BUFFER(ptr, Private->buffer, Private->size);
236 return ptr;
237 }
238
239 static
pack_TPMS_PCR_SELECTION_ARRAY(BYTE * ptr,const TPMS_PCR_SELECTION * sel,UINT32 count)240 inline BYTE* pack_TPMS_PCR_SELECTION_ARRAY(BYTE* ptr, const TPMS_PCR_SELECTION *sel, UINT32 count)
241 {
242 int i;
243 for (i = 0; i < count; i++) {
244 ptr = pack_TPMI_ALG_HASH(ptr, &sel[i].hash);
245 ptr = pack_BYTE(ptr, sel[i].sizeofSelect);
246 ptr = pack_BUFFER(ptr, sel[i].pcrSelect, sel[i].sizeofSelect);
247 }
248 return ptr;
249 }
250
251 static
unpack_TPMS_PCR_SELECTION_ARRAY(BYTE * ptr,TPMS_PCR_SELECTION * sel,UINT32 count)252 inline BYTE* unpack_TPMS_PCR_SELECTION_ARRAY(BYTE* ptr, TPMS_PCR_SELECTION *sel, UINT32 count)
253 {
254 int i;
255 for (i = 0; i < count; i++) {
256 ptr = unpack_TPMI_ALG_HASH(ptr, &sel[i].hash);
257 ptr = unpack_BYTE(ptr, &sel[i].sizeofSelect);
258 ptr = unpack_BUFFER(ptr, sel[i].pcrSelect, sel[i].sizeofSelect);
259 }
260 return ptr;
261 }
262
263 static
pack_TPML_PCR_SELECTION(BYTE * ptr,const TPML_PCR_SELECTION * sel)264 inline BYTE* pack_TPML_PCR_SELECTION(BYTE* ptr, const TPML_PCR_SELECTION *sel)
265 {
266 ptr = pack_UINT32(ptr, sel->count);
267 ptr = pack_TPMS_PCR_SELECTION_ARRAY(ptr, sel->pcrSelections, sel->count);
268 return ptr;
269 }
270
271 static
unpack_TPML_PCR_SELECTION(BYTE * ptr,TPML_PCR_SELECTION * sel)272 inline BYTE* unpack_TPML_PCR_SELECTION(BYTE* ptr, TPML_PCR_SELECTION *sel)
273 {
274 ptr = unpack_UINT32(ptr, &sel->count);
275 ptr = unpack_TPMS_PCR_SELECTION_ARRAY(ptr, sel->pcrSelections, sel->count);
276 return ptr;
277 }
278
279 static
unpack_TPML_DIGEST(BYTE * ptr,TPML_DIGEST * digest)280 inline BYTE* unpack_TPML_DIGEST(BYTE* ptr,TPML_DIGEST *digest)
281 {
282 int i;
283 ptr = unpack_UINT32(ptr, &digest->count);
284 for (i=0;i<digest->count;i++)
285 {
286 ptr = unpack_TPM2B_DIGEST(ptr, &digest->digests[i]);
287 }
288 return ptr;
289 }
290
291 static
pack_TPMS_CREATION_DATA(BYTE * ptr,const TPMS_CREATION_DATA * data)292 inline BYTE* pack_TPMS_CREATION_DATA(BYTE* ptr,const TPMS_CREATION_DATA *data)
293 {
294 ptr = pack_TPML_PCR_SELECTION(ptr, &data->pcrSelect);
295 ptr = pack_TPM2B_DIGEST(ptr, &data->pcrDigest);
296 ptr = pack_TPMA_LOCALITY(ptr, &data->locality);
297 ptr = pack_TPM_ALG_ID(ptr, &data->parentNameAlg);
298 ptr = pack_TPM2B_NAME(ptr, &data->parentQualifiedName);
299 ptr = pack_TPM2B_DATA(ptr, &data->outsideInfo);
300 return ptr;
301 }
302
303 static
unpack_TPMS_CREATION_DATA(BYTE * ptr,TPMS_CREATION_DATA * data)304 inline BYTE* unpack_TPMS_CREATION_DATA(BYTE* ptr, TPMS_CREATION_DATA *data)
305 {
306 ptr = unpack_TPML_PCR_SELECTION(ptr, &data->pcrSelect);
307 ptr = unpack_TPM2B_DIGEST(ptr, &data->pcrDigest);
308 ptr = unpack_TPMA_LOCALITY(ptr, &data->locality);
309 ptr = unpack_TPM_ALG_ID(ptr, &data->parentNameAlg);
310 ptr = unpack_TPM2B_NAME(ptr, &data->parentName);
311 ptr = unpack_TPM2B_NAME(ptr, &data->parentQualifiedName);
312 ptr = unpack_TPM2B_DATA(ptr, &data->outsideInfo);
313 return ptr;
314 }
315
316 static
pack_TPM2B_CREATION_DATA(BYTE * ptr,const TPM2B_CREATION_DATA * data)317 inline BYTE* pack_TPM2B_CREATION_DATA(BYTE* ptr, const TPM2B_CREATION_DATA *data )
318 {
319 ptr = pack_UINT16(ptr, data->size);
320 ptr = pack_TPMS_CREATION_DATA(ptr, &data->creationData);
321 return ptr;
322 }
323
324 static
unpack_TPM2B_CREATION_DATA(BYTE * ptr,TPM2B_CREATION_DATA * data)325 inline BYTE* unpack_TPM2B_CREATION_DATA(BYTE* ptr, TPM2B_CREATION_DATA * data)
326 {
327 ptr = unpack_UINT16(ptr, &data->size);
328 ptr = unpack_TPMS_CREATION_DATA(ptr, &data->creationData);
329 return ptr;
330 }
331
332 static
pack_TPMS_SENSITIVE_CREATE(BYTE * ptr,const TPMS_SENSITIVE_CREATE * create)333 inline BYTE* pack_TPMS_SENSITIVE_CREATE(BYTE* ptr, const TPMS_SENSITIVE_CREATE *create)
334 {
335 ptr = pack_TPM2B_AUTH(ptr, &create->userAuth);
336 ptr = pack_TPM2B_SENSITIVE_DATA(ptr, &create->data);
337 return ptr;
338 }
339
340 static
pack_TPM2B_SENSITIVE_CREATE(BYTE * ptr,const TPM2B_SENSITIVE_CREATE * create)341 inline BYTE* pack_TPM2B_SENSITIVE_CREATE(BYTE* ptr, const TPM2B_SENSITIVE_CREATE *create)
342 {
343 BYTE* sizePtr = ptr;
344 ptr += 2;
345 ptr = pack_TPMS_SENSITIVE_CREATE(ptr, &create->sensitive);
346 pack_UINT16(sizePtr, (UINT16)(ptr - sizePtr - 2));
347 return ptr;
348 }
349
350 static
pack_TPMU_SYM_MODE(BYTE * ptr,const TPMU_SYM_MODE * p,const TPMI_ALG_SYM_OBJECT * sel)351 inline BYTE* pack_TPMU_SYM_MODE(BYTE* ptr, const TPMU_SYM_MODE *p,
352 const TPMI_ALG_SYM_OBJECT *sel)
353 {
354 switch(*sel) {
355 case TPM2_ALG_AES:
356 ptr = pack_TPMI_ALG_SYM_MODE(ptr, &p->aes);
357 break;
358 case TPM2_ALG_SM4:
359 assert(false);
360 break;
361 case TPM2_ALG_NULL:
362 case TPM2_ALG_XOR:
363 break;
364 default:
365 ptr = pack_TPMI_ALG_SYM_MODE(ptr, &p->sym);
366 }
367 return ptr;
368 }
369 static
unpack_TPMU_SYM_MODE(BYTE * ptr,TPMU_SYM_MODE * p,const TPMI_ALG_SYM_OBJECT * sel)370 inline BYTE* unpack_TPMU_SYM_MODE(BYTE* ptr, TPMU_SYM_MODE *p,
371 const TPMI_ALG_SYM_OBJECT *sel)
372 {
373 switch(*sel) {
374 case TPM2_ALG_AES:
375 ptr = unpack_TPMI_ALG_SYM_MODE(ptr, &p->aes);
376 break;
377 case TPM2_ALG_SM4:
378 assert(false);
379 break;
380 case TPM2_ALG_NULL:
381 case TPM2_ALG_XOR:
382 break;
383 default:
384 ptr = unpack_TPMI_ALG_SYM_MODE(ptr, &p->sym);
385 }
386 return ptr;
387 }
388
389 static
pack_TPMU_SYM_KEY_BITS(BYTE * ptr,const TPMU_SYM_KEY_BITS * p,const TPMI_ALG_SYM_OBJECT * sel)390 inline BYTE* pack_TPMU_SYM_KEY_BITS(BYTE* ptr, const TPMU_SYM_KEY_BITS *p,
391 const TPMI_ALG_SYM_OBJECT *sel)
392 {
393 switch(*sel) {
394 case TPM2_ALG_AES:
395 ptr = pack_TPMI_AES_KEY_BITS(ptr, &p->aes);
396 break;
397 case TPM2_ALG_SM4:
398 assert(false);
399 break;
400 case TPM2_ALG_XOR:
401 assert(false);
402 break;
403 case TPM2_ALG_NULL:
404 break;
405 default:
406 ptr = pack_TPM_KEY_BITS(ptr, &p->sym);
407 }
408 return ptr;
409 }
410
411 static
unpack_TPMU_SYM_KEY_BITS(BYTE * ptr,TPMU_SYM_KEY_BITS * p,const TPMI_ALG_SYM_OBJECT * sel)412 inline BYTE* unpack_TPMU_SYM_KEY_BITS(BYTE* ptr, TPMU_SYM_KEY_BITS *p,
413 const TPMI_ALG_SYM_OBJECT *sel)
414 {
415 switch(*sel) {
416 case TPM2_ALG_AES:
417 ptr = unpack_TPMI_AES_KEY_BITS(ptr, &p->aes);
418 break;
419 case TPM2_ALG_SM4:
420 assert(false);
421 break;
422 case TPM2_ALG_XOR:
423 assert(false);
424 break;
425 case TPM2_ALG_NULL:
426 break;
427 default:
428 ptr = unpack_TPM_KEY_BITS(ptr, &p->sym);
429 }
430 return ptr;
431 }
432
433 static
pack_TPMT_SYM_DEF_OBJECT(BYTE * ptr,const TPMT_SYM_DEF_OBJECT * p)434 inline BYTE* pack_TPMT_SYM_DEF_OBJECT(BYTE* ptr, const TPMT_SYM_DEF_OBJECT *p)
435 {
436 ptr = pack_TPMI_ALG_SYM_OBJECT(ptr, &p->algorithm);
437 ptr = pack_TPMU_SYM_KEY_BITS(ptr, &p->keyBits, &p->algorithm);
438 ptr = pack_TPMU_SYM_MODE(ptr, &p->mode, &p->algorithm);
439 return ptr;
440 }
441
442 static
unpack_TPMT_SYM_DEF_OBJECT(BYTE * ptr,TPMT_SYM_DEF_OBJECT * p)443 inline BYTE* unpack_TPMT_SYM_DEF_OBJECT(BYTE *ptr, TPMT_SYM_DEF_OBJECT *p)
444 {
445 ptr = unpack_TPMI_ALG_SYM_OBJECT(ptr, &p->algorithm);
446 ptr = unpack_TPMU_SYM_KEY_BITS(ptr, &p->keyBits, &p->algorithm);
447 ptr = unpack_TPMU_SYM_MODE(ptr, &p->mode, &p->algorithm);
448 return ptr;
449 }
450
451 #define pack_TPMS_SCHEME_OAEP(p, t) pack_TPMI_ALG_HASH(p, &((t)->hashAlg))
452 #define unpack_TPMS_SCHEME_OAEP(p, t) unpack_TPMI_ALG_HASH(p, &((t)->hashAlg))
453
454 static
pack_TPMU_ASYM_SCHEME(BYTE * ptr,const TPMU_ASYM_SCHEME * p,const TPMI_ALG_RSA_SCHEME * s)455 inline BYTE* pack_TPMU_ASYM_SCHEME(BYTE *ptr, const TPMU_ASYM_SCHEME *p,
456 const TPMI_ALG_RSA_SCHEME *s)
457 {
458 switch(*s) {
459 #ifdef TPM2_ALG_RSASSA
460 case TPM2_ALG_RSASSA:
461 assert(false || "TPM2_ALG_RSASSA");
462 break;
463 #endif
464 #ifdef TPM2_ALG_OAEP
465 case TPM2_ALG_OAEP:
466 ptr = pack_TPMS_SCHEME_OAEP(ptr, &p->oaep);
467 break;
468 #endif
469 case TPM2_ALG_NULL:
470 break;
471 default:
472 assert(false || "DEFAULT");
473 }
474 return ptr;
475 }
476
477 static
unpack_TPMU_ASYM_SCHEME(BYTE * ptr,TPMU_ASYM_SCHEME * p,const TPMI_ALG_RSA_SCHEME * s)478 inline BYTE* unpack_TPMU_ASYM_SCHEME(BYTE *ptr, TPMU_ASYM_SCHEME *p,
479 const TPMI_ALG_RSA_SCHEME *s)
480 {
481 switch(*s) {
482 #ifdef TPM2_ALG_RSASSA
483 case TPM2_ALG_RSASSA:
484 printf("not support TPM_ALG_RSASSA\n");
485 assert(false);
486 break;
487 #endif
488 #ifdef TPM2_ALG_OAEP
489 case TPM2_ALG_OAEP:
490 ptr = unpack_TPMS_SCHEME_OAEP(ptr, &p->oaep);
491 break;
492 #endif
493 case TPM2_ALG_NULL:
494 break;
495 default:
496 printf("default TPMI_ALG_RSA_SCHEME 0x%X\n", (UINT32)*s);
497 ptr = unpack_TPMI_ALG_HASH(ptr, &p->anySig.hashAlg);
498 }
499 return ptr;
500 }
501
502 static
pack_TPMT_RSA_SCHEME(BYTE * ptr,const TPMT_RSA_SCHEME * p)503 inline BYTE* pack_TPMT_RSA_SCHEME(BYTE* ptr, const TPMT_RSA_SCHEME *p)
504 {
505 ptr = pack_TPMI_ALG_RSA_SCHEME(ptr, &p->scheme);
506 ptr = pack_TPMU_ASYM_SCHEME(ptr, &p->details, &p->scheme);
507 return ptr;
508 }
509
510 static
unpack_TPMT_RSA_SCHEME(BYTE * ptr,TPMT_RSA_SCHEME * p)511 inline BYTE* unpack_TPMT_RSA_SCHEME(BYTE* ptr, TPMT_RSA_SCHEME *p)
512 {
513 ptr = unpack_TPMI_ALG_RSA_SCHEME(ptr, &p->scheme);
514 ptr = unpack_TPMU_ASYM_SCHEME(ptr, &p->details, &p->scheme);
515 return ptr;
516 }
517
518 static
pack_TPMT_RSA_DECRYPT(BYTE * ptr,const TPMT_RSA_DECRYPT * p)519 inline BYTE* pack_TPMT_RSA_DECRYPT(BYTE* ptr, const TPMT_RSA_DECRYPT *p)
520 {
521 ptr = pack_TPMI_ALG_RSA_SCHEME(ptr, &p->scheme);
522 ptr = pack_TPMU_ASYM_SCHEME(ptr, &p->details, &p->scheme);
523 return ptr;
524 }
525
526 static
pack_TPMS_RSA_PARMS(BYTE * ptr,const TPMS_RSA_PARMS * p)527 inline BYTE* pack_TPMS_RSA_PARMS(BYTE* ptr, const TPMS_RSA_PARMS *p)
528 {
529 ptr = pack_TPMT_SYM_DEF_OBJECT(ptr, &p->symmetric);
530 ptr = pack_TPMT_RSA_SCHEME(ptr, &p->scheme);
531 ptr = pack_TPMI_RSA_KEY_BITS(ptr, &p->keyBits);
532 ptr = pack_UINT32(ptr, p->exponent);
533 return ptr;
534 }
535
536 static
unpack_TPMS_RSA_PARMS(BYTE * ptr,TPMS_RSA_PARMS * p)537 inline BYTE* unpack_TPMS_RSA_PARMS(BYTE *ptr, TPMS_RSA_PARMS *p)
538 {
539 ptr = unpack_TPMT_SYM_DEF_OBJECT(ptr, &p->symmetric);
540 ptr = unpack_TPMT_RSA_SCHEME(ptr, &p->scheme);
541 ptr = unpack_TPMI_RSA_KEY_BITS(ptr, &p->keyBits);
542 ptr = unpack_UINT32(ptr, &p->exponent);
543 return ptr;
544 }
545
546 static
pack_TPMU_PUBLIC_PARMS(BYTE * ptr,const TPMU_PUBLIC_PARMS * param,const TPMI_ALG_PUBLIC * selector)547 inline BYTE* pack_TPMU_PUBLIC_PARMS(BYTE* ptr, const TPMU_PUBLIC_PARMS *param,
548 const TPMI_ALG_PUBLIC *selector)
549 {
550 switch(*selector) {
551 case TPM2_ALG_KEYEDHASH:
552 assert(false);
553 case TPM2_ALG_SYMCIPHER:
554 assert(false);
555 case TPM2_ALG_RSA:
556 return pack_TPMS_RSA_PARMS(ptr, ¶m->rsaDetail);
557 case TPM2_ALG_ECC:
558 assert(false);
559 }
560 assert(false);
561 return NULL;
562 }
563
564 static
unpack_TPMU_PUBLIC_PARMS(BYTE * ptr,TPMU_PUBLIC_PARMS * param,const TPMI_ALG_PUBLIC * selector)565 inline BYTE* unpack_TPMU_PUBLIC_PARMS(BYTE* ptr, TPMU_PUBLIC_PARMS *param,
566 const TPMI_ALG_PUBLIC *selector)
567 {
568 switch(*selector) {
569 case TPM2_ALG_KEYEDHASH:
570 assert(false);
571 case TPM2_ALG_SYMCIPHER:
572 assert(false);
573 case TPM2_ALG_RSA:
574 return unpack_TPMS_RSA_PARMS(ptr, ¶m->rsaDetail);
575 case TPM2_ALG_ECC:
576 assert(false);
577 }
578 assert(false);
579 return NULL;
580 }
581
582 static
pack_TPMS_ECC_POINT(BYTE * ptr,const TPMS_ECC_POINT * point)583 inline BYTE* pack_TPMS_ECC_POINT(BYTE* ptr, const TPMS_ECC_POINT *point)
584 {
585 assert(false);
586 return ptr;
587 }
588
589 static
unpack_TPMS_ECC_POINT(BYTE * ptr,TPMS_ECC_POINT * point)590 inline BYTE* unpack_TPMS_ECC_POINT(BYTE* ptr, TPMS_ECC_POINT *point)
591 {
592 assert(false);
593 return ptr;
594 }
595
596 static
pack_TPMU_PUBLIC_ID(BYTE * ptr,const TPMU_PUBLIC_ID * id,const TPMI_ALG_PUBLIC * selector)597 inline BYTE* pack_TPMU_PUBLIC_ID(BYTE* ptr, const TPMU_PUBLIC_ID *id,
598 const TPMI_ALG_PUBLIC *selector)
599 {
600 switch (*selector) {
601 case TPM2_ALG_KEYEDHASH:
602 return pack_TPM2B_DIGEST(ptr, &id->keyedHash);
603 case TPM2_ALG_SYMCIPHER:
604 return pack_TPM2B_DIGEST(ptr, &id->sym);
605 case TPM2_ALG_RSA:
606 return pack_TPM2B_PUBLIC_KEY_RSA(ptr, &id->rsa);
607 case TPM2_ALG_ECC:
608 return pack_TPMS_ECC_POINT(ptr, &id->ecc);
609 }
610 assert(false);
611 return NULL;
612 }
613
614 static
unpack_TPMU_PUBLIC_ID(BYTE * ptr,TPMU_PUBLIC_ID * id,TPMI_ALG_PUBLIC * selector)615 inline BYTE* unpack_TPMU_PUBLIC_ID(BYTE* ptr, TPMU_PUBLIC_ID *id, TPMI_ALG_PUBLIC *selector)
616 {
617 switch (*selector) {
618 case TPM2_ALG_KEYEDHASH:
619 return unpack_TPM2B_DIGEST(ptr, &id->keyedHash);
620 case TPM2_ALG_SYMCIPHER:
621 return unpack_TPM2B_DIGEST(ptr, &id->sym);
622 case TPM2_ALG_RSA:
623 return unpack_TPM2B_PUBLIC_KEY_RSA(ptr, &id->rsa);
624 case TPM2_ALG_ECC:
625 return unpack_TPMS_ECC_POINT(ptr, &id->ecc);
626 }
627 assert(false);
628 return NULL;
629 }
630
631 static
pack_TPMT_PUBLIC(BYTE * ptr,const TPMT_PUBLIC * public)632 inline BYTE* pack_TPMT_PUBLIC(BYTE* ptr, const TPMT_PUBLIC *public)
633 {
634 ptr = pack_TPMI_ALG_PUBLIC(ptr, &public->type);
635 ptr = pack_TPMI_ALG_HASH(ptr, &public->nameAlg);
636 ptr = pack_TPMA_OBJECT(ptr, &public->objectAttributes);
637 ptr = pack_TPM2B_DIGEST(ptr, &public->authPolicy);
638 ptr = pack_TPMU_PUBLIC_PARMS(ptr, &public->parameters, &public->type);
639 ptr = pack_TPMU_PUBLIC_ID(ptr, &public->unique, &public->type);
640 return ptr;
641 }
642
643 static
unpack_TPMT_PUBLIC(BYTE * ptr,TPMT_PUBLIC * public)644 inline BYTE* unpack_TPMT_PUBLIC(BYTE* ptr, TPMT_PUBLIC *public)
645 {
646 ptr = unpack_TPMI_ALG_PUBLIC(ptr, &public->type);
647 ptr = unpack_TPMI_ALG_HASH(ptr, &public->nameAlg);
648 ptr = unpack_TPMA_OBJECT(ptr, &public->objectAttributes);
649 ptr = unpack_TPM2B_DIGEST(ptr, &public->authPolicy);
650 ptr = unpack_TPMU_PUBLIC_PARMS(ptr, &public->parameters, &public->type);
651 ptr = unpack_TPMU_PUBLIC_ID(ptr, &public->unique, &public->type);
652 return ptr;
653 }
654
655 static
pack_TPM2B_PUBLIC(BYTE * ptr,const TPM2B_PUBLIC * public)656 inline BYTE* pack_TPM2B_PUBLIC(BYTE* ptr, const TPM2B_PUBLIC *public)
657 {
658 BYTE *sizePtr = ptr;
659 ptr += 2;
660 ptr = pack_TPMT_PUBLIC(ptr, &public->publicArea);
661 pack_UINT16(sizePtr, (UINT16)(ptr - sizePtr - 2));
662 return ptr;
663 }
664
665 static
unpack_TPM2B_PUBLIC(BYTE * ptr,TPM2B_PUBLIC * public)666 inline BYTE* unpack_TPM2B_PUBLIC(BYTE* ptr, TPM2B_PUBLIC *public)
667 {
668 ptr = unpack_UINT16(ptr, &public->size);
669 ptr = unpack_TPMT_PUBLIC(ptr, &public->publicArea);
670 return ptr;
671 }
672
673 static
pack_TPMS_PCR_SELECTION(BYTE * ptr,const TPMS_PCR_SELECTION * selection)674 inline BYTE* pack_TPMS_PCR_SELECTION(BYTE* ptr, const TPMS_PCR_SELECTION *selection)
675 {
676 ptr = pack_TPMI_ALG_HASH(ptr, &selection->hash);
677 ptr = pack_BYTE(ptr, selection->sizeofSelect);
678 ptr = pack_BYTE_ARRAY(ptr, selection->pcrSelect, selection->sizeofSelect);
679 return ptr;
680 }
681
682 static
pack_TPMS_PCR_SELECTION_Array(BYTE * ptr,const TPMS_PCR_SELECTION * selections,const UINT32 cnt)683 inline BYTE* pack_TPMS_PCR_SELECTION_Array(BYTE* ptr, const TPMS_PCR_SELECTION *selections,
684 const UINT32 cnt)
685 {
686 int i;
687 for (i = 0; i < cnt; i++)
688 ptr = pack_TPMS_PCR_SELECTION(ptr, selections + i);
689 return ptr;
690 }
691
692 static
pack_TPM_AuthArea(BYTE * ptr,const TPM_AuthArea * auth)693 inline BYTE* pack_TPM_AuthArea(BYTE* ptr, const TPM_AuthArea *auth)
694 {
695 BYTE* sizePtr = ptr;
696 ptr += sizeof(UINT32);
697 ptr = pack_TPM_RH(ptr, &auth->sessionHandle);
698 ptr = pack_TPM2B_NONCE(ptr, &auth->nonce);
699 ptr = pack_TPMA_SESSION(ptr, &auth->sessionAttributes);
700 ptr = pack_TPM2B_AUTH(ptr, &auth->auth);
701 pack_UINT32(sizePtr, ptr - sizePtr - sizeof(UINT32));
702 return ptr;
703 }
704
705 static
unpack_TPM_AuthArea(BYTE * ptr,TPM_AuthArea * auth)706 inline BYTE* unpack_TPM_AuthArea(BYTE* ptr, TPM_AuthArea *auth)
707 {
708 ptr = unpack_UINT32(ptr, &auth->size);
709 ptr = unpack_TPM_RH(ptr, &auth->sessionHandle);
710 ptr = unpack_TPM2B_NONCE(ptr, &auth->nonce);
711 ptr = unpack_TPMA_SESSION(ptr, &auth->sessionAttributes);
712 ptr = unpack_TPM2B_AUTH(ptr, &auth->auth);
713 return ptr;
714 }
715
716 static
pack_TPM2_RSA_KEY(BYTE * ptr,const TPM2_RSA_KEY * key)717 inline BYTE* pack_TPM2_RSA_KEY(BYTE* ptr, const TPM2_RSA_KEY *key)
718 {
719 ptr = pack_TPM2B_PRIVATE(ptr, &key->Private);
720 ptr = pack_TPM2B_PUBLIC(ptr, &key->Public);
721 return ptr;
722 }
723
724 static
unpack_TPM2_RSA_KEY(BYTE * ptr,TPM2_RSA_KEY * key)725 inline BYTE* unpack_TPM2_RSA_KEY(BYTE* ptr, TPM2_RSA_KEY *key)
726 {
727 ptr = unpack_TPM2B_PRIVATE(ptr, &key->Private);
728 ptr = unpack_TPM2B_PUBLIC(ptr, &key->Public);
729 return ptr;
730 }
731 #endif
732