ecc_hal.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "hal/ecc_hal.h"
  7. #include "hal/ecc_ll.h"
  8. void ecc_hal_set_mode(ecc_mode_t mode)
  9. {
  10. ecc_ll_set_mode(mode);
  11. }
  12. void ecc_hal_set_curve(ecc_curve_t curve)
  13. {
  14. ecc_ll_set_curve(curve);
  15. }
  16. void ecc_hal_start_calc(void)
  17. {
  18. ecc_ll_clear_interrupt();
  19. ecc_ll_start_calc();
  20. }
  21. int ecc_hal_is_calc_finished(void)
  22. {
  23. return ecc_ll_is_calc_finished();
  24. }
  25. static void clear_param_registers(void)
  26. {
  27. uint8_t buf[32] = {0};
  28. ecc_ll_write_param(ECC_PARAM_PX, buf, sizeof(buf));
  29. ecc_ll_write_param(ECC_PARAM_PY, buf, sizeof(buf));
  30. ecc_ll_write_param(ECC_PARAM_K, buf, sizeof(buf));
  31. }
  32. void ecc_hal_write_mul_param(const uint8_t *k, const uint8_t *px, const uint8_t *py, uint16_t len)
  33. {
  34. ecc_curve_t curve = len == 32 ? ECC_CURVE_SECP256R1 : ECC_CURVE_SECP192R1;
  35. ecc_ll_set_curve(curve);
  36. clear_param_registers();
  37. ecc_ll_write_param(ECC_PARAM_K, k, len);
  38. ecc_ll_write_param(ECC_PARAM_PX, px, len);
  39. ecc_ll_write_param(ECC_PARAM_PY, py, len);
  40. }
  41. void ecc_hal_write_verify_param(const uint8_t *px, const uint8_t *py, uint16_t len)
  42. {
  43. ecc_curve_t curve = len == 32 ? ECC_CURVE_SECP256R1 : ECC_CURVE_SECP192R1;
  44. ecc_ll_set_curve(curve);
  45. clear_param_registers();
  46. ecc_ll_write_param(ECC_PARAM_PX, px, len);
  47. ecc_ll_write_param(ECC_PARAM_PY, py, len);
  48. }
  49. int ecc_hal_read_mul_result(uint8_t *rx, uint8_t *ry, uint16_t len)
  50. {
  51. ecc_mode_t mode = ecc_ll_get_mode();
  52. if (mode == ECC_MODE_VERIFY_THEN_POINT_MUL) {
  53. if (!ecc_ll_get_verification_result()) {
  54. memset(rx, 0x0, len);
  55. memset(ry, 0x0, len);
  56. return -1;
  57. }
  58. }
  59. ecc_ll_read_param(ECC_PARAM_PX, rx, len);
  60. ecc_ll_read_param(ECC_PARAM_PY, ry, len);
  61. return 0;
  62. }
  63. int ecc_hal_read_verify_result(void)
  64. {
  65. return ecc_ll_get_verification_result();
  66. }