blob: ffbda892754b7da1de26f270f65b8b2176cd81ee [file] [log] [blame]
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -07001#include <stdarg.h>
2#include <stddef.h>
Philip Tricca5c17d232018-03-07 17:35:38 -08003#include <string.h>
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -07004#include <setjmp.h>
5#include <cmocka.h>
6#include <stdio.h>
Philip Tricca8ffd3c42018-03-09 16:27:24 -08007#include "tss2_mu.h"
Philip Triccaa7c51ce2018-03-10 18:28:25 -08008#include "util/tss2_endian.h"
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -07009
10/*
11 * Success case
12 */
13static void
14tpmu_marshal_success(void **state)
15{
16 TPMU_HA ha = {0};
17 TPMU_SIGNATURE sig = {0};
18 uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
19 size_t buffer_size = sizeof(buffer);
20 TPMS_SIGNATURE_ECDSA *ptr;
21 TPM2B_ECC_PARAMETER *ptr2;
22 TSS2_RC rc;
23
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010024 memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
25 rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, buffer_size, NULL);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070026 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010027 assert_int_equal (memcmp(buffer, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070028
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010029 sig.ecdsa.hash = TPM2_ALG_SHA1;
Tadeusz Struka64c33e2017-11-01 16:12:10 -070030 sig.ecdsa.signatureR.size = 4;
31 sig.ecdsa.signatureR.buffer[0] = 'a';
32 sig.ecdsa.signatureR.buffer[1] = 'b';
33 sig.ecdsa.signatureR.buffer[2] = 'c';
34 sig.ecdsa.signatureR.buffer[3] = 'd';
35 sig.ecdsa.signatureS.size = 4;
36 sig.ecdsa.signatureS.buffer[0] = 'e';
37 sig.ecdsa.signatureS.buffer[1] = 'd';
38 sig.ecdsa.signatureS.buffer[2] = 'f';
39 sig.ecdsa.signatureS.buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070040
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010041 rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, buffer_size, NULL);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070042 assert_int_equal (rc, TSS2_RC_SUCCESS);
43 ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010044 assert_int_equal (ptr->hash, HOST_TO_BE_16(TPM2_ALG_SHA1));
Tadeusz Struka64c33e2017-11-01 16:12:10 -070045 assert_int_equal (ptr->signatureR.size, HOST_TO_BE_16(4));
46 assert_int_equal (ptr->signatureR.buffer[0], 'a');
47 assert_int_equal (ptr->signatureR.buffer[1], 'b');
48 assert_int_equal (ptr->signatureR.buffer[2], 'c');
49 assert_int_equal (ptr->signatureR.buffer[3], 'd');
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070050 ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
Tadeusz Struka64c33e2017-11-01 16:12:10 -070051 assert_int_equal (ptr2->size, HOST_TO_BE_16(4));
52 assert_int_equal (ptr2->buffer[0], 'e');
53 assert_int_equal (ptr2->buffer[1], 'd');
54 assert_int_equal (ptr2->buffer[2], 'f');
55 assert_int_equal (ptr2->buffer[3], 'g');
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070056
57}
58/*
59 * Success case with a valid offset
60 */
61static void
62tpmu_marshal_success_offset(void **state)
63{
64 TPMU_HA ha = {0};
65 TPMU_SIGNATURE sig = {0};
66 uint8_t buffer[sizeof(ha) + sizeof(sig) + 10] = { 0 };
67 size_t buffer_size = sizeof(buffer);
68 TPMS_SIGNATURE_ECDSA *ptr;
69 TPM2B_ECC_PARAMETER *ptr2;
70 size_t offset = 10;
71 TSS2_RC rc;
72
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010073 memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
74 rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, buffer_size, &offset);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070075 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010076 assert_int_equal (memcmp(buffer + 10, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
77 assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070078
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010079 sig.ecdsa.hash = TPM2_ALG_SHA1;
Tadeusz Struka64c33e2017-11-01 16:12:10 -070080 sig.ecdsa.signatureR.size = 4;
81 sig.ecdsa.signatureR.buffer[0] = 'a';
82 sig.ecdsa.signatureR.buffer[1] = 'b';
83 sig.ecdsa.signatureR.buffer[2] = 'c';
84 sig.ecdsa.signatureR.buffer[3] = 'd';
85 sig.ecdsa.signatureS.size = 4;
86 sig.ecdsa.signatureS.buffer[0] = 'e';
87 sig.ecdsa.signatureS.buffer[1] = 'd';
88 sig.ecdsa.signatureS.buffer[2] = 'f';
89 sig.ecdsa.signatureS.buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070090
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010091 rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, buffer_size, &offset);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -070092 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +010093 ptr = (TPMS_SIGNATURE_ECDSA *) (buffer + 10 + TPM2_SHA512_DIGEST_SIZE);
94 assert_int_equal (ptr->hash, HOST_TO_BE_16(TPM2_ALG_SHA1));
Tadeusz Struka64c33e2017-11-01 16:12:10 -070095 assert_int_equal (ptr->signatureR.size, HOST_TO_BE_16(4));
96 assert_int_equal (ptr->signatureR.buffer[0], 'a');
97 assert_int_equal (ptr->signatureR.buffer[1], 'b');
98 assert_int_equal (ptr->signatureR.buffer[2], 'c');
99 assert_int_equal (ptr->signatureR.buffer[3], 'd');
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100100 ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 10 + TPM2_SHA512_DIGEST_SIZE + 8);
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700101 assert_int_equal (ptr2->size, HOST_TO_BE_16(4));
102 assert_int_equal (ptr2->buffer[0], 'e');
103 assert_int_equal (ptr2->buffer[1], 'd');
104 assert_int_equal (ptr2->buffer[2], 'f');
105 assert_int_equal (ptr2->buffer[3], 'g');
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100106 assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE + 2 + ((2 + 1 + 1 + 1 + 1) * 2));
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700107}
108
109/*
110 * Success case with a null buffer
111 */
112static void
113tpmu_marshal_buffer_null_with_offset(void **state)
114{
115 TPMU_HA ha = {0};
116 TPMU_SIGNATURE sig = {0};
Andreas Fuchsa71dfd02017-11-29 14:55:28 +0100117 size_t buffer_size = sizeof(ha) + sizeof(sig) + 10;
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700118 size_t offset = 10;
119 TSS2_RC rc;
120
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100121 memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
122 rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, NULL, buffer_size, &offset);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700123 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100124 assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700125
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100126 sig.ecdsa.hash = TPM2_ALG_SHA1;
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700127 sig.ecdsa.signatureR.size = 4;
128 sig.ecdsa.signatureR.buffer[0] = 'a';
129 sig.ecdsa.signatureR.buffer[1] = 'b';
130 sig.ecdsa.signatureR.buffer[2] = 'c';
131 sig.ecdsa.signatureR.buffer[3] = 'd';
132 sig.ecdsa.signatureS.size = 4;
133 sig.ecdsa.signatureS.buffer[0] = 'e';
134 sig.ecdsa.signatureS.buffer[1] = 'd';
135 sig.ecdsa.signatureS.buffer[2] = 'f';
136 sig.ecdsa.signatureS.buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700137
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100138 rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, NULL, buffer_size, &offset);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700139 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100140 assert_int_equal (offset, 10 + TPM2_SHA512_DIGEST_SIZE + 2 + ((2 + 1 + 1 + 1 + 1) * 2));
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700141}
142
143/*
144 * Invalid case with a null buffer and a null offset
145 */
146static void
147tpmu_marshal_buffer_null_offset_null(void **state)
148{
149 TPMU_HA ha = {0};
150 TPMU_SIGNATURE sig = {0};
151 TSS2_RC rc;
152
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100153 rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, NULL, sizeof(ha), NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100154 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700155
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100156 rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, NULL, sizeof(sig), NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100157 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700158}
159
160/*
161 * Invalid case with not big enough buffer
162 */
163static void
164tpmu_marshal_buffer_size_lt_data_nad_lt_offset(void **state)
165{
166 TPMU_HA ha = {0};
167 TPMU_SIGNATURE sig = {0};
168 uint8_t buffer[sizeof(ha) + sizeof(sig) + 10] = { 0 };
169 size_t offset = 10;
170 TSS2_RC rc;
171
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100172 memset(ha.sha512, 'a', TPM2_SHA512_DIGEST_SIZE);
173 rc = Tss2_MU_TPMU_HA_Marshal(&ha, TPM2_ALG_SHA512, buffer, TPM2_SHA512_DIGEST_SIZE - 1, &offset);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100174 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700175 assert_int_equal (offset, 10);
176
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100177 sig.ecdsa.hash = TPM2_ALG_SHA1;
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700178 sig.ecdsa.signatureR.size = 4;
179 sig.ecdsa.signatureR.buffer[0] = 'a';
180 sig.ecdsa.signatureR.buffer[1] = 'b';
181 sig.ecdsa.signatureR.buffer[2] = 'c';
182 sig.ecdsa.signatureR.buffer[3] = 'd';
183 sig.ecdsa.signatureS.size = 4;
184 sig.ecdsa.signatureS.buffer[0] = 'e';
185 sig.ecdsa.signatureS.buffer[1] = 'd';
186 sig.ecdsa.signatureS.buffer[2] = 'f';
187 sig.ecdsa.signatureS.buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700188
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100189 rc = Tss2_MU_TPMU_SIGNATURE_Marshal(&sig, TPM2_ALG_ECDSA, buffer, 12, &offset);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100190 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700191 assert_int_equal (offset, 10);
192}
193
194/*
195 * Success case
196 */
197static void
198tpmu_unmarshal_success(void **state)
199{
200 TPMU_HA ha = {0};
201 TPMU_SIGNATURE sig = {0};
202 uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
203 size_t buffer_size = sizeof(buffer);
204 TPMS_SIGNATURE_ECDSA *ptr;
205 TPM2B_ECC_PARAMETER *ptr2;
206 size_t offset = 0;
207 TSS2_RC rc;
208
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100209 memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
210 rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_SHA512, &ha);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700211 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100212 assert_int_equal (offset, TPM2_SHA512_DIGEST_SIZE);
213 assert_int_equal (memcmp(buffer, ha.sha512, TPM2_SHA512_DIGEST_SIZE), 0);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700214
215 offset = 0;
216 ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
217 ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100218 ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700219 ptr->signatureR.size = HOST_TO_BE_16(4);
220 ptr->signatureR.buffer[0] = 'a';
221 ptr->signatureR.buffer[1] = 'b';
222 ptr->signatureR.buffer[2] = 'c';
223 ptr->signatureR.buffer[3] = 'd';
224 ptr2->size = HOST_TO_BE_16(4);
225 ptr2->buffer[0] = 'e';
226 ptr2->buffer[1] = 'd';
227 ptr2->buffer[2] = 'f';
228 ptr2->buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700229
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100230 rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_ECDSA, &sig);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700231 assert_int_equal (rc, TSS2_RC_SUCCESS);
232 assert_int_equal (offset, 14);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100233 assert_int_equal (sig.ecdsa.hash, TPM2_ALG_SHA1);
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700234 assert_int_equal (sig.ecdsa.signatureR.size, 4);
235 assert_int_equal (sig.ecdsa.signatureR.buffer[0], 'a');
236 assert_int_equal (sig.ecdsa.signatureR.buffer[1], 'b');
237 assert_int_equal (sig.ecdsa.signatureR.buffer[2], 'c');
238 assert_int_equal (sig.ecdsa.signatureR.buffer[3], 'd');
239 assert_int_equal (sig.ecdsa.signatureS.size, 4);
240 assert_int_equal (sig.ecdsa.signatureS.buffer[0], 'e');
241 assert_int_equal (sig.ecdsa.signatureS.buffer[1], 'd');
242 assert_int_equal (sig.ecdsa.signatureS.buffer[2], 'f');
243 assert_int_equal (sig.ecdsa.signatureS.buffer[3], 'g');
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700244}
245
246/*
247 * Invalid test case with buffer null and dest null
248 */
249static void
250tpmu_unmarshal_dest_null_buff_null(void **state)
251{
252 size_t offset = 1;
253 TSS2_RC rc;
254
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100255 rc = Tss2_MU_TPMU_HA_Unmarshal(NULL, TPM2_SHA512_DIGEST_SIZE, &offset, TPM2_ALG_SHA512, NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100256 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700257 assert_int_equal (offset, 1);
258
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100259 rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(NULL, 32, &offset, TPM2_ALG_ECDSA, NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100260 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700261 assert_int_equal (offset, 1);
262}
263
264/*
265 * Invalid test case with offset null and dest null
266 */
267static void
268tpmu_unmarshal_buffer_null_offset_null(void **state)
269{
Andreas Fuchsa71dfd02017-11-29 14:55:28 +0100270 uint8_t buffer[sizeof(TPMU_HA) + sizeof(TPMU_SIGNATURE)] = { 0 };
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700271 size_t buffer_size = sizeof(buffer);
272 TSS2_RC rc;
273
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100274 rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, NULL, TPM2_ALG_SHA512, NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100275 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700276
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100277 rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, NULL, TPM2_ALG_ECDSA, NULL);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100278 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700279}
280
281/*
282 * Test case ensures the offset is updated when dest is NULL
283 * and offset is valid
284 */
285static void
286tpmu_unmarshal_dest_null_offset_valid(void **state)
287{
Andreas Fuchsa71dfd02017-11-29 14:55:28 +0100288 uint8_t buffer[sizeof(TPMU_HA) + sizeof(TPMU_SIGNATURE)] = { 0 };
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700289 size_t buffer_size = sizeof(buffer);
290 TPMS_SIGNATURE_ECDSA *ptr;
291 TPM2B_ECC_PARAMETER *ptr2;
292 size_t offset = 0;
293 TSS2_RC rc;
294
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100295 memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
296 rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_SHA512, NULL);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700297 assert_int_equal (rc, TSS2_RC_SUCCESS);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100298 assert_int_equal (offset, TPM2_SHA512_DIGEST_SIZE);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700299
300 offset = 0;
301 ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
302 ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100303 ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700304 ptr->signatureR.size = HOST_TO_BE_16(4);
305 ptr->signatureR.buffer[0] = 'a';
306 ptr->signatureR.buffer[1] = 'b';
307 ptr->signatureR.buffer[2] = 'c';
308 ptr->signatureR.buffer[3] = 'd';
309 ptr2->size = HOST_TO_BE_16(4);
310 ptr2->buffer[0] = 'e';
311 ptr2->buffer[1] = 'd';
312 ptr2->buffer[2] = 'f';
313 ptr2->buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700314
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100315 rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, buffer_size, &offset, TPM2_ALG_ECDSA, NULL);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700316 assert_int_equal (rc, TSS2_RC_SUCCESS);
317 assert_int_equal (offset, 14);
318}
319
320/*
321 * Invalid case with not big enough buffer. Make sure offest is untouched.
322 */
323static void
324tpmu_unmarshal_buffer_size_lt_data_nad_lt_offset(void **state)
325{
326 TPMU_HA ha = {0};
327 TPMU_SIGNATURE sig = {0};
328 uint8_t buffer[sizeof(ha) + sizeof(sig)] = { 0 };
329 TPMS_SIGNATURE_ECDSA *ptr;
330 TPM2B_ECC_PARAMETER *ptr2;
331 size_t offset = 5;
332 TSS2_RC rc;
333
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100334 memset(buffer, 'a', TPM2_SHA512_DIGEST_SIZE);
335 rc = Tss2_MU_TPMU_HA_Unmarshal(buffer, TPM2_SHA512_DIGEST_SIZE - 1, &offset, TPM2_ALG_SHA512, &ha);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100336 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700337 assert_int_equal (offset, 5);
338
339 ptr = (TPMS_SIGNATURE_ECDSA *) buffer;
340 ptr2 = (TPM2B_ECC_PARAMETER *) (buffer + 8);
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100341 ptr->hash = HOST_TO_BE_16(TPM2_ALG_SHA1);
Tadeusz Struka64c33e2017-11-01 16:12:10 -0700342 ptr->signatureR.size = HOST_TO_BE_16(4);
343 ptr->signatureR.buffer[0] = 'a';
344 ptr->signatureR.buffer[1] = 'b';
345 ptr->signatureR.buffer[2] = 'c';
346 ptr->signatureR.buffer[3] = 'd';
347 ptr2->size = HOST_TO_BE_16(4);
348 ptr2->buffer[0] = 'e';
349 ptr2->buffer[1] = 'd';
350 ptr2->buffer[2] = 'f';
351 ptr2->buffer[3] = 'g';
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700352
Andreas Fuchsbe5899d2017-11-13 17:14:36 +0100353 rc = Tss2_MU_TPMU_SIGNATURE_Unmarshal(buffer, 14, &offset, TPM2_ALG_ECDSA, &sig);
Andreas Fuchse66804b2017-11-28 16:24:43 +0100354 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700355 assert_int_equal (offset, 5);
356}
357
Tadeusz Struk9aecf0f2018-02-28 15:10:06 -0800358static void
359tpmu_name_marshal(void **state)
360{
361 TPMU_NAME name = {0};
362 TPMT_HA ha = {0};
363 uint8_t buf[256] = {0};
364 TPM2_HANDLE hdl = TPM2_RS_PW;
365 TPM2_HANDLE hdl_expected = HOST_TO_BE_32(TPM2_RS_PW);
366 TPM2_ALG_ID id_expected = HOST_TO_BE_16(TPM2_ALG_SHA1);
367 size_t size = sizeof(hdl), offset = 0;
368 const char digest[] = {0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x01, 0x02,
369 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
370 0x10, 0x11, 0x12, 0x13, 0x14};
371 TPM2_RC rc;
372
373 /* Handle case */
374 size = sizeof(hdl);
375 name.handle = hdl;
376
377 rc = Tss2_MU_TPMU_NAME_Marshal(&name, size, buf, sizeof(hdl), &offset);
378 assert_int_equal (rc, TSS2_RC_SUCCESS);
379 assert_int_equal (offset, sizeof(hdl));
380 assert_memory_equal ((void *) buf, &hdl_expected, sizeof(hdl));
381
382 /* Digest case */
383 offset = 0;
384 size = sizeof(TPM2_ALG_ID) + TPM2_SHA1_DIGEST_SIZE;
385 ha.hashAlg = TPM2_ALG_SHA1;
386 memcpy(&ha.digest, digest, TPM2_SHA1_DIGEST_SIZE);
387 memcpy(&name.digest, &ha, sizeof(ha));
388 rc = Tss2_MU_TPMU_NAME_Marshal(&name, size, buf, TPM2_SHA1_DIGEST_SIZE + 2, &offset);
389 assert_int_equal (rc, TSS2_RC_SUCCESS);
390 assert_int_equal (offset, TPM2_SHA1_DIGEST_SIZE + 2);
391 assert_memory_equal (buf, &id_expected, sizeof(TPM2_ALG_ID));
392 assert_memory_equal (buf + 2, digest, TPM2_SHA1_DIGEST_SIZE);
393}
394
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700395int main(void) {
396 const struct CMUnitTest tests[] = {
397 cmocka_unit_test (tpmu_marshal_success),
398 cmocka_unit_test (tpmu_marshal_success_offset),
399 cmocka_unit_test (tpmu_marshal_buffer_null_with_offset),
400 cmocka_unit_test (tpmu_marshal_buffer_null_offset_null),
401 cmocka_unit_test (tpmu_marshal_buffer_size_lt_data_nad_lt_offset),
402 cmocka_unit_test (tpmu_unmarshal_success),
403 cmocka_unit_test (tpmu_unmarshal_dest_null_buff_null),
404 cmocka_unit_test (tpmu_unmarshal_buffer_null_offset_null),
405 cmocka_unit_test (tpmu_unmarshal_dest_null_offset_valid),
406 cmocka_unit_test (tpmu_unmarshal_buffer_size_lt_data_nad_lt_offset),
Tadeusz Struk9aecf0f2018-02-28 15:10:06 -0800407 cmocka_unit_test (tpmu_name_marshal),
Tadeusz Struk1c55c6c2017-09-19 14:03:47 -0700408 };
409 return cmocka_run_group_tests(tests, NULL, NULL);
410}