TPMS-marshal.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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. tpms_marshal_success(void **state)
  22. {
  23. TPMS_ALG_PROPERTY alg = {0};
  24. TPMS_CAPABILITY_DATA cap = {0};
  25. uint8_t buffer[sizeof(alg)] = { 0 };
  26. size_t buffer_size = sizeof(buffer);
  27. uint8_t buffer2[sizeof(cap)] = { 0 };
  28. size_t buffer_size2 = sizeof(buffer2);
  29. uint16_t *alg_ptr;
  30. uint32_t *alg_properties_ptr;
  31. TPMS_CAPABILITY_DATA *ptr2;
  32. uint16_t alg_expected = HOST_TO_BE_16(TPM2_ALG_ECDSA);
  33. uint32_t algprop_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  34. uint32_t capability = HOST_TO_BE_32(TPM2_CAP_ECC_CURVES);
  35. TSS2_RC rc;
  36. alg.alg = TPM2_ALG_ECDSA;
  37. alg.algProperties |= TPMA_ALGORITHM_ASYMMETRIC;
  38. alg.algProperties |= TPMA_ALGORITHM_SIGNING;
  39. alg_ptr = (uint16_t *)buffer;
  40. alg_properties_ptr = (uint32_t *)(buffer + sizeof(uint16_t));
  41. rc = Tss2_MU_TPMS_ALG_PROPERTY_Marshal(&alg, buffer, buffer_size, NULL);
  42. assert_int_equal (rc, TSS2_RC_SUCCESS);
  43. assert_int_equal (*alg_ptr, alg_expected);
  44. assert_int_equal (*alg_properties_ptr, algprop_expected);
  45. cap.capability = TPM2_CAP_ECC_CURVES;
  46. cap.data.eccCurves.count = 3;
  47. cap.data.eccCurves.eccCurves[0] = TPM2_ECC_NIST_P256;
  48. cap.data.eccCurves.eccCurves[1] = TPM2_ECC_NIST_P384;
  49. cap.data.eccCurves.eccCurves[2] = TPM2_ECC_NIST_P521;
  50. ptr2 = (TPMS_CAPABILITY_DATA *)buffer2;
  51. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&cap, buffer2, buffer_size2, NULL);
  52. assert_int_equal (rc, TSS2_RC_SUCCESS);
  53. assert_int_equal (ptr2->capability, capability);
  54. assert_int_equal (ptr2->data.eccCurves.count, HOST_TO_BE_32(3));
  55. assert_int_equal (ptr2->data.eccCurves.eccCurves[0], HOST_TO_BE_16(TPM2_ECC_NIST_P256));
  56. assert_int_equal (ptr2->data.eccCurves.eccCurves[1], HOST_TO_BE_16(TPM2_ECC_NIST_P384));
  57. assert_int_equal (ptr2->data.eccCurves.eccCurves[2], HOST_TO_BE_16(TPM2_ECC_NIST_P521));
  58. }
  59. /*
  60. * Success case with a valid offset
  61. */
  62. static void
  63. tpms_marshal_success_offset(void **state)
  64. {
  65. TPMS_ALG_PROPERTY alg = {0};
  66. TPMS_CAPABILITY_DATA cap = {0};
  67. uint8_t buffer[sizeof(alg) + sizeof(cap) + 10] = { 0 };
  68. size_t buffer_size = sizeof(buffer);
  69. uint16_t *alg_ptr;
  70. uint32_t *alg_properties_ptr;
  71. TPMS_CAPABILITY_DATA *ptr2;
  72. uint16_t alg_expected = HOST_TO_BE_16(TPM2_ALG_ECDSA);
  73. uint32_t algprop_expected = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  74. uint32_t capability = HOST_TO_BE_32(TPM2_CAP_ECC_CURVES);
  75. size_t offset = 10;
  76. TSS2_RC rc;
  77. alg.alg = TPM2_ALG_ECDSA;
  78. alg.algProperties |= TPMA_ALGORITHM_ASYMMETRIC;
  79. alg.algProperties |= TPMA_ALGORITHM_SIGNING;
  80. alg_ptr = (uint16_t *)(buffer + 10);
  81. alg_properties_ptr = (uint32_t *)(buffer + sizeof(*alg_ptr) + 10);
  82. rc = Tss2_MU_TPMS_ALG_PROPERTY_Marshal(&alg, buffer, buffer_size, &offset);
  83. assert_int_equal (rc, TSS2_RC_SUCCESS);
  84. assert_int_equal (*alg_ptr, alg_expected);
  85. assert_int_equal (*alg_properties_ptr, algprop_expected);
  86. cap.capability = TPM2_CAP_ECC_CURVES;
  87. cap.data.eccCurves.count = 3;
  88. cap.data.eccCurves.eccCurves[0] = TPM2_ECC_NIST_P256;
  89. cap.data.eccCurves.eccCurves[1] = TPM2_ECC_NIST_P384;
  90. cap.data.eccCurves.eccCurves[2] = TPM2_ECC_NIST_P521;
  91. ptr2 = (TPMS_CAPABILITY_DATA *)(buffer + 10 + sizeof(*alg_ptr) + sizeof(*alg_properties_ptr));
  92. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&cap, buffer, buffer_size, &offset);
  93. assert_int_equal (rc, TSS2_RC_SUCCESS);
  94. assert_int_equal (ptr2->capability, capability);
  95. assert_int_equal (ptr2->data.eccCurves.count, HOST_TO_BE_32(3));
  96. assert_int_equal (ptr2->data.eccCurves.eccCurves[0], HOST_TO_BE_16(TPM2_ECC_NIST_P256));
  97. assert_int_equal (ptr2->data.eccCurves.eccCurves[1], HOST_TO_BE_16(TPM2_ECC_NIST_P384));
  98. assert_int_equal (ptr2->data.eccCurves.eccCurves[2], HOST_TO_BE_16(TPM2_ECC_NIST_P521));
  99. assert_int_equal (offset, 10 + sizeof(*alg_ptr) + sizeof(*alg_properties_ptr) + sizeof(capability) + 4 + (3 * 2));
  100. }
  101. /*
  102. * Success case with a null buffer
  103. */
  104. static void
  105. tpms_marshal_buffer_null_with_offset(void **state)
  106. {
  107. TPMS_ALG_PROPERTY alg = {0};
  108. TPMS_CAPABILITY_DATA cap = {0};
  109. uint16_t *alg_ptr;
  110. uint32_t *alg_properties_ptr;
  111. size_t offset = 100;
  112. TSS2_RC rc;
  113. alg.alg = TPM2_ALG_ECDSA;
  114. alg.algProperties |= TPMA_ALGORITHM_ASYMMETRIC;
  115. alg.algProperties |= TPMA_ALGORITHM_SIGNING;
  116. rc = Tss2_MU_TPMS_ALG_PROPERTY_Marshal(&alg, NULL, sizeof(alg), &offset);
  117. assert_int_equal (rc, TSS2_RC_SUCCESS);
  118. assert_int_equal (offset, 100 + sizeof(*alg_ptr) + sizeof(*alg_properties_ptr));
  119. cap.capability = TPM2_CAP_ECC_CURVES;
  120. cap.data.eccCurves.count = 3;
  121. cap.data.eccCurves.eccCurves[0] = TPM2_ECC_NIST_P256;
  122. cap.data.eccCurves.eccCurves[1] = TPM2_ECC_NIST_P384;
  123. cap.data.eccCurves.eccCurves[2] = TPM2_ECC_NIST_P521;
  124. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&cap, NULL, sizeof(cap), &offset);
  125. assert_int_equal (rc, TSS2_RC_SUCCESS);
  126. assert_int_equal (offset, 100 + sizeof(*alg_ptr) + sizeof(*alg_properties_ptr) + 4 + 4 + (3 * 2));
  127. }
  128. /*
  129. * Invalid case with a null buffer and a null offset
  130. */
  131. static void
  132. tpms_marshal_buffer_null_offset_null(void **state)
  133. {
  134. TPMS_ALG_PROPERTY alg = {0};
  135. TPMS_CAPABILITY_DATA cap = {0};
  136. TSS2_RC rc;
  137. rc = Tss2_MU_TPMS_ALG_PROPERTY_Marshal(&alg, NULL, sizeof(alg), NULL);
  138. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  139. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&cap, NULL, sizeof(cap), NULL);
  140. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  141. }
  142. /*
  143. * Invalid case with not big enough buffer
  144. */
  145. static void
  146. tpms_marshal_buffer_size_lt_data_nad_lt_offset(void **state)
  147. {
  148. TPMS_ALG_PROPERTY alg = {0};
  149. TPMS_CAPABILITY_DATA cap = {0};
  150. uint8_t buffer[sizeof(alg) + sizeof(cap)] = { 0 };
  151. size_t buffer_size = sizeof(alg);
  152. size_t offset = 10;
  153. TSS2_RC rc;
  154. alg.alg = TPM2_ALG_ECDSA;
  155. alg.algProperties |= TPMA_ALGORITHM_ASYMMETRIC;
  156. alg.algProperties |= TPMA_ALGORITHM_SIGNING;
  157. rc = Tss2_MU_TPMS_ALG_PROPERTY_Marshal(&alg, buffer, buffer_size, &offset);
  158. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  159. assert_int_equal (offset, 10);
  160. buffer_size = 4;
  161. offset = 2;
  162. cap.capability = TPM2_CAP_ECC_CURVES;
  163. cap.data.eccCurves.count = 3;
  164. cap.data.eccCurves.eccCurves[0] = TPM2_ECC_NIST_P256;
  165. cap.data.eccCurves.eccCurves[1] = TPM2_ECC_NIST_P384;
  166. cap.data.eccCurves.eccCurves[2] = TPM2_ECC_NIST_P521;
  167. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Marshal(&cap, buffer, buffer_size, &offset);
  168. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  169. assert_int_equal (offset, 2);
  170. }
  171. /*
  172. * Success case
  173. */
  174. static void
  175. tpms_unmarshal_success(void **state)
  176. {
  177. TPMS_ALG_PROPERTY alg = {0};
  178. TPMS_CAPABILITY_DATA cap = {0};
  179. uint8_t buffer[sizeof(alg) + sizeof(cap)] = { 0 };
  180. size_t buffer_size = sizeof(buffer);
  181. uint16_t *alg_ptr;
  182. uint32_t *alg_properties_ptr;
  183. TPMS_CAPABILITY_DATA *ptr2;
  184. uint16_t alg_expected = TPM2_ALG_ECDSA;
  185. uint32_t algprop_expected = TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING;
  186. uint32_t capability = TPM2_CAP_ECC_CURVES;
  187. size_t offset = 0;
  188. TSS2_RC rc;
  189. alg_ptr = (uint16_t *) buffer;
  190. *alg_ptr = HOST_TO_BE_16(TPM2_ALG_ECDSA);
  191. alg_properties_ptr = (uint32_t *) (buffer + sizeof(*alg_ptr));
  192. *alg_properties_ptr = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  193. rc = Tss2_MU_TPMS_ALG_PROPERTY_Unmarshal(buffer, buffer_size, &offset, &alg);
  194. assert_int_equal (rc, TSS2_RC_SUCCESS);
  195. assert_int_equal (alg.alg, alg_expected);
  196. assert_int_equal (alg.algProperties, algprop_expected);
  197. ptr2 = (TPMS_CAPABILITY_DATA *)(buffer + sizeof(alg));
  198. ptr2->capability = HOST_TO_BE_32(TPM2_CAP_ECC_CURVES);
  199. ptr2->data.eccCurves.count = HOST_TO_BE_32(3);
  200. ptr2->data.eccCurves.eccCurves[0] = HOST_TO_BE_16(TPM2_ECC_NIST_P256);
  201. ptr2->data.eccCurves.eccCurves[1] = HOST_TO_BE_16(TPM2_ECC_NIST_P384);
  202. ptr2->data.eccCurves.eccCurves[2] = HOST_TO_BE_16(TPM2_ECC_NIST_P521);
  203. offset = sizeof(alg);
  204. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Unmarshal(buffer, buffer_size, &offset, &cap);
  205. assert_int_equal (rc, TSS2_RC_SUCCESS);
  206. assert_int_equal (cap.capability, capability);
  207. assert_int_equal (cap.data.eccCurves.count, 3);
  208. assert_int_equal (cap.data.eccCurves.eccCurves[0], TPM2_ECC_NIST_P256);
  209. assert_int_equal (cap.data.eccCurves.eccCurves[1], TPM2_ECC_NIST_P384);
  210. assert_int_equal (cap.data.eccCurves.eccCurves[2], TPM2_ECC_NIST_P521);
  211. assert_int_equal (offset, sizeof(alg) + sizeof(capability) + 4 + (3 * 2));
  212. }
  213. /*
  214. * Invalid test case with buffer null and dest null
  215. */
  216. static void
  217. tpms_unmarshal_dest_null_buff_null(void **state)
  218. {
  219. size_t offset = 1;
  220. TSS2_RC rc;
  221. rc = Tss2_MU_TPMS_ALG_PROPERTY_Unmarshal(NULL, 120, &offset, NULL);
  222. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  223. assert_int_equal (offset, 1);
  224. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Unmarshal(NULL, 120, &offset, NULL);
  225. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  226. assert_int_equal (offset, 1);
  227. }
  228. /*
  229. * Invalid test case with offset null and dest null
  230. */
  231. static void
  232. tpms_unmarshal_buffer_null_offset_null(void **state)
  233. {
  234. uint8_t buffer[sizeof(TPMS_ALG_PROPERTY) + sizeof(TPMS_CAPABILITY_DATA)] = { 0 };
  235. size_t buffer_size = sizeof(buffer);
  236. TSS2_RC rc;
  237. rc = Tss2_MU_TPMS_ALG_PROPERTY_Unmarshal(buffer, buffer_size, NULL, NULL);
  238. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  239. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Unmarshal(buffer, buffer_size, NULL, NULL);
  240. assert_int_equal (rc, TSS2_MU_RC_BAD_REFERENCE);
  241. }
  242. /*
  243. * Test case ensures the offset is updated when dest is NULL
  244. * and offset is valid
  245. */
  246. static void
  247. tpms_unmarshal_dest_null_offset_valid(void **state)
  248. {
  249. uint8_t buffer[sizeof(TPMS_ALG_PROPERTY) + sizeof(TPMS_CAPABILITY_DATA)] = { 0 };
  250. size_t buffer_size = sizeof(buffer);
  251. uint16_t *alg_ptr;
  252. uint32_t *alg_properties_ptr;
  253. TPMS_CAPABILITY_DATA *ptr2;
  254. size_t offset = 0;
  255. TSS2_RC rc;
  256. alg_ptr = (uint16_t *) buffer;
  257. *alg_ptr = HOST_TO_BE_16(TPM2_ALG_ECDSA);
  258. alg_properties_ptr = (uint32_t *) (buffer + sizeof(*alg_ptr));
  259. *alg_properties_ptr = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  260. rc = Tss2_MU_TPMS_ALG_PROPERTY_Unmarshal(buffer, buffer_size, &offset, NULL);
  261. assert_int_equal (rc, TSS2_RC_SUCCESS);
  262. assert_int_equal (offset, sizeof(*alg_ptr) + sizeof(*alg_properties_ptr));
  263. ptr2 = (TPMS_CAPABILITY_DATA *)(buffer + sizeof(TPMS_ALG_PROPERTY));
  264. ptr2->capability = HOST_TO_BE_32(TPM2_CAP_ECC_CURVES);
  265. ptr2->data.eccCurves.count = HOST_TO_BE_32(3);
  266. ptr2->data.eccCurves.eccCurves[0] = HOST_TO_BE_16(TPM2_ECC_NIST_P256);
  267. ptr2->data.eccCurves.eccCurves[1] = HOST_TO_BE_16(TPM2_ECC_NIST_P384);
  268. ptr2->data.eccCurves.eccCurves[2] = HOST_TO_BE_16(TPM2_ECC_NIST_P521);
  269. offset = sizeof(TPMS_ALG_PROPERTY);
  270. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Unmarshal(buffer, buffer_size, &offset, NULL);
  271. assert_int_equal (rc, TSS2_RC_SUCCESS);
  272. assert_int_equal (offset, sizeof(TPMS_ALG_PROPERTY) + 4 + 4 + (3 * 2));
  273. }
  274. /*
  275. * Invalid case with not big enough buffer. Make sure offest is untouched.
  276. */
  277. static void
  278. tpms_unmarshal_buffer_size_lt_data_nad_lt_offset(void **state)
  279. {
  280. TPMS_ALG_PROPERTY alg = {0};
  281. TPMS_CAPABILITY_DATA cap = {0};
  282. uint8_t buffer[sizeof(alg) + sizeof(cap) + 3] = { 0 };
  283. TPMS_ALG_PROPERTY *ptr;
  284. TPMS_CAPABILITY_DATA *ptr2;
  285. size_t offset = 3;
  286. TSS2_RC rc;
  287. ptr = (TPMS_ALG_PROPERTY *) buffer;
  288. ptr->alg = HOST_TO_BE_16(TPM2_ALG_ECDSA);
  289. ptr->algProperties = HOST_TO_BE_32(TPMA_ALGORITHM_ASYMMETRIC | TPMA_ALGORITHM_SIGNING);
  290. rc = Tss2_MU_TPMS_ALG_PROPERTY_Unmarshal(buffer, sizeof(alg), &offset, &alg);
  291. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  292. assert_int_equal (offset, 3);
  293. offset = sizeof(alg);
  294. ptr2 = (TPMS_CAPABILITY_DATA *)(buffer + sizeof(alg) + 3);
  295. ptr2->capability = HOST_TO_BE_32(TPM2_CAP_ECC_CURVES);
  296. ptr2->data.eccCurves.count = HOST_TO_BE_32(3);
  297. ptr2->data.eccCurves.eccCurves[0] = HOST_TO_BE_16(TPM2_ECC_NIST_P256);
  298. ptr2->data.eccCurves.eccCurves[1] = HOST_TO_BE_16(TPM2_ECC_NIST_P384);
  299. ptr2->data.eccCurves.eccCurves[2] = HOST_TO_BE_16(TPM2_ECC_NIST_P521);
  300. rc = Tss2_MU_TPMS_CAPABILITY_DATA_Unmarshal(buffer, 14, &offset, &cap);
  301. assert_int_equal (rc, TSS2_MU_RC_INSUFFICIENT_BUFFER);
  302. assert_int_equal (offset, sizeof(alg));
  303. }
  304. int main(void) {
  305. const struct CMUnitTest tests[] = {
  306. cmocka_unit_test (tpms_marshal_success),
  307. cmocka_unit_test (tpms_marshal_success_offset),
  308. cmocka_unit_test (tpms_marshal_buffer_null_with_offset),
  309. cmocka_unit_test (tpms_marshal_buffer_null_offset_null),
  310. cmocka_unit_test (tpms_marshal_buffer_size_lt_data_nad_lt_offset),
  311. cmocka_unit_test (tpms_unmarshal_success),
  312. cmocka_unit_test (tpms_unmarshal_dest_null_buff_null),
  313. cmocka_unit_test (tpms_unmarshal_buffer_null_offset_null),
  314. cmocka_unit_test (tpms_unmarshal_dest_null_offset_valid),
  315. cmocka_unit_test (tpms_unmarshal_buffer_size_lt_data_nad_lt_offset),
  316. };
  317. return cmocka_run_group_tests(tests, NULL, NULL);
  318. }