ecdsa_hal.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "hal/assert.h"
  7. #include "hal/ecdsa_ll.h"
  8. #include "hal/ecdsa_hal.h"
  9. #include "hal/efuse_hal.h"
  10. #ifdef SOC_KEY_MANAGER_SUPPORTED
  11. #include "soc/keymng_reg.h" // TODO: IDF-7901
  12. #endif
  13. #define ECDSA_HAL_P192_COMPONENT_LEN 24
  14. #define ECDSA_HAL_P256_COMPONENT_LEN 32
  15. static void configure_ecdsa_periph(ecdsa_hal_config_t *conf)
  16. {
  17. #ifdef SOC_KEY_MANAGER_SUPPORTED
  18. REG_SET_FIELD(KEYMNG_STATIC_REG, KEYMNG_USE_EFUSE_KEY, 1); // TODO: IDF-7901
  19. #endif
  20. if (conf->use_km_key == 0) {
  21. efuse_hal_set_ecdsa_key(conf->efuse_key_blk);
  22. }
  23. ecdsa_ll_set_mode(conf->mode);
  24. ecdsa_ll_set_curve(conf->curve);
  25. if (conf->mode != ECDSA_MODE_EXPORT_PUBKEY) {
  26. ecdsa_ll_set_k_mode(conf->k_mode);
  27. ecdsa_ll_set_z_mode(conf->sha_mode);
  28. }
  29. }
  30. void ecdsa_hal_gen_signature(ecdsa_hal_config_t *conf, const uint8_t *k, const uint8_t *hash,
  31. uint8_t *r_out, uint8_t *s_out, uint16_t len)
  32. {
  33. if (len != ECDSA_HAL_P192_COMPONENT_LEN && len != ECDSA_HAL_P256_COMPONENT_LEN) {
  34. HAL_ASSERT(false && "Incorrect length");
  35. }
  36. if (conf->k_mode == ECDSA_K_USER_PROVIDED && k == NULL) {
  37. HAL_ASSERT(false && "Mismatch in K configuration");
  38. }
  39. if (conf->sha_mode == ECDSA_Z_USER_PROVIDED && hash == NULL) {
  40. HAL_ASSERT(false && "Mismatch in SHA configuration");
  41. }
  42. if (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  43. HAL_ASSERT(false && "Incorrect ECDSA state");
  44. }
  45. configure_ecdsa_periph(conf);
  46. ecdsa_ll_set_stage(ECDSA_STAGE_START_CALC);
  47. while(ecdsa_ll_get_state() != ECDSA_STATE_LOAD) {
  48. ;
  49. }
  50. ecdsa_ll_write_param(ECDSA_PARAM_Z, hash, len);
  51. ecdsa_ll_set_stage(ECDSA_STAGE_LOAD_DONE);
  52. while (ecdsa_ll_get_state() != ECDSA_STATE_GET) {
  53. ;
  54. }
  55. ecdsa_ll_read_param(ECDSA_PARAM_R, r_out, len);
  56. ecdsa_ll_read_param(ECDSA_PARAM_S, s_out, len);
  57. ecdsa_ll_set_stage(ECDSA_STAGE_GET_DONE);
  58. while (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  59. ;
  60. }
  61. }
  62. int ecdsa_hal_verify_signature(ecdsa_hal_config_t *conf, const uint8_t *hash, const uint8_t *r, const uint8_t *s,
  63. const uint8_t *pub_x, const uint8_t *pub_y, uint16_t len)
  64. {
  65. if (len != ECDSA_HAL_P192_COMPONENT_LEN && len != ECDSA_HAL_P256_COMPONENT_LEN) {
  66. HAL_ASSERT(false && "Incorrect length");
  67. }
  68. if (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  69. HAL_ASSERT(false && "Incorrect ECDSA state");
  70. }
  71. configure_ecdsa_periph(conf);
  72. ecdsa_ll_set_stage(ECDSA_STAGE_START_CALC);
  73. while(ecdsa_ll_get_state() != ECDSA_STATE_LOAD) {
  74. ;
  75. }
  76. ecdsa_ll_write_param(ECDSA_PARAM_Z, hash, len);
  77. ecdsa_ll_write_param(ECDSA_PARAM_R, r, len);
  78. ecdsa_ll_write_param(ECDSA_PARAM_S, s, len);
  79. ecdsa_ll_write_param(ECDSA_PARAM_QAX, pub_x, len);
  80. ecdsa_ll_write_param(ECDSA_PARAM_QAY, pub_y, len);
  81. ecdsa_ll_set_stage(ECDSA_STAGE_LOAD_DONE);
  82. while (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  83. ;
  84. }
  85. int res = ecdsa_ll_get_verification_result();
  86. return (res ? 0 : -1);
  87. }
  88. #ifdef SOC_ECDSA_SUPPORT_EXPORT_PUBKEY
  89. void ecdsa_hal_export_pubkey(ecdsa_hal_config_t *conf, uint8_t *pub_x, uint8_t *pub_y, uint16_t len)
  90. {
  91. if (len != ECDSA_HAL_P192_COMPONENT_LEN && len != ECDSA_HAL_P256_COMPONENT_LEN) {
  92. HAL_ASSERT(false && "Incorrect length");
  93. }
  94. if (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  95. HAL_ASSERT(false && "Incorrect ECDSA state");
  96. }
  97. configure_ecdsa_periph(conf);
  98. ecdsa_ll_set_stage(ECDSA_STAGE_START_CALC);
  99. while(ecdsa_ll_get_state() != ECDSA_STATE_LOAD) {
  100. ;
  101. }
  102. ecdsa_ll_set_stage(ECDSA_STAGE_LOAD_DONE);
  103. while (ecdsa_ll_get_state() != ECDSA_STATE_GET) {
  104. ;
  105. }
  106. ecdsa_ll_read_param(ECDSA_PARAM_QAX, pub_x, len);
  107. ecdsa_ll_read_param(ECDSA_PARAM_QAY, pub_y, len);
  108. ecdsa_ll_set_stage(ECDSA_STAGE_GET_DONE);
  109. while (ecdsa_ll_get_state() != ECDSA_STATE_IDLE) {
  110. ;
  111. }
  112. }
  113. #endif /* SOC_ECDSA_SUPPORT_EXPORT_PUBKEY */