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 <string.h>
14*758e9fbaSOystein Eftevaag #include <setjmp.h>
15*758e9fbaSOystein Eftevaag #include <cmocka.h>
16*758e9fbaSOystein Eftevaag #include <stdio.h>
17*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
18*758e9fbaSOystein Eftevaag #include "util/tss2_endian.h"
19*758e9fbaSOystein Eftevaag
20*758e9fbaSOystein Eftevaag /*
21*758e9fbaSOystein Eftevaag * Success case
22*758e9fbaSOystein Eftevaag */
23*758e9fbaSOystein Eftevaag static void
tpmu_marshal_success(void ** state)24*758e9fbaSOystein Eftevaag tpmu_marshal_success(void **state)
25*758e9fbaSOystein Eftevaag {
26*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
27*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
28*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
29*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(buffer);
30*758e9fbaSOystein Eftevaag TPMS_SIGNATURE_ECDSA *ptr;
31*758e9fbaSOystein Eftevaag TPM2B_ECC_PARAMETER *ptr2;
32*758e9fbaSOystein Eftevaag TSS2_RC rc;
33*758e9fbaSOystein Eftevaag
34*758e9fbaSOystein Eftevaag memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
35*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, buffer_size, NULL);
36*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
37*758e9fbaSOystein Eftevaag assert_int_equal (memcmp(buffer, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
38*758e9fbaSOystein Eftevaag
39*758e9fbaSOystein Eftevaag sig.ecdsa.hash = TPM2_ALG_SHA1;
40*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.size = 4;
41*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[0] = 'a';
42*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[1] = 'b';
43*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[2] = 'c';
44*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[3] = 'd';
45*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.size = 4;
46*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[0] = 'e';
47*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[1] = 'd';
48*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[2] = 'f';
49*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[3] = 'g';
50*758e9fbaSOystein Eftevaag
51*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, buffer_size, NULL);
52*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
53*758e9fbaSOystein Eftevaag ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
54*758e9fbaSOystein Eftevaag assert_int_equal (ptr->hash, HOST_TO_BE_16(TPM2_ALG_SHA1));
55*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.size, HOST_TO_BE_16(4));
56*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[0], 'a');
57*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[1], 'b');
58*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[2], 'c');
59*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[3], 'd');
60*758e9fbaSOystein Eftevaag ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
61*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->size, HOST_TO_BE_16(4));
62*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[0], 'e');
63*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[1], 'd');
64*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[2], 'f');
65*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[3], 'g');
66*758e9fbaSOystein Eftevaag
67*758e9fbaSOystein Eftevaag }
68*758e9fbaSOystein Eftevaag /*
69*758e9fbaSOystein Eftevaag * Success case with a valid offset
70*758e9fbaSOystein Eftevaag */
71*758e9fbaSOystein Eftevaag static void
tpmu_marshal_success_offset(void ** state)72*758e9fbaSOystein Eftevaag tpmu_marshal_success_offset(void **state)
73*758e9fbaSOystein Eftevaag {
74*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
75*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
76*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(ha) + sizeof(sig) + 10] = { 0 };
77*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(buffer);
78*758e9fbaSOystein Eftevaag TPMS_SIGNATURE_ECDSA *ptr;
79*758e9fbaSOystein Eftevaag TPM2B_ECC_PARAMETER *ptr2;
80*758e9fbaSOystein Eftevaag size_t offset = 10;
81*758e9fbaSOystein Eftevaag TSS2_RC rc;
82*758e9fbaSOystein Eftevaag
83*758e9fbaSOystein Eftevaag memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
84*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, buffer_size, &offset);
85*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
86*758e9fbaSOystein Eftevaag assert_int_equal (memcmp(buffer + 10, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
87*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE);
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag sig.ecdsa.hash = TPM2_ALG_SHA1;
90*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.size = 4;
91*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[0] = 'a';
92*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[1] = 'b';
93*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[2] = 'c';
94*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[3] = 'd';
95*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.size = 4;
96*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[0] = 'e';
97*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[1] = 'd';
98*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[2] = 'f';
99*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[3] = 'g';
100*758e9fbaSOystein Eftevaag
101*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, buffer_size, &offset);
102*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
103*758e9fbaSOystein Eftevaag ptr = (TPMS_SIGNATURE_ECDSA *) (buffer + 10 + TPM2_SHA512_DIGEST_SIZE);
104*758e9fbaSOystein Eftevaag assert_int_equal (ptr->hash, HOST_TO_BE_16(TPM2_ALG_SHA1));
105*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.size, HOST_TO_BE_16(4));
106*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[0], 'a');
107*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[1], 'b');
108*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[2], 'c');
109*758e9fbaSOystein Eftevaag assert_int_equal (ptr->signatureR.buffer[3], 'd');
110*758e9fbaSOystein Eftevaag ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 10 + TPM2_SHA512_DIGEST_SIZE + 8);
111*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->size, HOST_TO_BE_16(4));
112*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[0], 'e');
113*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[1], 'd');
114*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[2], 'f');
115*758e9fbaSOystein Eftevaag assert_int_equal (ptr2->buffer[3], 'g');
116*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE + 2 + ((2 + 1 + 1 + 1 + 1) * 2));
117*758e9fbaSOystein Eftevaag }
118*758e9fbaSOystein Eftevaag
119*758e9fbaSOystein Eftevaag /*
120*758e9fbaSOystein Eftevaag * Success case with a null buffer
121*758e9fbaSOystein Eftevaag */
122*758e9fbaSOystein Eftevaag static void
tpmu_marshal_buffer_null_with_offset(void ** state)123*758e9fbaSOystein Eftevaag tpmu_marshal_buffer_null_with_offset(void **state)
124*758e9fbaSOystein Eftevaag {
125*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
126*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
127*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(ha) + sizeof(sig) + 10;
128*758e9fbaSOystein Eftevaag size_t offset = 10;
129*758e9fbaSOystein Eftevaag TSS2_RC rc;
130*758e9fbaSOystein Eftevaag
131*758e9fbaSOystein Eftevaag memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
132*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, NULL, buffer_size, &offset);
133*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
134*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE);
135*758e9fbaSOystein Eftevaag
136*758e9fbaSOystein Eftevaag sig.ecdsa.hash = TPM2_ALG_SHA1;
137*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.size = 4;
138*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[0] = 'a';
139*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[1] = 'b';
140*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[2] = 'c';
141*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[3] = 'd';
142*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.size = 4;
143*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[0] = 'e';
144*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[1] = 'd';
145*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[2] = 'f';
146*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[3] = 'g';
147*758e9fbaSOystein Eftevaag
148*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, NULL, buffer_size, &offset);
149*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
150*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE + 2 + ((2 + 1 + 1 + 1 + 1) * 2));
151*758e9fbaSOystein Eftevaag }
152*758e9fbaSOystein Eftevaag
153*758e9fbaSOystein Eftevaag /*
154*758e9fbaSOystein Eftevaag * Invalid case with a null buffer and a null offset
155*758e9fbaSOystein Eftevaag */
156*758e9fbaSOystein Eftevaag static void
tpmu_marshal_buffer_null_offset_null(void ** state)157*758e9fbaSOystein Eftevaag tpmu_marshal_buffer_null_offset_null(void **state)
158*758e9fbaSOystein Eftevaag {
159*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
160*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
161*758e9fbaSOystein Eftevaag TSS2_RC rc;
162*758e9fbaSOystein Eftevaag
163*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, NULL, sizeof(ha), NULL);
164*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
165*758e9fbaSOystein Eftevaag
166*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, NULL, sizeof(sig), NULL);
167*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
168*758e9fbaSOystein Eftevaag }
169*758e9fbaSOystein Eftevaag
170*758e9fbaSOystein Eftevaag /*
171*758e9fbaSOystein Eftevaag * Invalid case with not big enough buffer
172*758e9fbaSOystein Eftevaag */
173*758e9fbaSOystein Eftevaag static void
tpmu_marshal_buffer_size_lt_data_nad_lt_offset(void ** state)174*758e9fbaSOystein Eftevaag tpmu_marshal_buffer_size_lt_data_nad_lt_offset(void **state)
175*758e9fbaSOystein Eftevaag {
176*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
177*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
178*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(ha) + sizeof(sig) + 10] = { 0 };
179*758e9fbaSOystein Eftevaag size_t offset = 10;
180*758e9fbaSOystein Eftevaag TSS2_RC rc;
181*758e9fbaSOystein Eftevaag
182*758e9fbaSOystein Eftevaag memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
183*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, TPM2_SHA512_DIGEST_SIZE - 1, &offset);
184*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
185*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10);
186*758e9fbaSOystein Eftevaag
187*758e9fbaSOystein Eftevaag sig.ecdsa.hash = TPM2_ALG_SHA1;
188*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.size = 4;
189*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[0] = 'a';
190*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[1] = 'b';
191*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[2] = 'c';
192*758e9fbaSOystein Eftevaag sig.ecdsa.signatureR.buffer[3] = 'd';
193*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.size = 4;
194*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[0] = 'e';
195*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[1] = 'd';
196*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[2] = 'f';
197*758e9fbaSOystein Eftevaag sig.ecdsa.signatureS.buffer[3] = 'g';
198*758e9fbaSOystein Eftevaag
199*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, 12, &offset);
200*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
201*758e9fbaSOystein Eftevaag assert_int_equal (offset, 10);
202*758e9fbaSOystein Eftevaag }
203*758e9fbaSOystein Eftevaag
204*758e9fbaSOystein Eftevaag /*
205*758e9fbaSOystein Eftevaag * Success case
206*758e9fbaSOystein Eftevaag */
207*758e9fbaSOystein Eftevaag static void
tpmu_unmarshal_success(void ** state)208*758e9fbaSOystein Eftevaag tpmu_unmarshal_success(void **state)
209*758e9fbaSOystein Eftevaag {
210*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
211*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
212*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
213*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(buffer);
214*758e9fbaSOystein Eftevaag TPMS_SIGNATURE_ECDSA *ptr;
215*758e9fbaSOystein Eftevaag TPM2B_ECC_PARAMETER *ptr2;
216*758e9fbaSOystein Eftevaag size_t offset = 0;
217*758e9fbaSOystein Eftevaag TSS2_RC rc;
218*758e9fbaSOystein Eftevaag
219*758e9fbaSOystein Eftevaag memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
220*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_SHA512, &ha);
221*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
222*758e9fbaSOystein Eftevaag assert_int_equal (offset, TPM2_SHA512_DIGEST_SIZE);
223*758e9fbaSOystein Eftevaag assert_int_equal (memcmp(buffer, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
224*758e9fbaSOystein Eftevaag
225*758e9fbaSOystein Eftevaag offset = 0;
226*758e9fbaSOystein Eftevaag ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
227*758e9fbaSOystein Eftevaag ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
228*758e9fbaSOystein Eftevaag ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
229*758e9fbaSOystein Eftevaag ptr->signatureR.size = HOST_TO_BE_16(4);
230*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[0] = 'a';
231*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[1] = 'b';
232*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[2] = 'c';
233*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[3] = 'd';
234*758e9fbaSOystein Eftevaag ptr2->size = HOST_TO_BE_16(4);
235*758e9fbaSOystein Eftevaag ptr2->buffer[0] = 'e';
236*758e9fbaSOystein Eftevaag ptr2->buffer[1] = 'd';
237*758e9fbaSOystein Eftevaag ptr2->buffer[2] = 'f';
238*758e9fbaSOystein Eftevaag ptr2->buffer[3] = 'g';
239*758e9fbaSOystein Eftevaag
240*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_ECDSA, &sig);
241*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
242*758e9fbaSOystein Eftevaag assert_int_equal (offset, 14);
243*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.hash, TPM2_ALG_SHA1);
244*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureR.size, 4);
245*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureR.buffer[0], 'a');
246*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureR.buffer[1], 'b');
247*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureR.buffer[2], 'c');
248*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureR.buffer[3], 'd');
249*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureS.size, 4);
250*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureS.buffer[0], 'e');
251*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureS.buffer[1], 'd');
252*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureS.buffer[2], 'f');
253*758e9fbaSOystein Eftevaag assert_int_equal (sig.ecdsa.signatureS.buffer[3], 'g');
254*758e9fbaSOystein Eftevaag }
255*758e9fbaSOystein Eftevaag
256*758e9fbaSOystein Eftevaag /*
257*758e9fbaSOystein Eftevaag * Invalid test case with buffer null and dest null
258*758e9fbaSOystein Eftevaag */
259*758e9fbaSOystein Eftevaag static void
tpmu_unmarshal_dest_null_buff_null(void ** state)260*758e9fbaSOystein Eftevaag tpmu_unmarshal_dest_null_buff_null(void **state)
261*758e9fbaSOystein Eftevaag {
262*758e9fbaSOystein Eftevaag size_t offset = 1;
263*758e9fbaSOystein Eftevaag TSS2_RC rc;
264*758e9fbaSOystein Eftevaag
265*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Unmarshal(NULL, TPM2_SHA512_DIGEST_SIZE, &offset, TPM2_ALG_SHA512, NULL);
266*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
267*758e9fbaSOystein Eftevaag assert_int_equal (offset, 1);
268*758e9fbaSOystein Eftevaag
269*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(NULL, 32, &offset, TPM2_ALG_ECDSA, NULL);
270*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
271*758e9fbaSOystein Eftevaag assert_int_equal (offset, 1);
272*758e9fbaSOystein Eftevaag }
273*758e9fbaSOystein Eftevaag
274*758e9fbaSOystein Eftevaag /*
275*758e9fbaSOystein Eftevaag * Invalid test case with offset null and dest null
276*758e9fbaSOystein Eftevaag */
277*758e9fbaSOystein Eftevaag static void
tpmu_unmarshal_buffer_null_offset_null(void ** state)278*758e9fbaSOystein Eftevaag tpmu_unmarshal_buffer_null_offset_null(void **state)
279*758e9fbaSOystein Eftevaag {
280*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(TPMU_HA) + sizeof(TPMU_SIGNATURE)] = { 0 };
281*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(buffer);
282*758e9fbaSOystein Eftevaag TSS2_RC rc;
283*758e9fbaSOystein Eftevaag
284*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, NULL, TPM2_ALG_SHA512, NULL);
285*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
286*758e9fbaSOystein Eftevaag
287*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, NULL, TPM2_ALG_ECDSA, NULL);
288*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
289*758e9fbaSOystein Eftevaag }
290*758e9fbaSOystein Eftevaag
291*758e9fbaSOystein Eftevaag /*
292*758e9fbaSOystein Eftevaag * Test case ensures the offset is updated when dest is NULL
293*758e9fbaSOystein Eftevaag * and offset is valid
294*758e9fbaSOystein Eftevaag */
295*758e9fbaSOystein Eftevaag static void
tpmu_unmarshal_dest_null_offset_valid(void ** state)296*758e9fbaSOystein Eftevaag tpmu_unmarshal_dest_null_offset_valid(void **state)
297*758e9fbaSOystein Eftevaag {
298*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(TPMU_HA) + sizeof(TPMU_SIGNATURE)] = { 0 };
299*758e9fbaSOystein Eftevaag size_t buffer_size = sizeof(buffer);
300*758e9fbaSOystein Eftevaag TPMS_SIGNATURE_ECDSA *ptr;
301*758e9fbaSOystein Eftevaag TPM2B_ECC_PARAMETER *ptr2;
302*758e9fbaSOystein Eftevaag size_t offset = 0;
303*758e9fbaSOystein Eftevaag TSS2_RC rc;
304*758e9fbaSOystein Eftevaag
305*758e9fbaSOystein Eftevaag memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
306*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_SHA512, NULL);
307*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
308*758e9fbaSOystein Eftevaag assert_int_equal (offset, TPM2_SHA512_DIGEST_SIZE);
309*758e9fbaSOystein Eftevaag
310*758e9fbaSOystein Eftevaag offset = 0;
311*758e9fbaSOystein Eftevaag ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
312*758e9fbaSOystein Eftevaag ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
313*758e9fbaSOystein Eftevaag ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
314*758e9fbaSOystein Eftevaag ptr->signatureR.size = HOST_TO_BE_16(4);
315*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[0] = 'a';
316*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[1] = 'b';
317*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[2] = 'c';
318*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[3] = 'd';
319*758e9fbaSOystein Eftevaag ptr2->size = HOST_TO_BE_16(4);
320*758e9fbaSOystein Eftevaag ptr2->buffer[0] = 'e';
321*758e9fbaSOystein Eftevaag ptr2->buffer[1] = 'd';
322*758e9fbaSOystein Eftevaag ptr2->buffer[2] = 'f';
323*758e9fbaSOystein Eftevaag ptr2->buffer[3] = 'g';
324*758e9fbaSOystein Eftevaag
325*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_ECDSA, NULL);
326*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
327*758e9fbaSOystein Eftevaag assert_int_equal (offset, 14);
328*758e9fbaSOystein Eftevaag }
329*758e9fbaSOystein Eftevaag
330*758e9fbaSOystein Eftevaag /*
331*758e9fbaSOystein Eftevaag * Invalid case with not big enough buffer. Make sure offest is untouched.
332*758e9fbaSOystein Eftevaag */
333*758e9fbaSOystein Eftevaag static void
tpmu_unmarshal_buffer_size_lt_data_nad_lt_offset(void ** state)334*758e9fbaSOystein Eftevaag tpmu_unmarshal_buffer_size_lt_data_nad_lt_offset(void **state)
335*758e9fbaSOystein Eftevaag {
336*758e9fbaSOystein Eftevaag TPMU_HA ha = {0};
337*758e9fbaSOystein Eftevaag TPMU_SIGNATURE sig = {0};
338*758e9fbaSOystein Eftevaag uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
339*758e9fbaSOystein Eftevaag TPMS_SIGNATURE_ECDSA *ptr;
340*758e9fbaSOystein Eftevaag TPM2B_ECC_PARAMETER *ptr2;
341*758e9fbaSOystein Eftevaag size_t offset = 5;
342*758e9fbaSOystein Eftevaag TSS2_RC rc;
343*758e9fbaSOystein Eftevaag
344*758e9fbaSOystein Eftevaag memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
345*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, TPM2_SHA512_DIGEST_SIZE - 1, &offset, TPM2_ALG_SHA512, &ha);
346*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
347*758e9fbaSOystein Eftevaag assert_int_equal (offset, 5);
348*758e9fbaSOystein Eftevaag
349*758e9fbaSOystein Eftevaag ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
350*758e9fbaSOystein Eftevaag ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
351*758e9fbaSOystein Eftevaag ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
352*758e9fbaSOystein Eftevaag ptr->signatureR.size = HOST_TO_BE_16(4);
353*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[0] = 'a';
354*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[1] = 'b';
355*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[2] = 'c';
356*758e9fbaSOystein Eftevaag ptr->signatureR.buffer[3] = 'd';
357*758e9fbaSOystein Eftevaag ptr2->size = HOST_TO_BE_16(4);
358*758e9fbaSOystein Eftevaag ptr2->buffer[0] = 'e';
359*758e9fbaSOystein Eftevaag ptr2->buffer[1] = 'd';
360*758e9fbaSOystein Eftevaag ptr2->buffer[2] = 'f';
361*758e9fbaSOystein Eftevaag ptr2->buffer[3] = 'g';
362*758e9fbaSOystein Eftevaag
363*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, 14, &offset, TPM2_ALG_ECDSA, &sig);
364*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
365*758e9fbaSOystein Eftevaag assert_int_equal (offset, 5);
366*758e9fbaSOystein Eftevaag }
367*758e9fbaSOystein Eftevaag
368*758e9fbaSOystein Eftevaag static void
tpmu_name_marshal(void ** state)369*758e9fbaSOystein Eftevaag tpmu_name_marshal(void **state)
370*758e9fbaSOystein Eftevaag {
371*758e9fbaSOystein Eftevaag TPMU_NAME name = {0};
372*758e9fbaSOystein Eftevaag TPMT_HA ha = {0};
373*758e9fbaSOystein Eftevaag uint8_t buf[256] = {0};
374*758e9fbaSOystein Eftevaag TPM2_HANDLE hdl = TPM2_RS_PW;
375*758e9fbaSOystein Eftevaag TPM2_HANDLE hdl_expected = HOST_TO_BE_32(TPM2_RS_PW);
376*758e9fbaSOystein Eftevaag TPM2_ALG_ID id_expected = HOST_TO_BE_16(TPM2_ALG_SHA1);
377*758e9fbaSOystein Eftevaag size_t size = sizeof(hdl), offset = 0;
378*758e9fbaSOystein Eftevaag const char digest[] = {0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x01, 0x02,
379*758e9fbaSOystein Eftevaag 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
380*758e9fbaSOystein Eftevaag 0x10, 0x11, 0x12, 0x13, 0x14};
381*758e9fbaSOystein Eftevaag TPM2_RC rc;
382*758e9fbaSOystein Eftevaag
383*758e9fbaSOystein Eftevaag /* Handle case */
384*758e9fbaSOystein Eftevaag size = sizeof(hdl);
385*758e9fbaSOystein Eftevaag name.handle = hdl;
386*758e9fbaSOystein Eftevaag
387*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_NAME_Marshal(&name, size, buf, sizeof(hdl), &offset);
388*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
389*758e9fbaSOystein Eftevaag assert_int_equal (offset, sizeof(hdl));
390*758e9fbaSOystein Eftevaag assert_memory_equal ((void *) buf, &hdl_expected, sizeof(hdl));
391*758e9fbaSOystein Eftevaag
392*758e9fbaSOystein Eftevaag /* Digest case */
393*758e9fbaSOystein Eftevaag offset = 0;
394*758e9fbaSOystein Eftevaag size = sizeof(TPM2_ALG_ID) + TPM2_SHA1_DIGEST_SIZE;
395*758e9fbaSOystein Eftevaag ha.hashAlg = TPM2_ALG_SHA1;
396*758e9fbaSOystein Eftevaag memcpy(&ha.digest, digest, TPM2_SHA1_DIGEST_SIZE);
397*758e9fbaSOystein Eftevaag memcpy(&name.digest, &ha, sizeof(ha));
398*758e9fbaSOystein Eftevaag rc = Tss2_MU_TPMU_NAME_Marshal(&name, size, buf, TPM2_SHA1_DIGEST_SIZE + 2, &offset);
399*758e9fbaSOystein Eftevaag assert_int_equal (rc, TSS2_RC_SUCCESS);
400*758e9fbaSOystein Eftevaag assert_int_equal (offset, TPM2_SHA1_DIGEST_SIZE + 2);
401*758e9fbaSOystein Eftevaag assert_memory_equal (buf, &id_expected, sizeof(TPM2_ALG_ID));
402*758e9fbaSOystein Eftevaag assert_memory_equal (buf + 2, digest, TPM2_SHA1_DIGEST_SIZE);
403*758e9fbaSOystein Eftevaag }
404*758e9fbaSOystein Eftevaag
main(void)405*758e9fbaSOystein Eftevaag int main(void) {
406*758e9fbaSOystein Eftevaag const struct CMUnitTest tests[] = {
407*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_marshal_success),
408*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_marshal_success_offset),
409*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_marshal_buffer_null_with_offset),
410*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_marshal_buffer_null_offset_null),
411*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_marshal_buffer_size_lt_data_nad_lt_offset),
412*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_unmarshal_success),
413*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_unmarshal_dest_null_buff_null),
414*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_unmarshal_buffer_null_offset_null),
415*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_unmarshal_dest_null_offset_valid),
416*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_unmarshal_buffer_size_lt_data_nad_lt_offset),
417*758e9fbaSOystein Eftevaag cmocka_unit_test (tpmu_name_marshal),
418*758e9fbaSOystein Eftevaag };
419*758e9fbaSOystein Eftevaag return cmocka_run_group_tests(tests, NULL, NULL);
420*758e9fbaSOystein Eftevaag }
421