UINT64-marshal.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /***********************************************************************
  3. * Copyright (c) 2017-2018, Intel Corporation
  4. *
  5. * All rights reserved.
  6. ***********************************************************************/
  7. #ifdef HAVE_CONFIG_H
  8. #include <config.h>
  9. #endif
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <setjmp.h>
  13. #include <cmocka.h>
  14. #include "tss2_mu.h"
  15. #include "util/tss2_endian.h"
  16. /*
  17. * Test case for successful UINT64 marshaling with NULL offset.
  18. */
  19. void
  20. UINT64_marshal_success (void **state)
  21. {
  22. UINT64 src = 0xdeadbeefdeadbeef, tmp;
  23. uint8_t buffer [8] = { 0 };
  24. size_t buffer_size = sizeof (buffer);
  25. TSS2_RC rc;
  26. rc = Tss2_MU_UINT64_Marshal (src, buffer, buffer_size, NULL);
  27. tmp = HOST_TO_BE_64 (src);
  28. assert_int_equal (rc, TSS2_RC_SUCCESS);
  29. assert_memory_equal (&tmp, &buffer [0], sizeof (tmp));
  30. }
  31. /*
  32. * Test case for successful UINT64 marshaling with offset.
  33. */
  34. void
  35. UINT64_marshal_success_offset (void **state)
  36. {
  37. UINT64 src = 0xdeadbeefdeadbeef, tmp = 0;
  38. uint8_t buffer [9] = { 0 };
  39. size_t buffer_size = sizeof (buffer);
  40. size_t offset = 1;
  41. TSS2_RC rc;
  42. rc = Tss2_MU_UINT64_Marshal (src, buffer, buffer_size, &offset);
  43. tmp = HOST_TO_BE_64 (src);
  44. assert_int_equal (rc, TSS2_RC_SUCCESS);
  45. assert_memory_equal (&tmp, &buffer [1], sizeof (tmp));
  46. assert_int_equal (offset, sizeof (buffer));
  47. }
  48. /*
  49. * Test case passing NULL buffer and non-NULL offset. Test to be sure offset
  50. * is updated to the size of the src parameter.
  51. */
  52. void
  53. UINT64_marshal_buffer_null_with_offset (void **state)
  54. {
  55. UINT64 src = 0xdeadbeefdeadbeef;
  56. size_t offset = 100;
  57. TSS2_RC rc;
  58. rc = Tss2_MU_UINT64_Marshal (src, NULL, 2, &offset);
  59. assert_int_equal (rc, TSS2_RC_SUCCESS);
  60. assert_int_equal (offset, 100 + sizeof (src));
  61. }
  62. /*
  63. * Test case passing NULL buffer and NULL offset.
  64. */
  65. void
  66. UINT64_marshal_buffer_null_offset_null (void **state)
  67. {
  68. UINT64 src = 0xdeadbeefdeadbeef;
  69. TSS2_RC rc;
  70. rc = Tss2_MU_UINT64_Marshal (src, NULL, sizeof (src), NULL);
  71. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  72. }
  73. /*
  74. * Test failing case where buffer_size - offset (size of available space
  75. * in buffer) is less than sizeof (UINT64). Also check offset is unchanged.
  76. */
  77. void
  78. UINT64_marshal_buffer_size_lt_data (void **state)
  79. {
  80. UINT64 src = 0xdeadbeefdeadbeef;
  81. uint8_t buffer [8] = { 0 };
  82. size_t offset = 2;
  83. TSS2_RC rc;
  84. rc = Tss2_MU_UINT64_Marshal (src, buffer, sizeof (src), &offset);
  85. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  86. assert_int_equal (offset, 2);
  87. }
  88. /*
  89. * Test failing case where buffer_size is less than the offset value.
  90. * This should return INSUFFICIENT_BUFFER and the offset should be unchanged.
  91. */
  92. void
  93. UINT64_marshal_buffer_size_lt_offset (void **state)
  94. {
  95. UINT64 src = 0xdeadbeefdeadbeef;
  96. uint8_t buffer [8] = { 0 };
  97. size_t buffer_size = sizeof (buffer);
  98. size_t offset = sizeof (buffer) + 1;
  99. TSS2_RC rc;
  100. rc = Tss2_MU_UINT64_Marshal (src, buffer, buffer_size, &offset);
  101. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  102. assert_int_equal (offset, sizeof (buffer) + 1);
  103. }
  104. /*
  105. * Test case for successful UINT64 unmarshaling.
  106. */
  107. void
  108. UINT64_unmarshal_success (void **state)
  109. {
  110. uint8_t buffer [8] = { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef };
  111. uint8_t buffer_size = sizeof (buffer);
  112. UINT64 dest = 0, tmp = 0;
  113. TSS2_RC rc;
  114. rc = Tss2_MU_UINT64_Unmarshal (buffer, buffer_size, NULL, &dest);
  115. tmp = HOST_TO_BE_64 (dest);
  116. assert_int_equal (rc, TSS2_RC_SUCCESS);
  117. assert_memory_equal (&tmp, buffer, sizeof (tmp));
  118. }
  119. /*
  120. * Test case for successful UINT64 unmarshaling with offset.
  121. */
  122. void
  123. UINT64_unmarshal_success_offset (void **state)
  124. {
  125. UINT64 dest = 0, tmp = 0;
  126. uint8_t buffer [9] = { 0xff, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef };
  127. size_t buffer_size = sizeof (buffer);
  128. size_t offset = 1;
  129. TSS2_RC rc;
  130. rc = Tss2_MU_UINT64_Unmarshal (buffer, buffer_size, &offset, &dest);
  131. tmp = HOST_TO_BE_64 (dest);
  132. assert_int_equal (rc, TSS2_RC_SUCCESS);
  133. assert_memory_equal (&tmp, &buffer [1], sizeof (tmp));
  134. assert_int_equal (offset, 9);
  135. }
  136. /*
  137. * Test case ensures a NULL buffer parameter produces a BAD_REFERENCE RC.
  138. */
  139. void
  140. UINT64_unmarshal_buffer_null (void **state)
  141. {
  142. TSS2_RC rc;
  143. rc = Tss2_MU_UINT64_Unmarshal (NULL, 1, NULL, NULL);
  144. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  145. }
  146. /*
  147. * Test case ensures a NULL dest and offset parameters produce an
  148. * INSUFFICIENT_BUFFER RC.
  149. */
  150. void
  151. UINT64_unmarshal_dest_null (void **state)
  152. {
  153. uint8_t buffer [1] = { 0 };
  154. TSS2_RC rc;
  155. rc = Tss2_MU_UINT64_Unmarshal (buffer, sizeof (buffer), NULL, NULL);
  156. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  157. }
  158. /*
  159. * Test case ensures that INSUFFICIENT_BUFFER is returned when buffer_size
  160. * is less than the provided offset.
  161. */
  162. void
  163. UINT64_unmarshal_buffer_size_lt_offset (void **state)
  164. {
  165. UINT64 dest = 0;
  166. uint8_t buffer [1] = { 0 };
  167. size_t offset = sizeof (buffer) + 1;
  168. TSS2_RC rc;
  169. rc = Tss2_MU_UINT64_Unmarshal (buffer, sizeof (buffer), &offset, &dest);
  170. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  171. assert_int_equal (offset, sizeof (buffer) + 1);
  172. assert_int_equal (dest, 0);
  173. }
  174. /*
  175. * Test case ensures that INSUFFICIENT_BUFFER is returned when buffer_size -
  176. * local_offset is less than dest (the destination type).
  177. */
  178. void
  179. UINT64_unmarshal_buffer_size_lt_dest (void **state)
  180. {
  181. UINT64 dest = 0;
  182. uint8_t buffer [3] = { 0 };
  183. size_t offset = sizeof (buffer);
  184. TSS2_RC rc;
  185. rc = Tss2_MU_UINT64_Unmarshal (buffer, sizeof (buffer), &offset, &dest);
  186. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  187. assert_int_equal (offset, sizeof (buffer));
  188. assert_int_equal (dest, 0);
  189. }
  190. int
  191. main (void)
  192. {
  193. const struct CMUnitTest tests [] = {
  194. cmocka_unit_test (UINT64_marshal_success),
  195. cmocka_unit_test (UINT64_marshal_success_offset),
  196. cmocka_unit_test (UINT64_marshal_buffer_null_with_offset),
  197. cmocka_unit_test (UINT64_marshal_buffer_null_offset_null),
  198. cmocka_unit_test (UINT64_marshal_buffer_size_lt_data),
  199. cmocka_unit_test (UINT64_marshal_buffer_size_lt_offset),
  200. cmocka_unit_test (UINT64_unmarshal_success),
  201. cmocka_unit_test (UINT64_unmarshal_success_offset),
  202. cmocka_unit_test (UINT64_unmarshal_buffer_null),
  203. cmocka_unit_test (UINT64_unmarshal_dest_null),
  204. cmocka_unit_test (UINT64_unmarshal_buffer_size_lt_offset),
  205. cmocka_unit_test (UINT64_unmarshal_buffer_size_lt_dest),
  206. };
  207. return cmocka_run_group_tests (tests, NULL, NULL);
  208. }