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