1 /*
2 * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <string.h>
8 #include <stdio.h>
9
10 #include "esp_crypto_lock.h"
11 #include "esp_private/periph_ctrl.h"
12 #include "ecc_impl.h"
13 #include "hal/ecc_hal.h"
14 #include "hal/ecc_ll.h"
15
esp_ecc_acquire_hardware(void)16 static void esp_ecc_acquire_hardware(void)
17 {
18 esp_crypto_ecc_lock_acquire();
19
20 periph_module_enable(PERIPH_ECC_MODULE);
21 ecc_ll_power_up();
22 }
23
esp_ecc_release_hardware(void)24 static void esp_ecc_release_hardware(void)
25 {
26 periph_module_disable(PERIPH_ECC_MODULE);
27 ecc_ll_power_down();
28
29 esp_crypto_ecc_lock_release();
30 }
31
esp_ecc_point_multiply(const ecc_point_t * point,const uint8_t * scalar,ecc_point_t * result,bool verify_first)32 int esp_ecc_point_multiply(const ecc_point_t *point, const uint8_t *scalar, ecc_point_t *result, bool verify_first)
33 {
34 int ret = -1;
35 uint16_t len = point->len;
36 ecc_mode_t work_mode = verify_first ? ECC_MODE_VERIFY_THEN_POINT_MUL : ECC_MODE_POINT_MUL;
37
38 esp_ecc_acquire_hardware();
39
40 ecc_hal_write_mul_param(scalar, point->x, point->y, len);
41 ecc_hal_set_mode(work_mode);
42 ecc_hal_start_calc();
43
44 memset(result, 0, sizeof(ecc_point_t));
45
46 result->len = len;
47
48 while (!ecc_hal_is_calc_finished()) {
49 ;
50 }
51
52 ret = ecc_hal_read_mul_result(result->x, result->y, len);
53
54 esp_ecc_release_hardware();
55
56 return ret;
57 }
58
esp_ecc_point_verify(const ecc_point_t * point)59 int esp_ecc_point_verify(const ecc_point_t *point)
60 {
61 int result;
62
63 esp_ecc_acquire_hardware();
64 ecc_hal_write_verify_param(point->x, point->y, point->len);
65 ecc_hal_set_mode(ECC_MODE_VERIFY);
66 ecc_hal_start_calc();
67
68 while (!ecc_hal_is_calc_finished()) {
69 ;
70 }
71
72 result = ecc_hal_read_verify_result();
73
74 esp_ecc_release_hardware();
75
76 return result;
77 }
78