test_ds.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <assert.h>
  9. #include "esp_private/esp_crypto_lock_internal.h"
  10. #include "memory_checks.h"
  11. #include "unity_fixture.h"
  12. #include "soc/soc_caps.h"
  13. typedef enum {
  14. HMAC_KEY0 = 0,
  15. HMAC_KEY1,
  16. HMAC_KEY2,
  17. HMAC_KEY3,
  18. HMAC_KEY4,
  19. HMAC_KEY5,
  20. HMAC_KEY_MAX
  21. } hmac_key_id_t;
  22. #if CONFIG_IDF_TARGET_ESP32S2
  23. #include "esp32s2/rom/efuse.h"
  24. #include "esp32s2/rom/digital_signature.h"
  25. #include "esp32s2/rom/aes.h"
  26. #include "esp32s2/rom/sha.h"
  27. #include "esp32s2/rom/hmac.h"
  28. #include "soc/soc_memory_layout.h"
  29. #elif CONFIG_IDF_TARGET_ESP32C3
  30. #include "esp32c3/rom/efuse.h"
  31. #include "esp32c3/rom/digital_signature.h"
  32. #include "esp32c3/rom/hmac.h"
  33. #elif CONFIG_IDF_TARGET_ESP32S3
  34. #include "esp32s3/rom/efuse.h"
  35. #include "esp32s3/rom/digital_signature.h"
  36. #include "esp32s3/rom/aes.h"
  37. #include "esp32s3/rom/sha.h"
  38. #elif CONFIG_IDF_TARGET_ESP32C6
  39. #include "esp32c6/rom/efuse.h"
  40. #include "esp32c6/rom/digital_signature.h"
  41. #include "esp32c6/rom/aes.h"
  42. #include "esp32c6/rom/sha.h"
  43. #elif CONFIG_IDF_TARGET_ESP32H2
  44. #include "esp32h2/rom/efuse.h"
  45. #include "esp32h2/rom/digital_signature.h"
  46. #include "esp32h2/rom/aes.h"
  47. #include "esp32h2/rom/sha.h"
  48. #elif CONFIG_IDF_TARGET_ESP32P4
  49. #include "esp32p4/rom/efuse.h"
  50. #include "esp32p4/rom/digital_signature.h"
  51. #include "esp32p4/rom/aes.h"
  52. #include "esp32p4/rom/sha.h"
  53. #endif
  54. #define ESP_ERR_HW_CRYPTO_DS_HMAC_FAIL (0x1) /*!< HMAC peripheral problem */
  55. #define ESP_ERR_HW_CRYPTO_DS_INVALID_KEY (0x2) /*!< given HMAC key isn't correct, HMAC peripheral problem */
  56. #define ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST (0x4) /*!< message digest check failed, result is invalid */
  57. #define ESP_ERR_HW_CRYPTO_DS_INVALID_PADDING (0x5) /*!< padding check failed, but result is produced anyway and can be read*/
  58. #define ESP_DS_IV_BIT_LEN 128
  59. #define ESP_DS_IV_LEN (ESP_DS_IV_BIT_LEN / 8)
  60. #define ESP_DS_SIGNATURE_MAX_BIT_LEN SOC_RSA_MAX_BIT_LEN
  61. #define ESP_DS_SIGNATURE_MD_BIT_LEN 256
  62. #define ESP_DS_SIGNATURE_M_PRIME_BIT_LEN 32
  63. #define ESP_DS_SIGNATURE_L_BIT_LEN 32
  64. #define ESP_DS_SIGNATURE_PADDING_BIT_LEN 64
  65. #define ESP_DS_C_LEN (((ESP_DS_SIGNATURE_MAX_BIT_LEN * 3 \
  66. + ESP_DS_SIGNATURE_MD_BIT_LEN \
  67. + ESP_DS_SIGNATURE_M_PRIME_BIT_LEN \
  68. + ESP_DS_SIGNATURE_L_BIT_LEN \
  69. + ESP_DS_SIGNATURE_PADDING_BIT_LEN) / 8))
  70. typedef enum {
  71. ESP_DS_RSA_1024 = (1024 / 32) - 1,
  72. ESP_DS_RSA_2048 = (2048 / 32) - 1,
  73. ESP_DS_RSA_3072 = (3072 / 32) - 1,
  74. ESP_DS_RSA_4096 = (4096 / 32) - 1
  75. } esp_digital_signature_length_t;
  76. typedef struct esp_digital_signature_data {
  77. esp_digital_signature_length_t rsa_length;
  78. uint32_t iv[ESP_DS_IV_BIT_LEN / 32];
  79. uint8_t c[ESP_DS_C_LEN];
  80. } esp_ds_data_t;
  81. typedef struct {
  82. uint32_t Y[ESP_DS_SIGNATURE_MAX_BIT_LEN / 32];
  83. uint32_t M[ESP_DS_SIGNATURE_MAX_BIT_LEN / 32];
  84. uint32_t Rb[ESP_DS_SIGNATURE_MAX_BIT_LEN / 32];
  85. uint32_t M_prime;
  86. uint32_t length;
  87. } esp_ds_p_data_t;
  88. #define NUM_RESULTS 10
  89. #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
  90. #define DS_MAX_BITS (4096)
  91. #else
  92. #define DS_MAX_BITS (ETS_DS_MAX_BITS)
  93. #endif
  94. typedef struct {
  95. uint8_t iv[ETS_DS_IV_LEN];
  96. ets_ds_p_data_t p_data;
  97. uint8_t expected_c[ETS_DS_C_LEN];
  98. uint8_t hmac_key_idx;
  99. uint32_t expected_results[NUM_RESULTS][DS_MAX_BITS / 32];
  100. } encrypt_testcase_t;
  101. #if DS_MAX_BITS == 4096
  102. #define RSA_LEN (ESP_DS_RSA_4096)
  103. #include "digital_signature_test_cases_4096.h"
  104. #elif DS_MAX_BITS == 3072
  105. #define RSA_LEN (ESP_DS_RSA_3072)
  106. #include "digital_signature_test_cases_3072.h"
  107. #endif
  108. _Static_assert(NUM_RESULTS == NUM_MESSAGES, "expected_results size should be the same as NUM_MESSAGES in generated header");
  109. #if !CONFIG_IDF_TARGET_ESP32S2
  110. #include "esp_private/periph_ctrl.h"
  111. #include "hal/ds_hal.h"
  112. #include "hal/ds_ll.h"
  113. #include "hal/hmac_hal.h"
  114. #include "hal/hmac_ll.h"
  115. static void ds_acquire_enable(void)
  116. {
  117. HMAC_RCC_ATOMIC() {
  118. hmac_ll_enable_bus_clock(true);
  119. hmac_ll_reset_register();
  120. }
  121. periph_module_enable(PERIPH_SHA_MODULE);
  122. DS_RCC_ATOMIC() {
  123. ds_ll_enable_bus_clock(true);
  124. ds_ll_reset_register();
  125. }
  126. hmac_hal_start();
  127. }
  128. static void ds_disable_release(void)
  129. {
  130. ds_hal_finish();
  131. DS_RCC_ATOMIC() {
  132. ds_ll_enable_bus_clock(false);
  133. }
  134. periph_module_disable(PERIPH_SHA_MODULE);
  135. HMAC_RCC_ATOMIC() {
  136. hmac_ll_enable_bus_clock(false);
  137. }
  138. }
  139. static esp_err_t esp_ds_start_sign(const void *message, const esp_ds_data_t *data, hmac_key_id_t key_id)
  140. {
  141. ds_acquire_enable();
  142. uint32_t conf_error = hmac_hal_configure(HMAC_OUTPUT_DS, key_id);
  143. if (conf_error) {
  144. ds_disable_release();
  145. return ESP_ERR_HW_CRYPTO_DS_HMAC_FAIL;
  146. }
  147. ds_hal_start();
  148. while (ds_hal_busy() != 0) { }
  149. size_t rsa_len = (data->rsa_length + 1) * 4;
  150. ds_hal_write_private_key_params(data->c);
  151. ds_hal_configure_iv((uint32_t *)data->iv);
  152. ds_hal_write_message(message, rsa_len);
  153. ds_hal_start_sign();
  154. return ESP_OK;
  155. }
  156. static esp_err_t esp_ds_finish_sign(void *signature, const esp_ds_data_t *data)
  157. {
  158. unsigned rsa_len = (data->rsa_length + 1) * 4;
  159. while (ds_hal_busy()) { }
  160. ds_signature_check_t sig_check_result = ds_hal_read_result((uint8_t *) signature, (size_t) rsa_len);
  161. esp_err_t return_value = ESP_OK;
  162. if (sig_check_result == DS_SIGNATURE_MD_FAIL || sig_check_result == DS_SIGNATURE_PADDING_AND_MD_FAIL) {
  163. return_value = ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST;
  164. }
  165. if (sig_check_result == DS_SIGNATURE_PADDING_FAIL) {
  166. return_value = ESP_ERR_HW_CRYPTO_DS_INVALID_PADDING;
  167. }
  168. hmac_hal_clean();
  169. ds_disable_release();
  170. return return_value;
  171. }
  172. static esp_err_t esp_ds_sign(const void *message,
  173. const esp_ds_data_t *data,
  174. hmac_key_id_t key_id,
  175. void *signature)
  176. {
  177. esp_err_t result = esp_ds_start_sign(message, data, key_id);
  178. if (result != ESP_OK) {
  179. return result;
  180. }
  181. while (ds_hal_busy()) { }
  182. return esp_ds_finish_sign(signature, data);
  183. }
  184. static esp_err_t esp_ds_encrypt_params(esp_ds_data_t *data,
  185. const void *iv,
  186. const esp_ds_p_data_t *p_data,
  187. const void *key)
  188. {
  189. if (!p_data) {
  190. return ESP_ERR_INVALID_ARG;
  191. }
  192. esp_err_t result = ESP_OK;
  193. periph_module_enable(PERIPH_AES_MODULE);
  194. periph_module_enable(PERIPH_SHA_MODULE);
  195. ets_ds_data_t *ds_data = (ets_ds_data_t *) data;
  196. const ets_ds_p_data_t *ds_plain_data = (const ets_ds_p_data_t *) p_data;
  197. ets_ds_result_t ets_result = ets_ds_encrypt_params(ds_data, iv, ds_plain_data, key, ETS_DS_KEY_HMAC);
  198. if (ets_result == ETS_DS_INVALID_PARAM) {
  199. result = ESP_ERR_INVALID_ARG;
  200. }
  201. periph_module_disable(PERIPH_SHA_MODULE);
  202. periph_module_disable(PERIPH_AES_MODULE);
  203. return result;
  204. }
  205. #else /* !CONFIG_IDF_TARGET_ESP32S2 */
  206. static void ds_acquire_enable(void)
  207. {
  208. ets_hmac_enable();
  209. ets_ds_enable();
  210. }
  211. static void ds_disable_release(void)
  212. {
  213. ets_ds_disable();
  214. ets_hmac_disable();
  215. }
  216. static esp_err_t esp_ds_start_sign(const void *message,
  217. const esp_ds_data_t *data,
  218. hmac_key_id_t key_id)
  219. {
  220. ds_acquire_enable();
  221. int r = ets_hmac_calculate_downstream(ETS_EFUSE_BLOCK_KEY0 + (ets_efuse_block_t) key_id,
  222. ETS_EFUSE_KEY_PURPOSE_HMAC_DOWN_DIGITAL_SIGNATURE);
  223. if (r != ETS_OK) {
  224. ds_disable_release();
  225. return ESP_ERR_HW_CRYPTO_DS_HMAC_FAIL;
  226. }
  227. ets_ds_data_t *ds_data = (ets_ds_data_t *) data;
  228. ets_ds_result_t result = ets_ds_start_sign(message, ds_data);
  229. // ETS_DS_INVALID_PARAM only happens if a parameter is NULL or data->rsa_length is wrong
  230. // We checked all of that already
  231. assert(result != ETS_DS_INVALID_PARAM);
  232. if (result == ETS_DS_INVALID_KEY) {
  233. ds_disable_release();
  234. return ESP_ERR_HW_CRYPTO_DS_INVALID_KEY;
  235. }
  236. return ESP_OK;
  237. }
  238. esp_err_t esp_ds_finish_sign(void *signature, const esp_ds_data_t *data)
  239. {
  240. ets_ds_result_t result = ets_ds_finish_sign(signature, (ets_ds_data_t*) data);
  241. esp_err_t return_value = ESP_OK;
  242. assert(result != ETS_DS_INVALID_PARAM);
  243. if (result == ETS_DS_INVALID_DIGEST) {
  244. return_value = ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST;
  245. }
  246. if (result == ETS_DS_INVALID_PADDING) {
  247. return_value = ESP_ERR_HW_CRYPTO_DS_INVALID_PADDING;
  248. }
  249. int res = ets_hmac_invalidate_downstream(ETS_EFUSE_KEY_PURPOSE_HMAC_DOWN_DIGITAL_SIGNATURE);
  250. assert(res == ETS_OK); // should not fail if called with correct purpose
  251. (void)res;
  252. ds_disable_release();
  253. return return_value;
  254. }
  255. static esp_err_t esp_ds_sign(const void *message,
  256. const esp_ds_data_t *data,
  257. hmac_key_id_t key_id,
  258. void *signature)
  259. {
  260. esp_err_t result = esp_ds_start_sign(message, data, key_id);
  261. if (result != ESP_OK) {
  262. return result;
  263. }
  264. while (ets_ds_is_busy()) { }
  265. return esp_ds_finish_sign(signature, (void *)data);
  266. }
  267. static esp_err_t esp_ds_encrypt_params(esp_ds_data_t *data,
  268. const void *iv,
  269. const esp_ds_p_data_t *p_data,
  270. const void *key)
  271. {
  272. assert(esp_ptr_internal(p_data) && esp_ptr_word_aligned(p_data));
  273. esp_err_t result = ESP_OK;
  274. ets_aes_enable();
  275. ets_sha_enable();
  276. ets_ds_data_t *ds_data = (ets_ds_data_t *) data;
  277. const ets_ds_p_data_t *ds_plain_data = (const ets_ds_p_data_t *) p_data;
  278. ets_ds_result_t ets_result = ets_ds_encrypt_params(ds_data, iv, ds_plain_data, key, ETS_DS_KEY_HMAC);
  279. if (ets_result == ETS_DS_INVALID_PARAM) {
  280. result = ESP_ERR_INVALID_ARG;
  281. }
  282. ets_sha_disable();
  283. ets_aes_disable();
  284. return result;
  285. }
  286. #endif /* !CONFIG_IDF_TARGET_ESP32S2 */
  287. TEST_GROUP(ds);
  288. TEST_SETUP(ds)
  289. {
  290. test_utils_record_free_mem();
  291. TEST_ESP_OK(test_utils_set_leak_level(0, ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_GENERAL));
  292. }
  293. TEST_TEAR_DOWN(ds)
  294. {
  295. test_utils_finish_and_evaluate_leaks(test_utils_get_leak_level(ESP_LEAK_TYPE_WARNING, ESP_COMP_LEAK_ALL),
  296. test_utils_get_leak_level(ESP_LEAK_TYPE_CRITICAL, ESP_COMP_LEAK_ALL));
  297. }
  298. TEST(ds, digital_signature_parameter_encryption)
  299. {
  300. for (int i = 0; i < NUM_CASES; i++) {
  301. printf("Encrypting test case %d...\n", i);
  302. const encrypt_testcase_t *t = &test_cases[i];
  303. esp_ds_data_t result = { };
  304. esp_ds_p_data_t p_data;
  305. memcpy(p_data.Y, t->p_data.Y, DS_MAX_BITS / 8);
  306. memcpy(p_data.M, t->p_data.M, DS_MAX_BITS / 8);
  307. memcpy(p_data.Rb, t->p_data.Rb, DS_MAX_BITS / 8);
  308. p_data.M_prime = t->p_data.M_prime;
  309. p_data.length = t->p_data.length;
  310. esp_err_t r = esp_ds_encrypt_params(&result, t->iv, &p_data,
  311. test_hmac_keys[t->hmac_key_idx]);
  312. printf("Encrypting test case %d done\n", i);
  313. TEST_ASSERT_EQUAL(ESP_OK, r);
  314. TEST_ASSERT_EQUAL(t->p_data.length, result.rsa_length);
  315. TEST_ASSERT_EQUAL_HEX8_ARRAY(t->iv, result.iv, ETS_DS_IV_LEN);
  316. TEST_ASSERT_EQUAL_HEX8_ARRAY(t->expected_c, result.c, ETS_DS_C_LEN);
  317. }
  318. }
  319. // This test uses the HMAC_KEY0 eFuse key which hasn't been burned by burn_hmac_keys().
  320. // HMAC_KEY0 is usually used for HMAC upstream (user access) tests.
  321. TEST(ds, digital_signature_wrong_hmac_key_purpose)
  322. {
  323. esp_ds_data_t ds_data = {};
  324. ds_data.rsa_length = RSA_LEN;
  325. const char *message = "test";
  326. // HMAC fails in that case because it checks for the correct purpose
  327. TEST_ASSERT_EQUAL(ESP_ERR_HW_CRYPTO_DS_HMAC_FAIL, esp_ds_start_sign(message, &ds_data, HMAC_KEY0));
  328. }
  329. // This test uses the HMAC_KEY0 eFuse key which hasn't been burned by burn_hmac_keys().
  330. // HMAC_KEY0 is usually used for HMAC upstream (user access) tests.
  331. TEST(ds, digital_signature_blocking_wrong_hmac_key_purpose)
  332. {
  333. esp_ds_data_t ds_data = {};
  334. ds_data.rsa_length = RSA_LEN;
  335. const char *message = "test";
  336. uint8_t signature_data [128 * 4];
  337. // HMAC fails in that case because it checks for the correct purpose
  338. TEST_ASSERT_EQUAL(ESP_ERR_HW_CRYPTO_DS_HMAC_FAIL, esp_ds_sign(message, &ds_data, HMAC_KEY0, signature_data));
  339. }
  340. TEST(ds, digital_signature_operation)
  341. {
  342. for (int i = 0; i < NUM_CASES; i++) {
  343. printf("Running test case %d...\n", i);
  344. const encrypt_testcase_t *t = &test_cases[i];
  345. // copy encrypt parameter test case into ds_data structure
  346. esp_ds_data_t ds_data = { };
  347. memcpy(ds_data.iv, t->iv, ETS_DS_IV_LEN);
  348. memcpy(ds_data.c, t->expected_c, ETS_DS_C_LEN);
  349. ds_data.rsa_length = t->p_data.length;
  350. for (int j = 0; j < NUM_MESSAGES; j++) {
  351. uint8_t signature[DS_MAX_BITS / 8] = { 0 };
  352. printf(" ... message %d\n", j);
  353. esp_err_t ds_r = esp_ds_start_sign(test_messages[j],
  354. &ds_data,
  355. t->hmac_key_idx + 1);
  356. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  357. ds_r = esp_ds_finish_sign(signature, &ds_data);
  358. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  359. TEST_ASSERT_EQUAL_HEX8_ARRAY(t->expected_results[j], signature, sizeof(signature));
  360. }
  361. #if CONFIG_IDF_TARGET_ESP32C3
  362. ets_hmac_invalidate_downstream(ETS_EFUSE_KEY_PURPOSE_HMAC_DOWN_DIGITAL_SIGNATURE);
  363. #endif
  364. }
  365. }
  366. TEST(ds, digital_signature_blocking_operation)
  367. {
  368. for (int i = 0; i < NUM_CASES; i++) {
  369. printf("Running test case %d...\n", i);
  370. const encrypt_testcase_t *t = &test_cases[i];
  371. // copy encrypt parameter test case into ds_data structure
  372. esp_ds_data_t ds_data = { };
  373. memcpy(ds_data.iv, t->iv, ETS_DS_IV_LEN);
  374. memcpy(ds_data.c, t->expected_c, ETS_DS_C_LEN);
  375. ds_data.rsa_length = t->p_data.length;
  376. uint8_t signature[DS_MAX_BITS / 8] = { 0 };
  377. #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
  378. esp_err_t ds_r = esp_ds_start_sign(test_messages[0],
  379. &ds_data,
  380. t->hmac_key_idx + 1);
  381. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  382. ds_r = esp_ds_finish_sign(signature, &ds_data);
  383. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  384. #else
  385. esp_err_t ds_r = esp_ds_sign(test_messages[0],
  386. &ds_data,
  387. t->hmac_key_idx + 1,
  388. signature);
  389. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  390. #endif
  391. TEST_ASSERT_EQUAL_HEX8_ARRAY(t->expected_results[0], signature, sizeof(signature));
  392. }
  393. }
  394. TEST(ds, digital_signature_invalid_data)
  395. {
  396. // Set up a valid test case
  397. const encrypt_testcase_t *t = &test_cases[0];
  398. esp_ds_data_t ds_data = { };
  399. memcpy(ds_data.iv, t->iv, ETS_DS_IV_LEN);
  400. memcpy(ds_data.c, t->expected_c, ETS_DS_C_LEN);
  401. ds_data.rsa_length = t->p_data.length;
  402. uint8_t signature[DS_MAX_BITS / 8] = { 0 };
  403. const uint8_t zero[DS_MAX_BITS / 8] = { 0 };
  404. // Corrupt the IV one bit at a time, rerun and expect failure
  405. for (int bit = 0; bit < 128; bit++) {
  406. printf("Corrupting IV bit %d...\n", bit);
  407. ds_data.iv[bit / 8] ^= 1 << (bit % 8);
  408. esp_err_t ds_r = esp_ds_start_sign(test_messages[0], &ds_data, t->hmac_key_idx + 1);
  409. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  410. ds_r = esp_ds_finish_sign(signature, &ds_data);
  411. TEST_ASSERT_EQUAL(ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST, ds_r);
  412. TEST_ASSERT_EQUAL_HEX8_ARRAY(zero, signature, DS_MAX_BITS / 8);
  413. ds_data.iv[bit / 8] ^= 1 << (bit % 8);
  414. }
  415. // Corrupt encrypted key data one bit at a time, rerun and expect failure
  416. printf("Corrupting C...\n");
  417. for (int bit = 0; bit < ETS_DS_C_LEN * 8; bit++) {
  418. printf("Corrupting C bit %d...\n", bit);
  419. ds_data.c[bit / 8] ^= 1 << (bit % 8);
  420. esp_err_t ds_r = esp_ds_start_sign(test_messages[0], &ds_data, t->hmac_key_idx + 1);
  421. TEST_ASSERT_EQUAL(ESP_OK, ds_r);
  422. ds_r = esp_ds_finish_sign(signature, &ds_data);
  423. TEST_ASSERT_EQUAL(ESP_ERR_HW_CRYPTO_DS_INVALID_DIGEST, ds_r);
  424. TEST_ASSERT_EQUAL_HEX8_ARRAY(zero, signature, DS_MAX_BITS / 8);
  425. ds_data.c[bit / 8] ^= 1 << (bit % 8);
  426. }
  427. }
  428. TEST_GROUP_RUNNER(ds)
  429. {
  430. RUN_TEST_CASE(ds, digital_signature_parameter_encryption);
  431. RUN_TEST_CASE(ds, digital_signature_wrong_hmac_key_purpose);
  432. RUN_TEST_CASE(ds, digital_signature_blocking_wrong_hmac_key_purpose);
  433. RUN_TEST_CASE(ds, digital_signature_operation);
  434. RUN_TEST_CASE(ds, digital_signature_blocking_operation);
  435. RUN_TEST_CASE(ds, digital_signature_invalid_data);
  436. }