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, &param->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, &param->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