test_efuse.c 7.2 KB

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