blob: 74f8a6b4d951fe78736a6630f1bf1b7467d11c65 [file] [log] [blame]
Tadeusz Struk0688a7a2018-04-27 15:04:15 -07001/***********************************************************************
2 * Copyright (c) 2017-2018, Intel Corporation
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26 * THE POSSIBILITY OF SUCH DAMAGE.
27 ***********************************************************************/
Philip Triccabff72122017-02-04 07:53:07 -080028#include <stdlib.h>
29#include <stdio.h>
30
31#include <setjmp.h>
32#include <cmocka.h>
33
Philip Tricca8ffd3c42018-03-09 16:27:24 -080034#include "tss2_mu.h"
Philip Triccaa7c51ce2018-03-10 18:28:25 -080035#include "util/tss2_endian.h"
Philip Triccabff72122017-02-04 07:53:07 -080036
37/*
38 * Test case for successful UINT32 marshaling with NULL offset.
39 */
40void
41UINT32_marshal_success (void **state)
42{
Philip Triccab37fa662017-03-09 08:02:55 -080043 UINT32 src = 0xdeadbeef, tmp = 0;
Philip Triccabff72122017-02-04 07:53:07 -080044 uint8_t buffer [4] = { 0 };
45 size_t buffer_size = sizeof (buffer);
46 TSS2_RC rc;
47
Tadeusz Strukb21f9f92017-10-09 13:51:19 -070048 rc = Tss2_MU_UINT32_Marshal (src, buffer, buffer_size, NULL);
Philip Triccabff72122017-02-04 07:53:07 -080049
Philip Triccab37fa662017-03-09 08:02:55 -080050 tmp = HOST_TO_BE_32 (src);
Philip Triccabff72122017-02-04 07:53:07 -080051 assert_int_equal (rc, TSS2_RC_SUCCESS);
Philip Triccab37fa662017-03-09 08:02:55 -080052 assert_memory_equal (&tmp, buffer, sizeof (tmp));
Philip Triccabff72122017-02-04 07:53:07 -080053}
54/*
55 * Test case for successful UINT32 marshaling with offset.
56 */
57void
58UINT32_marshal_success_offset (void **state)
59{
Philip Triccab37fa662017-03-09 08:02:55 -080060 UINT32 src = 0xdeadbeef, tmp = 0;
Philip Triccabff72122017-02-04 07:53:07 -080061 uint8_t buffer [5] = { 0 };
62 size_t buffer_size = sizeof (buffer);
63 size_t offset = 1;
64 TSS2_RC rc;
65
Tadeusz Strukb21f9f92017-10-09 13:51:19 -070066 rc = Tss2_MU_UINT32_Marshal (src, buffer, buffer_size, &offset);
Philip Triccab37fa662017-03-09 08:02:55 -080067 tmp = HOST_TO_BE_32 (src);
Philip Triccabff72122017-02-04 07:53:07 -080068
69 assert_int_equal (rc, TSS2_RC_SUCCESS);
Philip Triccab37fa662017-03-09 08:02:55 -080070 assert_memory_equal (&tmp, &buffer [1], sizeof (tmp));
Philip Triccabff72122017-02-04 07:53:07 -080071 assert_int_equal (offset, sizeof (buffer));
72}
73/*
Philip Triccabff72122017-02-04 07:53:07 -080074 * Test case passing NULL buffer and non-NULL offset. Test to be sure offset
75 * is updated to the size of the src parameter.
76 */
77void
78UINT32_marshal_buffer_null_with_offset (void **state)
79{
80 UINT32 src = 0xdeadbeef;
81 size_t offset = 100;
82 TSS2_RC rc;
83
Tadeusz Strukb21f9f92017-10-09 13:51:19 -070084 rc = Tss2_MU_UINT32_Marshal (src, NULL, 2, &offset);
Philip Triccabff72122017-02-04 07:53:07 -080085
86 assert_int_equal (rc, TSS2_RC_SUCCESS);
87 assert_int_equal (offset, 100 + sizeof (src));
88}
89/*
90 * Test case passing NULL buffer and NULL offset.
91 */
92void
93UINT32_marshal_buffer_null_offset_null (void **state)
94{
95 UINT32 src = 0xdeadbeef;
96 TSS2_RC rc;
97
Tadeusz Strukb21f9f92017-10-09 13:51:19 -070098 rc = Tss2_MU_UINT32_Marshal (src, NULL, sizeof (src), NULL);
Philip Triccabff72122017-02-04 07:53:07 -080099
Andreas Fuchse66804b2017-11-28 16:24:43 +0100100 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Philip Triccabff72122017-02-04 07:53:07 -0800101}
102/*
103 * Test failing case where buffer_size - offset (size of available space
104 * in buffer) is less than sizeof (UINT32). Also check offset is unchanged.
105 */
106void
107UINT32_marshal_buffer_size_lt_data (void **state)
108{
109 UINT32 src = 0xdeadbeef;
110 uint8_t buffer [4] = { 0 };
111 size_t offset = 2;
112 TSS2_RC rc;
113
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700114 rc = Tss2_MU_UINT32_Marshal (src, buffer, sizeof (src), &offset);
Philip Triccabff72122017-02-04 07:53:07 -0800115
Andreas Fuchse66804b2017-11-28 16:24:43 +0100116 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Philip Triccabff72122017-02-04 07:53:07 -0800117 assert_int_equal (offset, 2);
118}
119/*
120 * Test failing case where buffer_size is less than the offset value.
121 * This should return INSUFFICIENT_BUFFER and the offset should be unchanged.
122 */
123void
124UINT32_marshal_buffer_size_lt_offset (void **state)
125{
126 UINT32 src = 0xdeadbeef;
127 uint8_t buffer [4] = { 0 };
128 size_t buffer_size = sizeof (buffer);
129 size_t offset = sizeof (buffer) + 1;
130 TSS2_RC rc;
131
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700132 rc = Tss2_MU_UINT32_Marshal (src, buffer, buffer_size, &offset);
Philip Triccabff72122017-02-04 07:53:07 -0800133
Andreas Fuchse66804b2017-11-28 16:24:43 +0100134 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Philip Triccabff72122017-02-04 07:53:07 -0800135 assert_int_equal (offset, sizeof (buffer) + 1);
136}
137/*
138 * Test case for successful UINT32 unmarshaling.
139 */
140void
141UINT32_unmarshal_success (void **state)
142{
143 uint8_t buffer [4] = { 0xde, 0xad, 0xbe, 0xef };
144 uint8_t buffer_size = sizeof (buffer);
Philip Triccab37fa662017-03-09 08:02:55 -0800145 UINT32 dest = 0, tmp = 0;
Philip Triccabff72122017-02-04 07:53:07 -0800146 TSS2_RC rc;
147
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700148 rc = Tss2_MU_UINT32_Unmarshal (buffer, buffer_size, NULL, &dest);
Philip Triccab37fa662017-03-09 08:02:55 -0800149 tmp = HOST_TO_BE_32 (dest);
Philip Triccabff72122017-02-04 07:53:07 -0800150
151 assert_int_equal (rc, TSS2_RC_SUCCESS);
Philip Triccab37fa662017-03-09 08:02:55 -0800152 assert_memory_equal (&tmp, buffer, sizeof (tmp));
Philip Triccabff72122017-02-04 07:53:07 -0800153}
154/*
155 * Test case for successful UINT32 unmarshaling with offset.
156 */
157void
158UINT32_unmarshal_success_offset (void **state)
159{
Philip Triccab37fa662017-03-09 08:02:55 -0800160 UINT32 dest = 0, tmp = 0;
Philip Triccabff72122017-02-04 07:53:07 -0800161 uint8_t buffer [5] = { 0xff, 0xde, 0xad, 0xbe, 0xef };
162 size_t buffer_size = sizeof (buffer);
163 size_t offset = 1;
164 TSS2_RC rc;
165
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700166 rc = Tss2_MU_UINT32_Unmarshal (buffer, buffer_size, &offset, &dest);
Philip Triccab37fa662017-03-09 08:02:55 -0800167 tmp = HOST_TO_BE_32 (dest);
Philip Triccabff72122017-02-04 07:53:07 -0800168
169 assert_int_equal (rc, TSS2_RC_SUCCESS);
Philip Triccab37fa662017-03-09 08:02:55 -0800170 assert_memory_equal (&tmp, &buffer [1], sizeof (tmp));
Philip Triccabff72122017-02-04 07:53:07 -0800171 assert_int_equal (offset, 5);
172}
173/*
174 * Test case ensures a NULL buffer parameter produces a BAD_REFERENCE RC.
175 */
176void
177UINT32_unmarshal_buffer_null (void **state)
178{
179 TSS2_RC rc;
180
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700181 rc = Tss2_MU_UINT32_Unmarshal (NULL, 1, NULL, NULL);
Philip Triccabff72122017-02-04 07:53:07 -0800182
Andreas Fuchse66804b2017-11-28 16:24:43 +0100183 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Philip Triccabff72122017-02-04 07:53:07 -0800184}
185/*
186 * Test case ensures a NULL dest and offset parameters produce an
187 * INSUFFICIENT_BUFFER RC.
188 */
189void
190UINT32_unmarshal_dest_null (void **state)
191{
192 uint8_t buffer [1];
193 TSS2_RC rc;
194
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700195 rc = Tss2_MU_UINT32_Unmarshal (buffer, sizeof (buffer), NULL, NULL);
Philip Triccabff72122017-02-04 07:53:07 -0800196
Andreas Fuchse66804b2017-11-28 16:24:43 +0100197 assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
Philip Triccabff72122017-02-04 07:53:07 -0800198}
199/*
200 * Test case ensures that INSUFFICIENT_BUFFER is returned when buffer_size
201 * is less than the provided offset.
202 */
203void
204UINT32_unmarshal_buffer_size_lt_offset (void **state)
205{
206 UINT32 dest = 0;
207 uint8_t buffer [1];
208 size_t offset = sizeof (buffer) + 1;
209 TSS2_RC rc;
210
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700211 rc = Tss2_MU_UINT32_Unmarshal (buffer, sizeof (buffer), &offset, &dest);
Philip Triccabff72122017-02-04 07:53:07 -0800212
Andreas Fuchse66804b2017-11-28 16:24:43 +0100213 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Philip Triccabff72122017-02-04 07:53:07 -0800214 assert_int_equal (offset, sizeof (buffer) + 1);
215 assert_int_equal (dest, 0);
216}
217/*
218 * Test case ensures that INSUFFICIENT_BUFFER is returned when buffer_size -
219 * local_offset is less than dest (the destination type).
220 */
221void
222UINT32_unmarshal_buffer_size_lt_dest (void **state)
223{
224 UINT32 dest = 0;
225 uint8_t buffer [3];
226 size_t offset = sizeof (buffer);
227 TSS2_RC rc;
228
Tadeusz Strukb21f9f92017-10-09 13:51:19 -0700229 rc = Tss2_MU_UINT32_Unmarshal (buffer, sizeof (buffer), &offset, &dest);
Philip Triccabff72122017-02-04 07:53:07 -0800230
Andreas Fuchse66804b2017-11-28 16:24:43 +0100231 assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
Philip Triccabff72122017-02-04 07:53:07 -0800232 assert_int_equal (offset, sizeof (buffer));
233 assert_int_equal (dest, 0);
234}
235int
236main (void)
237{
Tadeusz Struk2147c492017-08-09 13:40:31 -0700238 const struct CMUnitTest tests [] = {
239 cmocka_unit_test (UINT32_marshal_success),
240 cmocka_unit_test (UINT32_marshal_success_offset),
241 cmocka_unit_test (UINT32_marshal_buffer_null_with_offset),
242 cmocka_unit_test (UINT32_marshal_buffer_null_offset_null),
243 cmocka_unit_test (UINT32_marshal_buffer_size_lt_data),
244 cmocka_unit_test (UINT32_marshal_buffer_size_lt_offset),
245 cmocka_unit_test (UINT32_unmarshal_success),
246 cmocka_unit_test (UINT32_unmarshal_success_offset),
247 cmocka_unit_test (UINT32_unmarshal_buffer_null),
248 cmocka_unit_test (UINT32_unmarshal_dest_null),
249 cmocka_unit_test (UINT32_unmarshal_buffer_size_lt_offset),
250 cmocka_unit_test (UINT32_unmarshal_buffer_size_lt_dest),
Philip Triccabff72122017-02-04 07:53:07 -0800251 };
Tadeusz Struk2147c492017-08-09 13:40:31 -0700252 return cmocka_run_group_tests (tests, NULL, NULL);
Philip Triccabff72122017-02-04 07:53:07 -0800253}