test_efuse_keys.c 16 KB

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