test_efuse_keys.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /*
  2. * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <ctype.h>
  8. #include <errno.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "unity.h"
  13. #include "test_utils.h"
  14. #include "esp_log.h"
  15. #include "esp_efuse.h"
  16. #include "esp_efuse_table.h"
  17. #include "esp_efuse_utility.h"
  18. #include "sdkconfig.h"
  19. __attribute__((unused)) static const char* TAG = "efuse_test";
  20. #ifndef CONFIG_IDF_TARGET_ESP32
  21. TEST_CASE("Test keys and purposes, rd, wr, wr_key_purposes are in the initial state", "[efuse]")
  22. {
  23. esp_efuse_utility_reset();
  24. esp_efuse_utility_update_virt_blocks();
  25. esp_efuse_utility_debug_dump_blocks();
  26. for (esp_efuse_block_t num_key = EFUSE_BLK_KEY0; num_key < EFUSE_BLK_KEY_MAX; ++num_key) {
  27. printf("EFUSE_BLK_KEY%d, RD, WR, PURPOSE_USER, PURPOSE_USER WR ... \n", num_key - EFUSE_BLK_KEY0);
  28. uint8_t key[32] = { 0xEE };
  29. TEST_ESP_OK(esp_efuse_read_field_blob(esp_efuse_get_key(num_key), &key, sizeof(key) * 8));
  30. TEST_ASSERT_EACH_EQUAL_HEX8(0, key, sizeof(key));
  31. TEST_ASSERT_FALSE(esp_efuse_get_key_dis_read(num_key));
  32. TEST_ASSERT_FALSE(esp_efuse_get_key_dis_write(num_key));
  33. TEST_ASSERT_EQUAL(ESP_EFUSE_KEY_PURPOSE_USER, esp_efuse_get_key_purpose(num_key));
  34. TEST_ASSERT_FALSE(esp_efuse_get_keypurpose_dis_write(num_key));
  35. esp_efuse_block_t key_block = EFUSE_BLK_MAX;
  36. TEST_ASSERT_TRUE(esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_USER, NULL));
  37. TEST_ASSERT_TRUE(esp_efuse_find_purpose(ESP_EFUSE_KEY_PURPOSE_USER, &key_block));
  38. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY0, key_block);
  39. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY0, esp_efuse_find_unused_key_block());
  40. printf("EFUSE_BLK_KEY%d, RD, WR, PURPOSE_USER, PURPOSE_USER WR ... OK\n", num_key - EFUSE_BLK_KEY0);
  41. }
  42. }
  43. // If using efuse is real, then turn off writing tests.
  44. #if CONFIG_EFUSE_VIRTUAL || CONFIG_IDF_ENV_FPGA
  45. static esp_err_t s_check_key(esp_efuse_block_t num_key, void* wr_key)
  46. {
  47. uint8_t rd_key[32] = { 0xEE };
  48. esp_efuse_purpose_t purpose = esp_efuse_get_key_purpose(num_key);
  49. TEST_ESP_OK(esp_efuse_read_field_blob(esp_efuse_get_key(num_key), &rd_key, sizeof(rd_key) * 8));
  50. #ifndef CONFIG_IDF_ENV_FPGA
  51. TEST_ASSERT_EQUAL_HEX8_ARRAY(wr_key, rd_key, sizeof(wr_key));
  52. #endif // not CONFIG_IDF_ENV_FPGA
  53. TEST_ASSERT_TRUE(esp_efuse_get_key_dis_write(num_key));
  54. if (purpose == ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY ||
  55. #ifdef SOC_FLASH_ENCRYPTION_XTS_AES_256
  56. purpose == ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1 ||
  57. purpose == ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2 ||
  58. #endif
  59. purpose == ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL ||
  60. purpose == ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG ||
  61. purpose == ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_DIGITAL_SIGNATURE ||
  62. purpose == ESP_EFUSE_KEY_PURPOSE_HMAC_UP) {
  63. TEST_ASSERT_TRUE(esp_efuse_get_key_dis_read(num_key));
  64. #if CONFIG_IDF_ENV_FPGA && !CONFIG_EFUSE_VIRTUAL
  65. TEST_ASSERT_EACH_EQUAL_HEX8(0, rd_key, sizeof(rd_key));
  66. #endif // CONFIG_IDF_ENV_FPGA && ! CONFIG_EFUSE_VIRTUAL
  67. } else {
  68. TEST_ASSERT_FALSE(esp_efuse_get_key_dis_read(num_key));
  69. TEST_ASSERT_EQUAL_HEX8_ARRAY(wr_key, rd_key, sizeof(wr_key));
  70. }
  71. TEST_ASSERT_EQUAL(purpose, esp_efuse_get_key_purpose(num_key));
  72. esp_efuse_purpose_t purpose2 = 0;
  73. TEST_ESP_OK(esp_efuse_read_field_blob(esp_efuse_get_purpose_field(num_key), &purpose2, 4));
  74. TEST_ASSERT_EQUAL(purpose, purpose2);
  75. TEST_ASSERT_TRUE(esp_efuse_get_keypurpose_dis_write(num_key));
  76. return ESP_OK;
  77. }
  78. void test_write_key(esp_efuse_block_t num_key, esp_efuse_purpose_t purpose) {
  79. int id = num_key - EFUSE_BLK_KEY0;
  80. printf("EFUSE_BLK_KEY%d, purpose=%d ... \n", id, purpose);
  81. uint8_t wr_key[32];
  82. for (int i = 0; i < sizeof(wr_key); i++) {
  83. wr_key[i] = id + 1 + i;
  84. }
  85. TEST_ASSERT_TRUE(esp_efuse_key_block_unused(num_key));
  86. TEST_ESP_OK(esp_efuse_write_key(num_key, purpose, &wr_key, sizeof(wr_key)));
  87. TEST_ESP_ERR(ESP_ERR_INVALID_STATE, esp_efuse_write_key(num_key, purpose, &wr_key, sizeof(wr_key)));
  88. TEST_ESP_OK(s_check_key(num_key, wr_key));
  89. TEST_ASSERT_FALSE(esp_efuse_key_block_unused(num_key));
  90. printf("EFUSE_BLK_KEY%d, purpose=%d ... OK\n", id, purpose);
  91. }
  92. #ifndef CONFIG_IDF_ENV_FPGA
  93. TEST_CASE("Test esp_efuse_write_key for virt mode", "[efuse]")
  94. {
  95. uint8_t rd_key[32] = { 0xEE };
  96. int tmp_purpose = 0;
  97. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_key(EFUSE_BLK3, tmp_purpose, &rd_key, sizeof(rd_key)));
  98. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_key(EFUSE_BLK_KEY0, tmp_purpose, &rd_key, 33));
  99. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_key(EFUSE_BLK10, tmp_purpose, &rd_key, sizeof(rd_key)));
  100. for (esp_efuse_purpose_t purpose = ESP_EFUSE_KEY_PURPOSE_RESERVED; purpose < ESP_EFUSE_KEY_PURPOSE_MAX; ++purpose) {
  101. esp_efuse_utility_reset();
  102. esp_efuse_utility_update_virt_blocks();
  103. esp_efuse_utility_debug_dump_blocks();
  104. TEST_ASSERT_FALSE(esp_efuse_find_purpose(purpose, NULL));
  105. for (esp_efuse_block_t num_key = (EFUSE_BLK_KEY_MAX - 1); num_key >= EFUSE_BLK_KEY0; --num_key) {
  106. int id = num_key - EFUSE_BLK_KEY0;
  107. TEST_ASSERT_EQUAL(id + 1, esp_efuse_count_unused_key_blocks());
  108. test_write_key(num_key, purpose);
  109. TEST_ASSERT_EQUAL(id, esp_efuse_count_unused_key_blocks());
  110. esp_efuse_block_t key_block = EFUSE_BLK_KEY_MAX;
  111. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose, &key_block));
  112. TEST_ASSERT_EQUAL(num_key, key_block);
  113. }
  114. esp_efuse_utility_debug_dump_blocks();
  115. }
  116. }
  117. #endif // not CONFIG_IDF_ENV_FPGA
  118. TEST_CASE("Test 1 esp_efuse_write_key for FPGA", "[efuse]")
  119. {
  120. esp_efuse_utility_reset();
  121. esp_efuse_utility_update_virt_blocks();
  122. esp_efuse_utility_debug_dump_blocks();
  123. TEST_ASSERT_EQUAL_MESSAGE(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0, esp_efuse_count_unused_key_blocks(), "Efuses should be in initial state");
  124. esp_efuse_purpose_t purpose [] = {
  125. ESP_EFUSE_KEY_PURPOSE_USER,
  126. ESP_EFUSE_KEY_PURPOSE_RESERVED,
  127. #ifdef SOC_FLASH_ENCRYPTION_XTS_AES_256
  128. ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1,
  129. ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2,
  130. #else
  131. ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
  132. ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
  133. #endif
  134. ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
  135. ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_ALL,
  136. };
  137. int max_keys = EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0;
  138. for (esp_efuse_block_t num_key = EFUSE_BLK_KEY0; num_key < EFUSE_BLK_KEY_MAX; ++num_key) {
  139. int id = num_key - EFUSE_BLK_KEY0;
  140. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - num_key, esp_efuse_count_unused_key_blocks());
  141. test_write_key(num_key, purpose[id]);
  142. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - num_key - 1, esp_efuse_count_unused_key_blocks());
  143. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose[id], NULL));
  144. TEST_ASSERT_EQUAL(--max_keys, esp_efuse_count_unused_key_blocks());
  145. }
  146. esp_efuse_utility_debug_dump_blocks();
  147. printf("reset efuses on the FPGA board for the next test\n");
  148. }
  149. TEST_CASE("Test 2 esp_efuse_write_key for FPGA", "[efuse]")
  150. {
  151. esp_efuse_utility_reset();
  152. esp_efuse_utility_update_virt_blocks();
  153. esp_efuse_utility_debug_dump_blocks();
  154. TEST_ASSERT_EQUAL_MESSAGE(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0, esp_efuse_count_unused_key_blocks(), "Efuses should be in initial state");
  155. esp_efuse_purpose_t purpose [] = {
  156. ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_JTAG,
  157. ESP_EFUSE_KEY_PURPOSE_HMAC_DOWN_DIGITAL_SIGNATURE,
  158. ESP_EFUSE_KEY_PURPOSE_HMAC_UP,
  159. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST0,
  160. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST1,
  161. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST2,
  162. };
  163. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY0, esp_efuse_find_unused_key_block());
  164. int max_keys = EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0;
  165. for (esp_efuse_block_t num_key = EFUSE_BLK_KEY0; num_key < EFUSE_BLK_KEY_MAX; ++num_key) {
  166. int id = num_key - EFUSE_BLK_KEY0;
  167. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - num_key, esp_efuse_count_unused_key_blocks());
  168. test_write_key(num_key, purpose[id]);
  169. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - num_key - 1, esp_efuse_count_unused_key_blocks());
  170. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose[id], NULL));
  171. TEST_ASSERT_EQUAL(--max_keys, esp_efuse_count_unused_key_blocks());
  172. if (esp_efuse_count_unused_key_blocks()) {
  173. TEST_ASSERT_EQUAL(num_key + 1, esp_efuse_find_unused_key_block());
  174. } else {
  175. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX, esp_efuse_find_unused_key_block());
  176. }
  177. }
  178. esp_efuse_utility_debug_dump_blocks();
  179. printf("reset efuses on the FPGA board for the next test\n");
  180. }
  181. TEST_CASE("Test esp_efuse_write_keys", "[efuse]")
  182. {
  183. esp_efuse_utility_reset();
  184. esp_efuse_utility_update_virt_blocks();
  185. esp_efuse_utility_debug_dump_blocks();
  186. TEST_ASSERT_EQUAL_MESSAGE(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0, esp_efuse_count_unused_key_blocks(), "Efuses should be in initial state");
  187. esp_efuse_block_t key_block = EFUSE_BLK_MAX;
  188. enum { BLOCKS_NEEDED1 = 2 };
  189. #ifdef SOC_FLASH_ENCRYPTION_XTS_AES_256
  190. esp_efuse_purpose_t purpose1[BLOCKS_NEEDED1] = {
  191. ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_1,
  192. ESP_EFUSE_KEY_PURPOSE_XTS_AES_256_KEY_2,
  193. };
  194. #else
  195. esp_efuse_purpose_t purpose1[BLOCKS_NEEDED1] = {
  196. ESP_EFUSE_KEY_PURPOSE_XTS_AES_128_KEY,
  197. ESP_EFUSE_KEY_PURPOSE_RESERVED
  198. };
  199. #endif
  200. uint8_t keys1[BLOCKS_NEEDED1][32] = {{0xEE}};
  201. for (int num_key = 0; num_key < BLOCKS_NEEDED1; ++num_key) {
  202. for (int i = 0; i < 32; ++i) {
  203. keys1[num_key][i] = purpose1[num_key] + i + 1;
  204. }
  205. }
  206. TEST_ESP_OK(esp_efuse_write_keys(purpose1, keys1, BLOCKS_NEEDED1));
  207. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose1[0], &key_block));
  208. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY0, key_block);
  209. TEST_ESP_OK(s_check_key(key_block, keys1[0]));
  210. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose1[1], &key_block));
  211. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY1, key_block);
  212. TEST_ESP_OK(s_check_key(key_block, keys1[1]));
  213. esp_efuse_utility_debug_dump_blocks();
  214. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0 - 2, esp_efuse_count_unused_key_blocks());
  215. enum { BLOCKS_NEEDED2 = 3 };
  216. esp_efuse_purpose_t purpose2[BLOCKS_NEEDED2] = {
  217. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST0,
  218. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST1,
  219. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST2,
  220. };
  221. uint8_t keys2[BLOCKS_NEEDED2][32] = {{0xDD}};
  222. for (int num_key = 0; num_key < BLOCKS_NEEDED2; ++num_key) {
  223. for (int i = 0; i < 32; ++i) {
  224. keys2[num_key][i] = purpose2[num_key] + i + 1;
  225. }
  226. }
  227. TEST_ESP_OK(esp_efuse_write_keys(purpose2, keys2, BLOCKS_NEEDED2));
  228. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose2[0], &key_block));
  229. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY2, key_block);
  230. TEST_ESP_OK(s_check_key(key_block, keys2[0]));
  231. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose2[1], &key_block));
  232. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY3, key_block);
  233. TEST_ESP_OK(s_check_key(key_block, keys2[1]));
  234. TEST_ASSERT_TRUE(esp_efuse_find_purpose(purpose2[2], &key_block));
  235. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY4, key_block);
  236. TEST_ESP_OK(s_check_key(key_block, keys2[2]));
  237. esp_efuse_utility_debug_dump_blocks();
  238. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0 - 2 - 3, esp_efuse_count_unused_key_blocks());
  239. printf("reset efuses on the FPGA board for the next test\n");
  240. }
  241. TEST_CASE("Test esp_efuse_write_keys for returned errors", "[efuse]")
  242. {
  243. esp_efuse_utility_reset();
  244. esp_efuse_utility_update_virt_blocks();
  245. esp_efuse_utility_debug_dump_blocks();
  246. TEST_ASSERT_EQUAL_MESSAGE(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0, esp_efuse_count_unused_key_blocks(), "Efuses should be in initial state");
  247. enum { BLOCKS_NEEDED = 4 };
  248. esp_efuse_purpose_t purpose[BLOCKS_NEEDED] = {
  249. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST0,
  250. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST1,
  251. ESP_EFUSE_KEY_PURPOSE_SECURE_BOOT_DIGEST2,
  252. ESP_EFUSE_KEY_PURPOSE_MAX, // it leads ESP_ERR_INVALID_ARG in esp_efuse_write_keys
  253. };
  254. uint8_t keys[BLOCKS_NEEDED][32] = {{0xEE}};
  255. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_keys(NULL, keys, BLOCKS_NEEDED));
  256. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_keys(purpose, NULL, BLOCKS_NEEDED));
  257. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_keys(purpose, keys, (EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0) + 1));
  258. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_write_keys(purpose, keys, BLOCKS_NEEDED)); // ESP_EFUSE_KEY_PURPOSE_MAX is not a valid purpose.
  259. TEST_ASSERT_EQUAL(EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0, esp_efuse_count_unused_key_blocks());
  260. TEST_ESP_OK(esp_efuse_write_keys(purpose, keys, BLOCKS_NEEDED - 1));
  261. TEST_ASSERT_EQUAL((EFUSE_BLK_KEY_MAX - EFUSE_BLK_KEY0) - (BLOCKS_NEEDED - 1), esp_efuse_count_unused_key_blocks());
  262. unsigned unused_keys = esp_efuse_count_unused_key_blocks();
  263. TEST_ESP_ERR(ESP_ERR_NOT_ENOUGH_UNUSED_KEY_BLOCKS, esp_efuse_write_keys(purpose, keys, unused_keys + 1));
  264. }
  265. TEST_CASE("Test revocation APIs", "[efuse]")
  266. {
  267. esp_efuse_utility_reset();
  268. esp_efuse_utility_update_virt_blocks();
  269. esp_efuse_utility_debug_dump_blocks();
  270. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(0));
  271. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(1));
  272. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(2));
  273. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(0));
  274. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(1));
  275. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(2));
  276. // esp_efuse_get_digest_revoke(3); // assert
  277. TEST_ESP_OK(esp_efuse_set_digest_revoke(0));
  278. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(0));
  279. TEST_ESP_OK(esp_efuse_set_digest_revoke(1));
  280. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(1));
  281. TEST_ESP_OK(esp_efuse_set_digest_revoke(2));
  282. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(2));
  283. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_set_digest_revoke(3));
  284. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(0));
  285. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(0));
  286. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(1));
  287. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(1));
  288. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(2));
  289. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(2));
  290. TEST_ESP_ERR(ESP_ERR_INVALID_ARG, esp_efuse_set_write_protect_of_digest_revoke(3));
  291. }
  292. TEST_CASE("Test set_write_protect_of_digest_revoke", "[efuse]")
  293. {
  294. esp_efuse_utility_reset();
  295. esp_efuse_utility_update_virt_blocks();
  296. esp_efuse_utility_debug_dump_blocks();
  297. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(0));
  298. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(0));
  299. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(0));
  300. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(0));
  301. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(1));
  302. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(1));
  303. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(1));
  304. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(1));
  305. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(2));
  306. TEST_ASSERT_FALSE(esp_efuse_get_write_protect_of_digest_revoke(2));
  307. TEST_ESP_OK(esp_efuse_set_write_protect_of_digest_revoke(2));
  308. TEST_ASSERT_TRUE(esp_efuse_get_write_protect_of_digest_revoke(2));
  309. TEST_ESP_OK(esp_efuse_set_digest_revoke(0));
  310. TEST_ESP_OK(esp_efuse_set_digest_revoke(1));
  311. TEST_ESP_OK(esp_efuse_set_digest_revoke(2));
  312. #if CONFIG_IDF_ENV_FPGA && !CONFIG_EFUSE_VIRTUAL
  313. // the write protection bits are set and the revocation bits will not be changed.
  314. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(0));
  315. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(1));
  316. TEST_ASSERT_FALSE(esp_efuse_get_digest_revoke(2));
  317. #else
  318. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(0));
  319. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(1));
  320. TEST_ASSERT_TRUE(esp_efuse_get_digest_revoke(2));
  321. #endif // CONFIG_IDF_ENV_FPGA && !CONFIG_EFUSE_VIRTUAL
  322. }
  323. #endif // CONFIG_EFUSE_VIRTUAL || CONFIG_IDF_ENV_FPGA
  324. #endif // not CONFIG_IDF_TARGET_ESP32