policy_tests.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2020-2024 Microsoft Corporation. All rights reserved.
  4. */
  5. #include <linux/slab.h>
  6. #include <linux/types.h>
  7. #include <linux/list.h>
  8. #include <kunit/test.h>
  9. #include "policy.h"
  10. struct policy_case {
  11. const char *const policy;
  12. int errno;
  13. const char *const desc;
  14. };
  15. static const struct policy_case policy_cases[] = {
  16. {
  17. "policy_name=allowall policy_version=0.0.0\n"
  18. "DEFAULT action=ALLOW",
  19. 0,
  20. "basic",
  21. },
  22. {
  23. "policy_name=trailing_comment policy_version=152.0.0 #This is comment\n"
  24. "DEFAULT action=ALLOW",
  25. 0,
  26. "trailing comment",
  27. },
  28. {
  29. "policy_name=allowallnewline policy_version=0.2.0\n"
  30. "DEFAULT action=ALLOW\n"
  31. "\n",
  32. 0,
  33. "trailing newline",
  34. },
  35. {
  36. "policy_name=carriagereturnlinefeed policy_version=0.0.1\n"
  37. "DEFAULT action=ALLOW\n"
  38. "\r\n",
  39. 0,
  40. "clrf newline",
  41. },
  42. {
  43. "policy_name=whitespace policy_version=0.0.0\n"
  44. "DEFAULT\taction=ALLOW\n"
  45. " \t DEFAULT \t op=EXECUTE action=DENY\n"
  46. "op=EXECUTE boot_verified=TRUE action=ALLOW\n"
  47. "# this is a\tcomment\t\t\t\t\n"
  48. "DEFAULT \t op=KMODULE\t\t\t action=DENY\r\n"
  49. "op=KMODULE boot_verified=TRUE action=ALLOW\n",
  50. 0,
  51. "various whitespaces and nested default",
  52. },
  53. {
  54. "policy_name=boot_verified policy_version=-1236.0.0\n"
  55. "DEFAULT\taction=ALLOW\n",
  56. -EINVAL,
  57. "negative version",
  58. },
  59. {
  60. "policy_name=$@!*&^%%\\:;{}() policy_version=0.0.0\n"
  61. "DEFAULT action=ALLOW",
  62. 0,
  63. "special characters",
  64. },
  65. {
  66. "policy_name=test policy_version=999999.0.0\n"
  67. "DEFAULT action=ALLOW",
  68. -ERANGE,
  69. "overflow version",
  70. },
  71. {
  72. "policy_name=test policy_version=255.0\n"
  73. "DEFAULT action=ALLOW",
  74. -EBADMSG,
  75. "incomplete version",
  76. },
  77. {
  78. "policy_name=test policy_version=111.0.0.0\n"
  79. "DEFAULT action=ALLOW",
  80. -EBADMSG,
  81. "extra version",
  82. },
  83. {
  84. "",
  85. -EBADMSG,
  86. "0-length policy",
  87. },
  88. {
  89. "policy_name=test\0policy_version=0.0.0\n"
  90. "DEFAULT action=ALLOW",
  91. -EBADMSG,
  92. "random null in header",
  93. },
  94. {
  95. "policy_name=test policy_version=0.0.0\n"
  96. "\0DEFAULT action=ALLOW",
  97. -EBADMSG,
  98. "incomplete policy from NULL",
  99. },
  100. {
  101. "policy_name=test policy_version=0.0.0\n"
  102. "DEFAULT action=DENY\n\0"
  103. "op=EXECUTE dmverity_signature=TRUE action=ALLOW\n",
  104. 0,
  105. "NULL truncates policy",
  106. },
  107. {
  108. "policy_name=test policy_version=0.0.0\n"
  109. "DEFAULT action=ALLOW\n"
  110. "op=EXECUTE dmverity_signature=abc action=ALLOW",
  111. -EBADMSG,
  112. "invalid property type",
  113. },
  114. {
  115. "DEFAULT action=ALLOW",
  116. -EBADMSG,
  117. "missing policy header",
  118. },
  119. {
  120. "policy_name=test policy_version=0.0.0\n",
  121. -EBADMSG,
  122. "missing default definition",
  123. },
  124. {
  125. "policy_name=test policy_version=0.0.0\n"
  126. "DEFAULT action=ALLOW\n"
  127. "dmverity_signature=TRUE op=EXECUTE action=ALLOW",
  128. -EBADMSG,
  129. "invalid rule ordering"
  130. },
  131. {
  132. "policy_name=test policy_version=0.0.0\n"
  133. "DEFAULT action=ALLOW\n"
  134. "action=ALLOW op=EXECUTE dmverity_signature=TRUE",
  135. -EBADMSG,
  136. "invalid rule ordering (2)",
  137. },
  138. {
  139. "policy_name=test policy_version=0.0\n"
  140. "DEFAULT action=ALLOW\n"
  141. "op=EXECUTE dmverity_signature=TRUE action=ALLOW",
  142. -EBADMSG,
  143. "invalid version",
  144. },
  145. {
  146. "policy_name=test policy_version=0.0.0\n"
  147. "DEFAULT action=ALLOW\n"
  148. "op=UNKNOWN dmverity_signature=TRUE action=ALLOW",
  149. -EBADMSG,
  150. "unknown operation",
  151. },
  152. {
  153. "policy_name=asdvpolicy_version=0.0.0\n"
  154. "DEFAULT action=ALLOW\n",
  155. -EBADMSG,
  156. "missing space after policy name",
  157. },
  158. {
  159. "policy_name=test\xFF\xEF policy_version=0.0.0\n"
  160. "DEFAULT action=ALLOW\n"
  161. "op=EXECUTE dmverity_signature=TRUE action=ALLOW",
  162. 0,
  163. "expanded ascii",
  164. },
  165. {
  166. "policy_name=test\xFF\xEF policy_version=0.0.0\n"
  167. "DEFAULT action=ALLOW\n"
  168. "op=EXECUTE dmverity_roothash=GOOD_DOG action=ALLOW",
  169. -EBADMSG,
  170. "invalid property value (2)",
  171. },
  172. {
  173. "policy_name=test policy_version=0.0.0\n"
  174. "policy_name=test policy_version=0.1.0\n"
  175. "DEFAULT action=ALLOW",
  176. -EBADMSG,
  177. "double header"
  178. },
  179. {
  180. "policy_name=test policy_version=0.0.0\n"
  181. "DEFAULT action=ALLOW\n"
  182. "DEFAULT action=ALLOW\n",
  183. -EBADMSG,
  184. "double default"
  185. },
  186. {
  187. "policy_name=test policy_version=0.0.0\n"
  188. "DEFAULT action=ALLOW\n"
  189. "DEFAULT op=EXECUTE action=DENY\n"
  190. "DEFAULT op=EXECUTE action=ALLOW\n",
  191. -EBADMSG,
  192. "double operation default"
  193. },
  194. {
  195. "policy_name=test policy_version=0.0.0\n"
  196. "DEFAULT action=ALLOW\n"
  197. "DEFAULT op=EXECUTE action=DEN\n",
  198. -EBADMSG,
  199. "invalid action value"
  200. },
  201. {
  202. "policy_name=test policy_version=0.0.0\n"
  203. "DEFAULT action=ALLOW\n"
  204. "DEFAULT op=EXECUTE action\n",
  205. -EBADMSG,
  206. "invalid action value (2)"
  207. },
  208. {
  209. "policy_name=test policy_version=0.0.0\n"
  210. "DEFAULT action=ALLOW\n"
  211. "UNKNOWN value=true\n",
  212. -EBADMSG,
  213. "unrecognized statement"
  214. },
  215. {
  216. "policy_name=test policy_version=0.0.0\n"
  217. "DEFAULT action=ALLOW\n"
  218. "op=EXECUTE dmverity_roothash=1c0d7ee1f8343b7fbe418378e8eb22c061d7dec7 action=DENY\n",
  219. -EBADMSG,
  220. "old-style digest"
  221. },
  222. {
  223. "policy_name=test policy_version=0.0.0\n"
  224. "DEFAULT action=ALLOW\n"
  225. "op=EXECUTE fsverity_digest=1c0d7ee1f8343b7fbe418378e8eb22c061d7dec7 action=DENY\n",
  226. -EBADMSG,
  227. "old-style digest"
  228. }
  229. };
  230. static void pol_to_desc(const struct policy_case *c, char *desc)
  231. {
  232. strscpy(desc, c->desc, KUNIT_PARAM_DESC_SIZE);
  233. }
  234. KUNIT_ARRAY_PARAM(ipe_policies, policy_cases, pol_to_desc);
  235. /**
  236. * ipe_parser_unsigned_test - Test the parser by passing unsigned policies.
  237. * @test: Supplies a pointer to a kunit structure.
  238. *
  239. * This is called by the kunit harness. This test does not check the correctness
  240. * of the policy, but ensures that errors are handled correctly.
  241. */
  242. static void ipe_parser_unsigned_test(struct kunit *test)
  243. {
  244. const struct policy_case *p = test->param_value;
  245. struct ipe_policy *pol;
  246. pol = ipe_new_policy(p->policy, strlen(p->policy), NULL, 0);
  247. if (p->errno) {
  248. KUNIT_EXPECT_EQ(test, PTR_ERR(pol), p->errno);
  249. return;
  250. }
  251. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pol);
  252. KUNIT_EXPECT_NOT_ERR_OR_NULL(test, pol->parsed);
  253. KUNIT_EXPECT_STREQ(test, pol->text, p->policy);
  254. KUNIT_EXPECT_PTR_EQ(test, NULL, pol->pkcs7);
  255. KUNIT_EXPECT_EQ(test, 0, pol->pkcs7len);
  256. ipe_free_policy(pol);
  257. }
  258. /**
  259. * ipe_parser_widestring_test - Ensure parser fail on a wide string policy.
  260. * @test: Supplies a pointer to a kunit structure.
  261. *
  262. * This is called by the kunit harness.
  263. */
  264. static void ipe_parser_widestring_test(struct kunit *test)
  265. {
  266. const unsigned short policy[] = L"policy_name=Test policy_version=0.0.0\n"
  267. L"DEFAULT action=ALLOW";
  268. struct ipe_policy *pol = NULL;
  269. pol = ipe_new_policy((const char *)policy, (ARRAY_SIZE(policy) - 1) * 2, NULL, 0);
  270. KUNIT_EXPECT_TRUE(test, IS_ERR_OR_NULL(pol));
  271. ipe_free_policy(pol);
  272. }
  273. static struct kunit_case ipe_parser_test_cases[] = {
  274. KUNIT_CASE_PARAM(ipe_parser_unsigned_test, ipe_policies_gen_params),
  275. KUNIT_CASE(ipe_parser_widestring_test),
  276. { }
  277. };
  278. static struct kunit_suite ipe_parser_test_suite = {
  279. .name = "ipe-parser",
  280. .test_cases = ipe_parser_test_cases,
  281. };
  282. kunit_test_suite(ipe_parser_test_suite);