test_efuse.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 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 "unity.h"
  12. #include "esp_log.h"
  13. #include <string.h>
  14. #include "esp_efuse.h"
  15. #include "esp_efuse_table.h"
  16. #include "esp_efuse_utility.h"
  17. #include "esp_efuse_test_table.h"
  18. #include "bootloader_random.h"
  19. #include "freertos/FreeRTOS.h"
  20. #include "freertos/task.h"
  21. #include "freertos/semphr.h"
  22. #include "test_utils.h"
  23. #include "sdkconfig.h"
  24. #include "esp_rom_efuse.h"
  25. #include "bootloader_common.h"
  26. __attribute__((unused)) static const char* TAG = "efuse_test";
  27. #ifdef CONFIG_EFUSE_VIRTUAL
  28. static void test_wp(esp_efuse_block_t blk, const esp_efuse_desc_t* field[])
  29. {
  30. size_t out_cnt;
  31. TEST_ESP_OK(esp_efuse_set_write_protect(blk));
  32. esp_efuse_read_field_cnt(field, &out_cnt);
  33. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  34. }
  35. static void test_rp(esp_efuse_block_t blk, const esp_efuse_desc_t* field[], bool read_first)
  36. {
  37. size_t out_cnt;
  38. if (read_first) {
  39. esp_efuse_read_field_cnt(field, &out_cnt);
  40. TEST_ASSERT_EQUAL_INT(0, out_cnt);
  41. }
  42. TEST_ESP_OK(esp_efuse_set_read_protect(blk));
  43. esp_efuse_read_field_cnt(field, &out_cnt);
  44. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  45. if (read_first) {
  46. TEST_ESP_ERR(ESP_ERR_EFUSE_CNT_IS_FULL, esp_efuse_set_read_protect(blk));
  47. }
  48. }
  49. TEST_CASE("Test a write/read protection", "[efuse]")
  50. {
  51. esp_efuse_utility_reset();
  52. esp_efuse_utility_erase_virt_blocks();
  53. esp_efuse_utility_debug_dump_blocks();
  54. TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, esp_efuse_set_write_protect(EFUSE_BLK0));
  55. TEST_ESP_ERR(ESP_ERR_NOT_SUPPORTED, esp_efuse_set_read_protect(EFUSE_BLK0));
  56. size_t out_cnt;
  57. esp_efuse_read_field_cnt(ESP_EFUSE_WR_DIS_BLK1, &out_cnt);
  58. TEST_ASSERT_EQUAL_INT(0, out_cnt);
  59. TEST_ESP_OK(esp_efuse_set_write_protect(EFUSE_BLK1));
  60. esp_efuse_read_field_cnt(ESP_EFUSE_WR_DIS_BLK1, &out_cnt);
  61. TEST_ASSERT_EQUAL_INT(1, out_cnt);
  62. TEST_ESP_ERR(ESP_ERR_EFUSE_CNT_IS_FULL, esp_efuse_set_write_protect(EFUSE_BLK1));
  63. test_wp(EFUSE_BLK2, ESP_EFUSE_WR_DIS_SYS_DATA_PART1);
  64. test_wp(EFUSE_BLK3, ESP_EFUSE_WR_DIS_USER_DATA);
  65. esp_efuse_utility_debug_dump_blocks();
  66. test_rp(EFUSE_BLK4, ESP_EFUSE_RD_DIS_KEY0, true);
  67. test_rp(EFUSE_BLK5, ESP_EFUSE_RD_DIS_KEY1, false);
  68. test_rp(EFUSE_BLK6, ESP_EFUSE_RD_DIS_KEY2, false);
  69. esp_efuse_utility_debug_dump_blocks();
  70. esp_efuse_utility_reset();
  71. esp_efuse_utility_erase_virt_blocks();
  72. }
  73. #endif // CONFIG_EFUSE_VIRTUAL
  74. #ifdef CONFIG_IDF_ENV_FPGA
  75. TEST_CASE("Test a real write (FPGA)2", "[efuse]")
  76. {
  77. esp_efuse_utility_debug_dump_blocks();
  78. ESP_LOGI(TAG, "1. Write KEY3");
  79. uint8_t key[32] = {0};
  80. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY3, &key, 256));
  81. for (int i = 0; i < sizeof(key); ++i) {
  82. TEST_ASSERT_EQUAL_INT(0, key[i]);
  83. }
  84. uint8_t new_key[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  85. 10, 11, 12, 12, 14, 15, 16, 17, 18, 19,
  86. 20, 21, 22, 22, 24, 25, 26, 27, 28, 29,
  87. 30, 31};
  88. TEST_ESP_OK(esp_efuse_write_field_blob(ESP_EFUSE_KEY3, &new_key, 256));
  89. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY3, &key, 256));
  90. TEST_ASSERT_EQUAL_HEX8_ARRAY(new_key, key, sizeof(key));
  91. esp_efuse_utility_debug_dump_blocks();
  92. ESP_LOGI(TAG, "2. Set a read protection for KEY3");
  93. TEST_ESP_OK(esp_efuse_set_read_protect(EFUSE_BLK_KEY3));
  94. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY3, &key, 256));
  95. #ifndef CONFIG_EFUSE_VIRTUAL
  96. TEST_ASSERT_EACH_EQUAL_HEX8(0, key, sizeof(key));
  97. #else
  98. TEST_ASSERT_EQUAL_HEX8_ARRAY(new_key, key, sizeof(key));
  99. #endif // CONFIG_EFUSE_VIRTUAL
  100. esp_efuse_utility_debug_dump_blocks();
  101. }
  102. #endif // CONFIG_IDF_ENV_FPGA
  103. #if CONFIG_IDF_ENV_FPGA || CONFIG_EFUSE_VIRTUAL
  104. TEST_CASE("Test writing order is BLK_MAX->BLK0", "[efuse]")
  105. {
  106. uint8_t new_key[32] = {33, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  107. 10, 11, 12, 12, 14, 15, 16, 17, 18, 19,
  108. 20, 21, 22, 22, 24, 25, 26, 27, 28, 29,
  109. 30, 31};
  110. esp_efuse_utility_erase_virt_blocks();
  111. esp_efuse_utility_debug_dump_blocks();
  112. TEST_ESP_OK(esp_efuse_batch_write_begin());
  113. TEST_ESP_OK(esp_efuse_write_field_blob(ESP_EFUSE_KEY4, &new_key, 256));
  114. // If the order of writing blocks is wrong (ex. BLK0 -> BLK_MAX)
  115. // then the write protection bit will be set early and the key was left un-updated.
  116. TEST_ESP_OK(esp_efuse_set_write_protect(EFUSE_BLK_KEY4));
  117. TEST_ESP_OK(esp_efuse_batch_write_commit());
  118. esp_efuse_utility_debug_dump_blocks();
  119. uint8_t key[32] = { 0xEE };
  120. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY4, &key, 256));
  121. TEST_ASSERT_EQUAL_HEX8_ARRAY(new_key, key, sizeof(key));
  122. }
  123. TEST_CASE("Test reading inside of batch mode in a nested way", "[efuse]")
  124. {
  125. uint8_t new_key[32] = {44, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  126. 10, 11, 12, 12, 14, 15, 16, 17, 18, 19,
  127. 20, 21, 22, 22, 24, 25, 26, 27, 28, 29,
  128. 30, 31};
  129. uint8_t key[32] = { 0xEE };
  130. esp_efuse_utility_reset();
  131. esp_efuse_utility_erase_virt_blocks();
  132. esp_efuse_utility_debug_dump_blocks();
  133. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY5, &key, 256));
  134. TEST_ASSERT_EACH_EQUAL_HEX8(0, key, sizeof(key));
  135. TEST_ESP_OK(esp_efuse_batch_write_begin());
  136. TEST_ESP_OK(esp_efuse_batch_write_begin());
  137. TEST_ESP_OK(esp_efuse_batch_write_begin());
  138. TEST_ESP_OK(esp_efuse_write_field_blob(ESP_EFUSE_KEY5, &new_key, 256));
  139. TEST_ESP_OK(esp_efuse_set_write_protect(EFUSE_BLK_KEY5));
  140. ESP_LOGI(TAG, "Reading inside Batch mode, the key was not burn yet and it is empty");
  141. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY5, &key, 256));
  142. TEST_ASSERT_EACH_EQUAL_HEX8(0, key, sizeof(key));
  143. TEST_ESP_OK(esp_efuse_batch_write_commit());
  144. TEST_ESP_OK(esp_efuse_batch_write_commit());
  145. TEST_ESP_OK(esp_efuse_batch_write_commit());
  146. TEST_ESP_OK(esp_efuse_batch_write_begin());
  147. TEST_ESP_OK(esp_efuse_batch_write_begin());
  148. TEST_ESP_OK(esp_efuse_batch_write_begin());
  149. TEST_ESP_OK(esp_efuse_batch_write_begin());
  150. ESP_LOGI(TAG, "Reading inside Batch mode, the key is already set");
  151. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY5, &key, 256));
  152. TEST_ASSERT_EQUAL_HEX8_ARRAY(new_key, key, sizeof(key));
  153. TEST_ESP_OK(esp_efuse_batch_write_commit());
  154. TEST_ESP_OK(esp_efuse_batch_write_commit());
  155. TEST_ESP_OK(esp_efuse_batch_write_commit());
  156. TEST_ESP_OK(esp_efuse_batch_write_commit());
  157. esp_efuse_utility_debug_dump_blocks();
  158. ESP_LOGI(TAG, "Reading inside Batch mode, the key is already set");
  159. TEST_ESP_ERR(ESP_ERR_INVALID_STATE, esp_efuse_batch_write_commit());
  160. TEST_ESP_ERR(ESP_ERR_INVALID_STATE, esp_efuse_batch_write_cancel());
  161. TEST_ESP_OK(esp_efuse_batch_write_begin());
  162. TEST_ESP_OK(esp_efuse_write_field_blob(ESP_EFUSE_KEY2, &new_key, 256));
  163. TEST_ESP_OK(esp_efuse_batch_write_commit());
  164. TEST_ESP_OK(esp_efuse_read_field_blob(ESP_EFUSE_KEY2, &key, 256));
  165. TEST_ASSERT_EQUAL_HEX8_ARRAY(new_key, key, sizeof(key));
  166. esp_efuse_utility_debug_dump_blocks();
  167. }
  168. #endif // CONFIG_IDF_ENV_FPGA || CONFIG_EFUSE_VIRTUAL