xref: /aosp_15_r20/external/tpm2-tss/test/unit/TPMT-marshal.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright (c) 2017-2018, Intel Corporation
4*758e9fbaSOystein Eftevaag  *
5*758e9fbaSOystein Eftevaag  * All rights reserved.
6*758e9fbaSOystein Eftevaag  ***********************************************************************/
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag 
11*758e9fbaSOystein Eftevaag #include <stdarg.h>
12*758e9fbaSOystein Eftevaag #include <stddef.h>
13*758e9fbaSOystein Eftevaag #include <setjmp.h>
14*758e9fbaSOystein Eftevaag #include <cmocka.h>
15*758e9fbaSOystein Eftevaag #include <stdio.h>
16*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
17*758e9fbaSOystein Eftevaag #include "util/tss2_endian.h"
18*758e9fbaSOystein Eftevaag 
19*758e9fbaSOystein Eftevaag /*
20*758e9fbaSOystein Eftevaag  * Success case
21*758e9fbaSOystein Eftevaag  */
22*758e9fbaSOystein Eftevaag static void
tpmt_marshal_success(void ** state)23*758e9fbaSOystein Eftevaag tpmt_marshal_success(void **state)
24*758e9fbaSOystein Eftevaag {
25*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
26*758e9fbaSOystein Eftevaag     TPMT_PUBLIC pub = {0};
27*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(pub)] = { 0 };
28*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(buffer);
29*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION *ptr;
30*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY *ptr2;
31*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *ptr3;
32*758e9fbaSOystein Eftevaag     TPMT_PUBLIC *ptr4;
33*758e9fbaSOystein Eftevaag     TPMU_PUBLIC_PARMS *ptr5;
34*758e9fbaSOystein Eftevaag     TSS2_RC rc;
35*758e9fbaSOystein Eftevaag 
36*758e9fbaSOystein Eftevaag     tkt.tag = 0xbeef;
37*758e9fbaSOystein Eftevaag     tkt.hierarchy = TPM2_RH_OWNER;
38*758e9fbaSOystein Eftevaag     tkt.digest.size = 4;
39*758e9fbaSOystein Eftevaag     tkt.digest.buffer[0] = 0xde;
40*758e9fbaSOystein Eftevaag     tkt.digest.buffer[1] = 0xad;
41*758e9fbaSOystein Eftevaag     tkt.digest.buffer[2] = 0xbe;
42*758e9fbaSOystein Eftevaag     tkt.digest.buffer[3] = 0xef;
43*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Marshal(&tkt, buffer, buffer_size, NULL);
44*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
45*758e9fbaSOystein Eftevaag 
46*758e9fbaSOystein Eftevaag     ptr = (TPMT_TK_CREATION *)buffer;
47*758e9fbaSOystein Eftevaag     ptr2 = (TPMI_RH_HIERARCHY *)(buffer + sizeof(tkt.tag));
48*758e9fbaSOystein Eftevaag     ptr3 = (TPM2B_DIGEST *)(buffer + sizeof(tkt.tag) + sizeof(tkt.hierarchy));
49*758e9fbaSOystein Eftevaag 
50*758e9fbaSOystein Eftevaag     assert_int_equal (ptr->tag, HOST_TO_BE_16(0xbeef));
51*758e9fbaSOystein Eftevaag     assert_int_equal (*ptr2, HOST_TO_BE_32(TPM2_RH_OWNER));
52*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->size, HOST_TO_BE_16(4));
53*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[0], 0xde);
54*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[1], 0xad);
55*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[2], 0xbe);
56*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[3], 0xef);
57*758e9fbaSOystein Eftevaag 
58*758e9fbaSOystein Eftevaag     pub.type = TPM2_ALG_RSA;
59*758e9fbaSOystein Eftevaag     pub.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
60*758e9fbaSOystein Eftevaag     pub.parameters.rsaDetail.symmetric.keyBits.aes = 128;
61*758e9fbaSOystein Eftevaag     pub.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CBC;
62*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_Marshal(&pub, buffer, buffer_size, NULL);
63*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
64*758e9fbaSOystein Eftevaag     ptr4 = (TPMT_PUBLIC *)buffer;
65*758e9fbaSOystein Eftevaag     ptr5 = (TPMU_PUBLIC_PARMS *)(buffer + sizeof(TPMI_ALG_PUBLIC) + sizeof(TPMI_ALG_HASH) + sizeof(TPMA_OBJECT) + 2);
66*758e9fbaSOystein Eftevaag     assert_int_equal (ptr4->type, HOST_TO_BE_16(TPM2_ALG_RSA));
67*758e9fbaSOystein Eftevaag     assert_int_equal (ptr5->rsaDetail.symmetric.algorithm, HOST_TO_BE_16(TPM2_ALG_AES));
68*758e9fbaSOystein Eftevaag     assert_int_equal (ptr5->rsaDetail.symmetric.keyBits.aes, HOST_TO_BE_16(128));
69*758e9fbaSOystein Eftevaag     assert_int_equal (ptr5->rsaDetail.symmetric.mode.aes, HOST_TO_BE_16(TPM2_ALG_CBC));
70*758e9fbaSOystein Eftevaag }
71*758e9fbaSOystein Eftevaag /*
72*758e9fbaSOystein Eftevaag  * Success case with a valid offset
73*758e9fbaSOystein Eftevaag  */
74*758e9fbaSOystein Eftevaag static void
tpmt_marshal_success_offset(void ** state)75*758e9fbaSOystein Eftevaag tpmt_marshal_success_offset(void **state)
76*758e9fbaSOystein Eftevaag {
77*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
78*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS pub = {0};
79*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(pub) + 10] = { 0 };
80*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(buffer);
81*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION *ptr;
82*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY *ptr2;
83*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *ptr3;
84*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS *ptr4;
85*758e9fbaSOystein Eftevaag     TPMS_KEYEDHASH_PARMS *ptr5;
86*758e9fbaSOystein Eftevaag     size_t offset = 10;
87*758e9fbaSOystein Eftevaag     TSS2_RC rc;
88*758e9fbaSOystein Eftevaag 
89*758e9fbaSOystein Eftevaag     tkt.tag = 0xbeef;
90*758e9fbaSOystein Eftevaag     tkt.hierarchy = TPM2_RH_OWNER;
91*758e9fbaSOystein Eftevaag     tkt.digest.size = 4;
92*758e9fbaSOystein Eftevaag     tkt.digest.buffer[0] = 0xde;
93*758e9fbaSOystein Eftevaag     tkt.digest.buffer[1] = 0xad;
94*758e9fbaSOystein Eftevaag     tkt.digest.buffer[2] = 0xbe;
95*758e9fbaSOystein Eftevaag     tkt.digest.buffer[3] = 0xef;
96*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Marshal(&tkt, buffer, buffer_size, &offset);
97*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
98*758e9fbaSOystein Eftevaag 
99*758e9fbaSOystein Eftevaag     ptr = (TPMT_TK_CREATION *)(buffer + 10);
100*758e9fbaSOystein Eftevaag     ptr2 = (TPMI_RH_HIERARCHY *)(buffer + 10 + sizeof(tkt.tag));
101*758e9fbaSOystein Eftevaag     ptr3 = (TPM2B_DIGEST *)(buffer + 10 + sizeof(tkt.tag) + sizeof(tkt.hierarchy));
102*758e9fbaSOystein Eftevaag 
103*758e9fbaSOystein Eftevaag     assert_int_equal (ptr->tag, HOST_TO_BE_16(0xbeef));
104*758e9fbaSOystein Eftevaag     assert_int_equal (*ptr2, HOST_TO_BE_32(TPM2_RH_OWNER));
105*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->size, HOST_TO_BE_16(4));
106*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[0], 0xde);
107*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[1], 0xad);
108*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[2], 0xbe);
109*758e9fbaSOystein Eftevaag     assert_int_equal (ptr3->buffer[3], 0xef);
110*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10 + 2 + 4 + 2 + 1 + 1 + 1 + 1);
111*758e9fbaSOystein Eftevaag 
112*758e9fbaSOystein Eftevaag     offset = 10;
113*758e9fbaSOystein Eftevaag     pub.type = TPM2_ALG_KEYEDHASH;
114*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_HMAC;
115*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM2_ALG_SHA256;
116*758e9fbaSOystein Eftevaag 
117*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Marshal(&pub, buffer, buffer_size, &offset);
118*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
119*758e9fbaSOystein Eftevaag     ptr4 = (TPMT_PUBLIC_PARMS *)(buffer + 10);
120*758e9fbaSOystein Eftevaag     ptr5 = (TPMS_KEYEDHASH_PARMS *)(buffer + 10 + 2);
121*758e9fbaSOystein Eftevaag     assert_int_equal (ptr4->type, HOST_TO_BE_16(TPM2_ALG_KEYEDHASH));
122*758e9fbaSOystein Eftevaag     assert_int_equal (ptr5->scheme.scheme, HOST_TO_BE_16(TPM2_ALG_HMAC));
123*758e9fbaSOystein Eftevaag     assert_int_equal (ptr5->scheme.details.hmac.hashAlg, HOST_TO_BE_16(TPM2_ALG_SHA256));
124*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10 + 2 + 2 + 2);
125*758e9fbaSOystein Eftevaag }
126*758e9fbaSOystein Eftevaag 
127*758e9fbaSOystein Eftevaag /*
128*758e9fbaSOystein Eftevaag  * Success case with a null buffer
129*758e9fbaSOystein Eftevaag  */
130*758e9fbaSOystein Eftevaag static void
tpmt_marshal_buffer_null_with_offset(void ** state)131*758e9fbaSOystein Eftevaag tpmt_marshal_buffer_null_with_offset(void **state)
132*758e9fbaSOystein Eftevaag {
133*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
134*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS pub = {0};
135*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(tkt) + sizeof(pub) + 10;
136*758e9fbaSOystein Eftevaag     size_t offset = 10;
137*758e9fbaSOystein Eftevaag     TSS2_RC rc;
138*758e9fbaSOystein Eftevaag 
139*758e9fbaSOystein Eftevaag     tkt.tag = 0xbeef;
140*758e9fbaSOystein Eftevaag     tkt.hierarchy = TPM2_RH_OWNER;
141*758e9fbaSOystein Eftevaag     tkt.digest.size = 4;
142*758e9fbaSOystein Eftevaag     tkt.digest.buffer[0] = 0xde;
143*758e9fbaSOystein Eftevaag     tkt.digest.buffer[1] = 0xad;
144*758e9fbaSOystein Eftevaag     tkt.digest.buffer[2] = 0xbe;
145*758e9fbaSOystein Eftevaag     tkt.digest.buffer[3] = 0xef;
146*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Marshal(&tkt, NULL, buffer_size, &offset);
147*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
148*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10 + 2 + 4 + 2 + 1 + 1 + 1 + 1);
149*758e9fbaSOystein Eftevaag 
150*758e9fbaSOystein Eftevaag     offset = 10;
151*758e9fbaSOystein Eftevaag     pub.type = TPM2_ALG_KEYEDHASH;
152*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_HMAC;
153*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM2_ALG_SHA256;
154*758e9fbaSOystein Eftevaag 
155*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Marshal(&pub, NULL, buffer_size, &offset);
156*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
157*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10 + 2 + 2 + 2);
158*758e9fbaSOystein Eftevaag }
159*758e9fbaSOystein Eftevaag 
160*758e9fbaSOystein Eftevaag /*
161*758e9fbaSOystein Eftevaag  * Invalid case with a null buffer and a null offset
162*758e9fbaSOystein Eftevaag  */
163*758e9fbaSOystein Eftevaag static void
tpmt_marshal_buffer_null_offset_null(void ** state)164*758e9fbaSOystein Eftevaag tpmt_marshal_buffer_null_offset_null(void **state)
165*758e9fbaSOystein Eftevaag {
166*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
167*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS pub = {0};
168*758e9fbaSOystein Eftevaag     TSS2_RC rc;
169*758e9fbaSOystein Eftevaag 
170*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Marshal(&tkt, NULL, sizeof(tkt), NULL);
171*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
172*758e9fbaSOystein Eftevaag 
173*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Marshal(&pub, NULL, sizeof(pub), NULL);
174*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
175*758e9fbaSOystein Eftevaag }
176*758e9fbaSOystein Eftevaag 
177*758e9fbaSOystein Eftevaag /*
178*758e9fbaSOystein Eftevaag  * Invalid case with not big enough buffer
179*758e9fbaSOystein Eftevaag  */
180*758e9fbaSOystein Eftevaag static void
tpmt_marshal_buffer_size_lt_data_nad_lt_offset(void ** state)181*758e9fbaSOystein Eftevaag tpmt_marshal_buffer_size_lt_data_nad_lt_offset(void **state)
182*758e9fbaSOystein Eftevaag {
183*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
184*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS pub = {0};
185*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(pub) + 10] = { 0 };
186*758e9fbaSOystein Eftevaag     size_t offset = 10;
187*758e9fbaSOystein Eftevaag     TSS2_RC rc;
188*758e9fbaSOystein Eftevaag 
189*758e9fbaSOystein Eftevaag     tkt.tag = 0xbeef;
190*758e9fbaSOystein Eftevaag     tkt.hierarchy = TPM2_RH_OWNER;
191*758e9fbaSOystein Eftevaag     tkt.digest.size = 4;
192*758e9fbaSOystein Eftevaag     tkt.digest.buffer[0] = 0xde;
193*758e9fbaSOystein Eftevaag     tkt.digest.buffer[1] = 0xad;
194*758e9fbaSOystein Eftevaag     tkt.digest.buffer[2] = 0xbe;
195*758e9fbaSOystein Eftevaag     tkt.digest.buffer[3] = 0xef;
196*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Marshal(&tkt, buffer, 10, &offset);
197*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
198*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10);
199*758e9fbaSOystein Eftevaag 
200*758e9fbaSOystein Eftevaag     pub.type = TPM2_ALG_KEYEDHASH;
201*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_HMAC;
202*758e9fbaSOystein Eftevaag     pub.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM2_ALG_SHA256;
203*758e9fbaSOystein Eftevaag 
204*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Marshal(&pub, buffer, 8, &offset);
205*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
206*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 10);
207*758e9fbaSOystein Eftevaag }
208*758e9fbaSOystein Eftevaag 
209*758e9fbaSOystein Eftevaag /*
210*758e9fbaSOystein Eftevaag  * Success case
211*758e9fbaSOystein Eftevaag  */
212*758e9fbaSOystein Eftevaag static void
tpmt_unmarshal_success(void ** state)213*758e9fbaSOystein Eftevaag tpmt_unmarshal_success(void **state)
214*758e9fbaSOystein Eftevaag {
215*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt = {0};
216*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS pub = {0};
217*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(pub)] = { 0 };
218*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(buffer);
219*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION *ptr;
220*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY *ptr2;
221*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *ptr3;
222*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS *ptr4;
223*758e9fbaSOystein Eftevaag     TPMS_KEYEDHASH_PARMS *ptr5;
224*758e9fbaSOystein Eftevaag     size_t offset = 0;
225*758e9fbaSOystein Eftevaag     TSS2_RC rc;
226*758e9fbaSOystein Eftevaag 
227*758e9fbaSOystein Eftevaag     ptr = (TPMT_TK_CREATION *)(buffer);
228*758e9fbaSOystein Eftevaag     ptr2 = (TPMI_RH_HIERARCHY *)(buffer + sizeof(tkt.tag));
229*758e9fbaSOystein Eftevaag     ptr3 = (TPM2B_DIGEST *)(buffer + sizeof(tkt.tag) + sizeof(tkt.hierarchy));
230*758e9fbaSOystein Eftevaag 
231*758e9fbaSOystein Eftevaag     ptr->tag = HOST_TO_BE_16(0xbeef);
232*758e9fbaSOystein Eftevaag     *ptr2 = HOST_TO_BE_32(TPM2_RH_OWNER);
233*758e9fbaSOystein Eftevaag     ptr3->size = HOST_TO_BE_16(4);
234*758e9fbaSOystein Eftevaag     ptr3->buffer[0] = 0xde;
235*758e9fbaSOystein Eftevaag     ptr3->buffer[1] = 0xad;
236*758e9fbaSOystein Eftevaag     ptr3->buffer[2] = 0xbe;
237*758e9fbaSOystein Eftevaag     ptr3->buffer[3] = 0xef;
238*758e9fbaSOystein Eftevaag 
239*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Unmarshal(buffer, buffer_size, &offset, &tkt);
240*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
241*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.tag, 0xbeef);
242*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.hierarchy, TPM2_RH_OWNER);
243*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.digest.size, 4);
244*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.digest.buffer[0], 0xde);
245*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.digest.buffer[1], 0xad);
246*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.digest.buffer[2], 0xbe);
247*758e9fbaSOystein Eftevaag     assert_int_equal (tkt.digest.buffer[3], 0xef);
248*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 2 + 4 + 2 + 1 + 1 + 1 + 1);
249*758e9fbaSOystein Eftevaag 
250*758e9fbaSOystein Eftevaag     offset = 0;
251*758e9fbaSOystein Eftevaag     ptr4 = (TPMT_PUBLIC_PARMS *)(buffer);
252*758e9fbaSOystein Eftevaag     ptr5 = (TPMS_KEYEDHASH_PARMS *)(buffer + 2);
253*758e9fbaSOystein Eftevaag     ptr4->type = HOST_TO_BE_16(TPM2_ALG_KEYEDHASH);
254*758e9fbaSOystein Eftevaag     ptr5->scheme.scheme = HOST_TO_BE_16(TPM2_ALG_HMAC);
255*758e9fbaSOystein Eftevaag     ptr5->scheme.details.hmac.hashAlg = HOST_TO_BE_16(TPM2_ALG_SHA256);
256*758e9fbaSOystein Eftevaag 
257*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal(buffer, buffer_size, &offset, &pub);
258*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
259*758e9fbaSOystein Eftevaag     assert_int_equal (pub.type, TPM2_ALG_KEYEDHASH);
260*758e9fbaSOystein Eftevaag     assert_int_equal (pub.parameters.keyedHashDetail.scheme.scheme, TPM2_ALG_HMAC);
261*758e9fbaSOystein Eftevaag     assert_int_equal (pub.parameters.keyedHashDetail.scheme.details.hmac.hashAlg, TPM2_ALG_SHA256);
262*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 2 + 2 + 2);
263*758e9fbaSOystein Eftevaag }
264*758e9fbaSOystein Eftevaag 
265*758e9fbaSOystein Eftevaag /*
266*758e9fbaSOystein Eftevaag  * Invalid test case with buffer null and dest null
267*758e9fbaSOystein Eftevaag  */
268*758e9fbaSOystein Eftevaag static void
tpmt_unmarshal_dest_null_buff_null(void ** state)269*758e9fbaSOystein Eftevaag tpmt_unmarshal_dest_null_buff_null(void **state)
270*758e9fbaSOystein Eftevaag {
271*758e9fbaSOystein Eftevaag     size_t offset = 1;
272*758e9fbaSOystein Eftevaag     TSS2_RC rc;
273*758e9fbaSOystein Eftevaag 
274*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Unmarshal(NULL, 120, &offset, NULL);
275*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
276*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 1);
277*758e9fbaSOystein Eftevaag 
278*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal(NULL, 120, &offset, NULL);
279*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
280*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 1);
281*758e9fbaSOystein Eftevaag }
282*758e9fbaSOystein Eftevaag 
283*758e9fbaSOystein Eftevaag /*
284*758e9fbaSOystein Eftevaag  * Invalid test case with offset null and dest null
285*758e9fbaSOystein Eftevaag  */
286*758e9fbaSOystein Eftevaag static void
tpmt_unmarshal_buffer_null_offset_null(void ** state)287*758e9fbaSOystein Eftevaag tpmt_unmarshal_buffer_null_offset_null(void **state)
288*758e9fbaSOystein Eftevaag {
289*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(TPMT_TK_CREATION) + sizeof(TPMT_PUBLIC_PARMS)] = { 0 };
290*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(buffer);
291*758e9fbaSOystein Eftevaag     TSS2_RC rc;
292*758e9fbaSOystein Eftevaag 
293*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Unmarshal(buffer, buffer_size, NULL, NULL);
294*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
295*758e9fbaSOystein Eftevaag 
296*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal(buffer, buffer_size, NULL, NULL);
297*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
298*758e9fbaSOystein Eftevaag }
299*758e9fbaSOystein Eftevaag 
300*758e9fbaSOystein Eftevaag /*
301*758e9fbaSOystein Eftevaag  * Test case ensures the offset is updated when dest is NULL
302*758e9fbaSOystein Eftevaag  * and offset is valid
303*758e9fbaSOystein Eftevaag  */
304*758e9fbaSOystein Eftevaag static void
tpmt_unmarshal_dest_null_offset_valid(void ** state)305*758e9fbaSOystein Eftevaag tpmt_unmarshal_dest_null_offset_valid(void **state)
306*758e9fbaSOystein Eftevaag {
307*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt;
308*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(TPMT_PUBLIC_PARMS)] = { 0 };
309*758e9fbaSOystein Eftevaag     size_t  buffer_size = sizeof(buffer);
310*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION *ptr;
311*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY *ptr2;
312*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *ptr3;
313*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS *ptr4;
314*758e9fbaSOystein Eftevaag     TPMS_KEYEDHASH_PARMS *ptr5;
315*758e9fbaSOystein Eftevaag     size_t offset = 0;
316*758e9fbaSOystein Eftevaag     TSS2_RC rc;
317*758e9fbaSOystein Eftevaag 
318*758e9fbaSOystein Eftevaag     ptr = (TPMT_TK_CREATION *)(buffer);
319*758e9fbaSOystein Eftevaag     ptr2 = (TPMI_RH_HIERARCHY *)(buffer + sizeof(tkt.tag));
320*758e9fbaSOystein Eftevaag     ptr3 = (TPM2B_DIGEST *)(buffer + sizeof(tkt.tag) + sizeof(tkt.hierarchy));
321*758e9fbaSOystein Eftevaag 
322*758e9fbaSOystein Eftevaag     ptr->tag = HOST_TO_BE_16(0xbeef);
323*758e9fbaSOystein Eftevaag     *ptr2 = HOST_TO_BE_32(TPM2_RH_OWNER);
324*758e9fbaSOystein Eftevaag     ptr3->size = HOST_TO_BE_16(4);
325*758e9fbaSOystein Eftevaag     ptr3->buffer[0] = 0xde;
326*758e9fbaSOystein Eftevaag     ptr3->buffer[1] = 0xad;
327*758e9fbaSOystein Eftevaag     ptr3->buffer[2] = 0xbe;
328*758e9fbaSOystein Eftevaag     ptr3->buffer[3] = 0xef;
329*758e9fbaSOystein Eftevaag 
330*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Unmarshal(buffer, buffer_size, &offset, NULL);
331*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
332*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 2 + 4 + 2 + 1 + 1 + 1 + 1);
333*758e9fbaSOystein Eftevaag 
334*758e9fbaSOystein Eftevaag     offset = 0;
335*758e9fbaSOystein Eftevaag     ptr4 = (TPMT_PUBLIC_PARMS *)(buffer);
336*758e9fbaSOystein Eftevaag     ptr5 = (TPMS_KEYEDHASH_PARMS *)(buffer + 2);
337*758e9fbaSOystein Eftevaag     ptr4->type = HOST_TO_BE_16(TPM2_ALG_KEYEDHASH);
338*758e9fbaSOystein Eftevaag     ptr5->scheme.scheme = HOST_TO_BE_16(TPM2_ALG_HMAC);
339*758e9fbaSOystein Eftevaag     ptr5->scheme.details.hmac.hashAlg = HOST_TO_BE_16(TPM2_ALG_SHA256);
340*758e9fbaSOystein Eftevaag 
341*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal(buffer, buffer_size, &offset, NULL);
342*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_RC_SUCCESS);
343*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 2 + 2 + 2);
344*758e9fbaSOystein Eftevaag }
345*758e9fbaSOystein Eftevaag 
346*758e9fbaSOystein Eftevaag /*
347*758e9fbaSOystein Eftevaag  * Invalid case with not big enough buffer. Make sure offest is untouched.
348*758e9fbaSOystein Eftevaag  */
349*758e9fbaSOystein Eftevaag static void
tpmt_unmarshal_buffer_size_lt_data_nad_lt_offset(void ** state)350*758e9fbaSOystein Eftevaag tpmt_unmarshal_buffer_size_lt_data_nad_lt_offset(void **state)
351*758e9fbaSOystein Eftevaag {
352*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION tkt;
353*758e9fbaSOystein Eftevaag     uint8_t buffer[sizeof(tkt) + sizeof(TPMT_PUBLIC_PARMS)] = { 0 };
354*758e9fbaSOystein Eftevaag     TPMT_TK_CREATION *ptr;
355*758e9fbaSOystein Eftevaag     TPMI_RH_HIERARCHY *ptr2;
356*758e9fbaSOystein Eftevaag     TPM2B_DIGEST *ptr3;
357*758e9fbaSOystein Eftevaag     TPMT_PUBLIC_PARMS *ptr4;
358*758e9fbaSOystein Eftevaag     TPMS_KEYEDHASH_PARMS *ptr5;
359*758e9fbaSOystein Eftevaag     size_t offset = 5;
360*758e9fbaSOystein Eftevaag     TSS2_RC rc;
361*758e9fbaSOystein Eftevaag 
362*758e9fbaSOystein Eftevaag     ptr = (TPMT_TK_CREATION *)(buffer);
363*758e9fbaSOystein Eftevaag     ptr2 = (TPMI_RH_HIERARCHY *)(buffer + sizeof(tkt.tag));
364*758e9fbaSOystein Eftevaag     ptr3 = (TPM2B_DIGEST *)(buffer + sizeof(tkt.tag) + sizeof(tkt.hierarchy));
365*758e9fbaSOystein Eftevaag 
366*758e9fbaSOystein Eftevaag     ptr->tag = HOST_TO_BE_16(0xbeef);
367*758e9fbaSOystein Eftevaag     *ptr2 = HOST_TO_BE_32(TPM2_RH_OWNER);
368*758e9fbaSOystein Eftevaag     ptr3->size = HOST_TO_BE_16(4);
369*758e9fbaSOystein Eftevaag     ptr3->buffer[0] = 0xde;
370*758e9fbaSOystein Eftevaag     ptr3->buffer[1] = 0xad;
371*758e9fbaSOystein Eftevaag     ptr3->buffer[2] = 0xbe;
372*758e9fbaSOystein Eftevaag     ptr3->buffer[3] = 0xef;
373*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_TK_CREATION_Unmarshal(buffer, 15, &offset, NULL);
374*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
375*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 5);
376*758e9fbaSOystein Eftevaag 
377*758e9fbaSOystein Eftevaag     offset = 5;
378*758e9fbaSOystein Eftevaag     ptr4 = (TPMT_PUBLIC_PARMS *)(buffer);
379*758e9fbaSOystein Eftevaag     ptr5 = (TPMS_KEYEDHASH_PARMS *)(buffer + 2);
380*758e9fbaSOystein Eftevaag     ptr4->type = HOST_TO_BE_16(TPM2_ALG_KEYEDHASH);
381*758e9fbaSOystein Eftevaag     ptr5->scheme.scheme = HOST_TO_BE_16(TPM2_ALG_HMAC);
382*758e9fbaSOystein Eftevaag     ptr5->scheme.details.hmac.hashAlg = HOST_TO_BE_16(TPM2_ALG_SHA256);
383*758e9fbaSOystein Eftevaag 
384*758e9fbaSOystein Eftevaag     rc = Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal(buffer, 6, &offset, NULL);
385*758e9fbaSOystein Eftevaag     assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
386*758e9fbaSOystein Eftevaag     assert_int_equal (offset, 5);
387*758e9fbaSOystein Eftevaag }
388*758e9fbaSOystein Eftevaag 
main(void)389*758e9fbaSOystein Eftevaag int main(void) {
390*758e9fbaSOystein Eftevaag     const struct CMUnitTest tests[] = {
391*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_marshal_success),
392*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_marshal_success_offset),
393*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_marshal_buffer_null_with_offset),
394*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_marshal_buffer_null_offset_null),
395*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_marshal_buffer_size_lt_data_nad_lt_offset),
396*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_unmarshal_success),
397*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_unmarshal_dest_null_buff_null),
398*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_unmarshal_buffer_null_offset_null),
399*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_unmarshal_dest_null_offset_valid),
400*758e9fbaSOystein Eftevaag         cmocka_unit_test (tpmt_unmarshal_buffer_size_lt_data_nad_lt_offset),
401*758e9fbaSOystein Eftevaag     };
402*758e9fbaSOystein Eftevaag     return cmocka_run_group_tests(tests, NULL, NULL);
403*758e9fbaSOystein Eftevaag }
404