TPMA-marshal.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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 <stdarg.h>
  11. #include <stddef.h>
  12. #include <setjmp.h>
  13. #include <cmocka.h>
  14. #include <stdio.h>
  15. #include "tss2_mu.h"
  16. #include "util/tss2_endian.h"
  17. /*
  18. * Success case
  19. */
  20. static void
  21. tpma_marshal_success(void **state)
  22. {
  23. TPMA_ALGORITHM alg = {0}, *ptr;
  24. TPMA_SESSION session = {0}, *ptr2;
  25. uint8_t buffer[sizeof(alg)] = { 0 };
  26. size_t buffer_size = sizeof(buffer);
  27. uint8_t buffer2[sizeof(session)] = { 0 };
  28. size_t buffer_size2 = sizeof(buffer2);
  29. uint32_t alg_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  30. uint8_t session_expected = TPMA_SESSION_AUDIT | TPMA_SESSION_AUDITRESET | TPMA_SESSION_DECRYPT;
  31. TSS2_RC rc;
  32. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  33. alg |= TPMA_ALGORITHM_SIGNING;
  34. ptr = (TPMA_ALGORITHM *)buffer;
  35. rc = Tss2_MU_TPMA_ALGORITHM_Marshal(alg, buffer, buffer_size, NULL);
  36. assert_int_equal (rc, TSS2_RC_SUCCESS);
  37. assert_int_equal (*ptr, alg_expected);
  38. session |= TPMA_SESSION_AUDIT;
  39. session |= TPMA_SESSION_DECRYPT;
  40. session |= TPMA_SESSION_AUDITRESET;
  41. ptr2 = (TPMA_SESSION *)buffer2;
  42. rc = Tss2_MU_TPMA_SESSION_Marshal(session, buffer2, buffer_size2, NULL);
  43. assert_int_equal (rc, TSS2_RC_SUCCESS);
  44. assert_int_equal (*ptr2, session_expected);
  45. }
  46. /*
  47. * Success case with a valid offset
  48. */
  49. static void
  50. tpma_marshal_success_offset(void **state)
  51. {
  52. TPMA_ALGORITHM alg = {0}, *ptr;
  53. TPMA_SESSION session = {0}, *ptr2;
  54. uint8_t buffer[sizeof(alg) + 10] = { 0 };
  55. size_t buffer_size = sizeof(buffer);
  56. uint8_t buffer2[sizeof(session) + 14] = { 0 };
  57. size_t buffer_size2 = sizeof(buffer2);
  58. size_t offset = 10;
  59. uint32_t alg_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  60. uint8_t session_expected = TPMA_SESSION_AUDIT | TPMA_SESSION_AUDITRESET | TPMA_SESSION_DECRYPT;
  61. TSS2_RC rc;
  62. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  63. alg |= TPMA_ALGORITHM_SIGNING;
  64. ptr = (TPMA_ALGORITHM *)&buffer[10];
  65. rc = Tss2_MU_TPMA_ALGORITHM_Marshal(alg, buffer, buffer_size, &offset);
  66. assert_int_equal (rc, TSS2_RC_SUCCESS);
  67. assert_int_equal (*ptr, alg_expected);
  68. assert_int_equal (offset, sizeof (buffer));
  69. session |= TPMA_SESSION_AUDIT;
  70. session |= TPMA_SESSION_DECRYPT;
  71. session |= TPMA_SESSION_AUDITRESET;
  72. ptr2 = (TPMA_SESSION *)&buffer2[14];
  73. rc = Tss2_MU_TPMA_SESSION_Marshal(session, buffer2, buffer_size2, &offset);
  74. assert_int_equal (rc, TSS2_RC_SUCCESS);
  75. assert_int_equal (*ptr2, session_expected);
  76. assert_int_equal (offset, sizeof (buffer2));
  77. }
  78. /*
  79. * Success case with a null buffer
  80. */
  81. static void
  82. tpma_marshal_buffer_null_with_offset(void **state)
  83. {
  84. TPMA_ALGORITHM alg = {0};
  85. TPMA_SESSION session = {0};
  86. size_t offset = 100;
  87. TSS2_RC rc;
  88. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  89. alg |= TPMA_ALGORITHM_SIGNING;
  90. rc = Tss2_MU_TPMA_ALGORITHM_Marshal(alg, NULL, sizeof(alg), &offset);
  91. assert_int_equal (rc, TSS2_RC_SUCCESS);
  92. assert_int_equal (offset, 100 + sizeof(alg));
  93. session |= TPMA_SESSION_AUDIT;
  94. session |= TPMA_SESSION_DECRYPT;
  95. session |= TPMA_SESSION_AUDITRESET;
  96. offset = 100;
  97. rc = Tss2_MU_TPMA_SESSION_Marshal(session, NULL, sizeof(session), &offset);
  98. assert_int_equal (rc, TSS2_RC_SUCCESS);
  99. assert_int_equal (offset, 100 + sizeof(session));
  100. }
  101. /*
  102. * Invalid case with a null buffer and a null offset
  103. */
  104. static void
  105. tpma_marshal_buffer_null_offset_null(void **state)
  106. {
  107. TPMA_ALGORITHM alg = {0};
  108. TPMA_SESSION session = {0};
  109. TSS2_RC rc;
  110. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  111. alg |= TPMA_ALGORITHM_SIGNING;
  112. rc = Tss2_MU_TPMA_ALGORITHM_Marshal(alg, NULL, sizeof(alg), NULL);
  113. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  114. session |= TPMA_SESSION_AUDIT;
  115. session |= TPMA_SESSION_DECRYPT;
  116. session |= TPMA_SESSION_AUDITRESET;
  117. rc = Tss2_MU_TPMA_SESSION_Marshal(session, NULL, sizeof(session), NULL);
  118. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  119. }
  120. /*
  121. * Invalid case with not big enough buffer
  122. */
  123. static void
  124. tpma_marshal_buffer_size_lt_data_nad_lt_offset(void **state)
  125. {
  126. TPMA_ALGORITHM alg = {0};
  127. TPMA_SESSION session = {0};
  128. uint8_t buffer[sizeof(alg)] = { 0 };
  129. size_t buffer_size = sizeof(buffer);
  130. uint8_t buffer2[sizeof(session)] = { 0 };
  131. size_t buffer_size2 = sizeof(buffer2);
  132. size_t offset = 2;
  133. TSS2_RC rc;
  134. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  135. alg |= TPMA_ALGORITHM_SIGNING;
  136. rc = Tss2_MU_TPMA_ALGORITHM_Marshal(alg, buffer, buffer_size, &offset);
  137. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  138. assert_int_equal (offset, 2);
  139. session |= TPMA_SESSION_AUDIT;
  140. session |= TPMA_SESSION_DECRYPT;
  141. session |= TPMA_SESSION_AUDITRESET;
  142. rc = Tss2_MU_TPMA_SESSION_Marshal(session, buffer2, buffer_size2, &offset);
  143. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  144. assert_int_equal (offset, 2);
  145. }
  146. /*
  147. * Success case
  148. */
  149. static void
  150. tpma_unmarshal_success(void **state)
  151. {
  152. TPMA_ALGORITHM alg = {0};
  153. TPMA_SESSION session = {0};
  154. uint8_t buffer[sizeof(alg) + sizeof(session)] = { 0 };
  155. size_t buffer_size = sizeof(buffer);
  156. size_t offset = 0;
  157. uint32_t alg_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  158. uint8_t session_expected = TPMA_SESSION_AUDIT | TPMA_SESSION_AUDITRESET | TPMA_SESSION_DECRYPT;
  159. uint32_t *ptr;
  160. uint8_t *ptr2;
  161. TSS2_RC rc;
  162. ptr = (uint32_t *)buffer;
  163. ptr2 = (uint8_t *)ptr + 4;
  164. *ptr = alg_expected;
  165. *ptr2 = session_expected;
  166. rc = Tss2_MU_TPMA_ALGORITHM_Unmarshal(buffer, buffer_size, &offset, &alg);
  167. assert_int_equal (rc, TSS2_RC_SUCCESS);
  168. assert_int_equal (alg, BE_TO_HOST_32(alg_expected));
  169. assert_int_equal (offset, 4);
  170. rc = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, buffer_size, &offset, &session);
  171. assert_int_equal (rc, TSS2_RC_SUCCESS);
  172. assert_int_equal (session, session_expected);
  173. assert_int_equal (offset, 5);
  174. }
  175. /*
  176. * Invalid test case with buffer null and dest null
  177. */
  178. static void
  179. tpma_unmarshal_dest_null_buff_null(void **state)
  180. {
  181. size_t offset = 0;
  182. TSS2_RC rc;
  183. rc = Tss2_MU_TPMA_ALGORITHM_Unmarshal(NULL, 20, &offset, NULL);
  184. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  185. assert_int_equal (offset, 0);
  186. rc = Tss2_MU_TPMA_SESSION_Unmarshal(NULL, 20, &offset, NULL);
  187. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  188. assert_int_equal (offset, 0);
  189. }
  190. /*
  191. * Invalid test case with offset null and dest null
  192. */
  193. static void
  194. tpma_unmarshal_buffer_null_offset_null(void **state)
  195. {
  196. TPMA_ALGORITHM alg = {0};
  197. TPMA_SESSION session = {0};
  198. uint8_t buffer[sizeof(alg) + sizeof(session)] = { 0 };
  199. size_t buffer_size = sizeof(buffer);
  200. TSS2_RC rc;
  201. rc = Tss2_MU_TPMA_ALGORITHM_Unmarshal(buffer, buffer_size, NULL, NULL);
  202. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  203. rc = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, buffer_size, NULL, NULL);
  204. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  205. }
  206. /*
  207. * Test case ensures the offset is updated when dest is NULL
  208. * and offset is valid
  209. */
  210. static void
  211. tpma_unmarshal_dest_null_offset_valid(void **state)
  212. {
  213. TPMA_SESSION session = {0};
  214. uint8_t buffer[sizeof(TPMA_ALGORITHM) + sizeof(session)] = { 0 };
  215. size_t buffer_size = sizeof(buffer);
  216. size_t offset = 0;
  217. uint32_t alg_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  218. uint8_t session_expected = TPMA_SESSION_AUDIT | TPMA_SESSION_AUDITRESET | TPMA_SESSION_DECRYPT;
  219. uint32_t *ptr;
  220. uint8_t *ptr2;
  221. TSS2_RC rc;
  222. ptr = (uint32_t *)buffer;
  223. ptr2 = (uint8_t *)ptr + 4;
  224. *ptr = alg_expected;
  225. *ptr2 = session_expected;
  226. rc = Tss2_MU_TPMA_ALGORITHM_Unmarshal(buffer, buffer_size, &offset, NULL);
  227. assert_int_equal (rc, TSS2_RC_SUCCESS);
  228. assert_int_equal (offset, sizeof(TPMA_ALGORITHM));
  229. rc = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, buffer_size, &offset, NULL);
  230. assert_int_equal (rc, TSS2_RC_SUCCESS);
  231. assert_int_equal (offset, sizeof(buffer));
  232. }
  233. /*
  234. * Invalid case with not big enough buffer
  235. */
  236. static void
  237. tpma_unmarshal_buffer_size_lt_data_nad_lt_offset(void **state)
  238. {
  239. TPMA_ALGORITHM alg = {0};
  240. TPMA_SESSION session = {0};
  241. uint8_t buffer[sizeof(alg) + sizeof(session)] = { 0 };
  242. size_t offset = 1;
  243. TSS2_RC rc;
  244. alg |= TPMA_ALGORITHM_ASYMMETRIC;
  245. alg |= TPMA_ALGORITHM_SIGNING;
  246. rc = Tss2_MU_TPMA_ALGORITHM_Unmarshal(buffer, sizeof(alg), &offset, &alg);
  247. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  248. assert_int_equal (offset, 1);
  249. session |= TPMA_SESSION_AUDIT;
  250. session |= TPMA_SESSION_DECRYPT;
  251. session |= TPMA_SESSION_AUDITRESET;
  252. rc = Tss2_MU_TPMA_SESSION_Unmarshal(buffer, 1, &offset, &session);
  253. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  254. assert_int_equal (offset, 1);
  255. }
  256. int main(void) {
  257. const struct CMUnitTest tests[] = {
  258. cmocka_unit_test (tpma_marshal_success),
  259. cmocka_unit_test (tpma_marshal_success_offset),
  260. cmocka_unit_test (tpma_marshal_buffer_null_with_offset),
  261. cmocka_unit_test (tpma_marshal_buffer_null_offset_null),
  262. cmocka_unit_test (tpma_marshal_buffer_size_lt_data_nad_lt_offset),
  263. cmocka_unit_test (tpma_unmarshal_success),
  264. cmocka_unit_test (tpma_unmarshal_dest_null_buff_null),
  265. cmocka_unit_test (tpma_unmarshal_buffer_null_offset_null),
  266. cmocka_unit_test (tpma_unmarshal_dest_null_offset_valid),
  267. cmocka_unit_test (tpma_unmarshal_buffer_size_lt_data_nad_lt_offset),
  268. };
  269. return cmocka_run_group_tests(tests, NULL, NULL);
  270. }