1 /*
2  * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include <stddef.h>
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 
11 #include "esp_random.h"
12 #include "esp_heap_caps.h"
13 #include "esp_heap_caps_init.h"
14 #include "esp_mac.h"
15 
16 #include "sdkconfig.h"
17 
18 #if CONFIG_BT_NIMBLE_ENABLED
19 #include "nimble/nimble_port.h"
20 #endif // CONFIG_BT_NIMBLE_ENABLED
21 #include "nimble/nimble_port_freertos.h"
22 #include "esp_private/esp_modem_clock.h"
23 
24 #ifdef ESP_PLATFORM
25 #include "esp_log.h"
26 #endif // ESP_PLATFORM
27 
28 #if CONFIG_SW_COEXIST_ENABLE
29 #include "private/esp_coexist_internal.h"
30 #endif // CONFIG_SW_COEXIST_ENABLE
31 
32 #include "nimble/nimble_npl_os.h"
33 #include "esp_hci_transport.h"
34 #include "os/endian.h"
35 
36 #include "esp_bt.h"
37 #include "esp_intr_alloc.h"
38 #include "esp_sleep.h"
39 #include "esp_pm.h"
40 #include "esp_phy_init.h"
41 #include "esp_private/periph_ctrl.h"
42 #include "bt_osi_mem.h"
43 
44 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
45 #include "esp_private/sleep_modem.h"
46 #include "esp_private/sleep_retention.h"
47 #endif // CONFIG_FREERTOS_USE_TICKLESS_IDLE
48 
49 #include "freertos/FreeRTOS.h"
50 #include "freertos/task.h"
51 
52 #include "esp_private/periph_ctrl.h"
53 #include "esp_sleep.h"
54 #include "soc/rtc.h"
55 /* Macro definition
56  ************************************************************************
57  */
58 #define NIMBLE_PORT_LOG_TAG          "BLE_INIT"
59 #define OSI_COEX_VERSION              0x00010006
60 #define OSI_COEX_MAGIC_VALUE          0xFADEBEAD
61 
62 #define EXT_FUNC_VERSION             0x20240422
63 #define EXT_FUNC_MAGIC_VALUE         0xA5A5A5A5
64 
65 #define BT_ASSERT_PRINT              ets_printf
66 
67 /* Types definition
68  ************************************************************************
69  */
70 struct osi_coex_funcs_t {
71     uint32_t _magic;
72     uint32_t _version;
73     void (* _coex_wifi_sleep_set)(bool sleep);
74     int (* _coex_core_ble_conn_dyn_prio_get)(bool *low, bool *high);
75     void (* _coex_schm_status_bit_set)(uint32_t type, uint32_t status);
76     void (* _coex_schm_status_bit_clear)(uint32_t type, uint32_t status);
77 };
78 
79 struct ext_funcs_t {
80     uint32_t ext_version;
81     int (*_esp_intr_alloc)(int source, int flags, intr_handler_t handler, void *arg, void **ret_handle);
82     int (*_esp_intr_free)(void **ret_handle);
83     void *(* _malloc)(size_t size);
84     void (*_free)(void *p);
85     int (* _task_create)(void *task_func, const char *name, uint32_t stack_depth, void *param,
86                          uint32_t prio, void *task_handle, uint32_t core_id);
87     void (* _task_delete)(void *task_handle);
88     void (*_osi_assert)(const uint32_t ln, const char *fn, uint32_t param1, uint32_t param2);
89     uint32_t (* _os_random)(void);
90     int (* _ecc_gen_key_pair)(uint8_t *public, uint8_t *priv);
91     int (* _ecc_gen_dh_key)(const uint8_t *remote_pub_key_x, const uint8_t *remote_pub_key_y,
92                             const uint8_t *local_priv_key, uint8_t *dhkey);
93     void (* _esp_reset_rpa_moudle)(void);
94     uint32_t magic;
95 };
96 
97 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
98 typedef void (*interface_func_t) (uint32_t len, const uint8_t*addr, bool end);
99 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
100 /* External functions or variables
101  ************************************************************************
102  */
103 extern int ble_osi_coex_funcs_register(struct osi_coex_funcs_t *coex_funcs);
104 extern int r_ble_controller_init(esp_bt_controller_config_t *cfg);
105 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
106 extern int r_ble_log_init_async(interface_func_t bt_controller_log_interface, bool task_create, uint8_t buffers, uint32_t *bufs_size);
107 extern int r_ble_log_deinit_async(void);
108 extern void r_ble_log_async_select_dump_buffers(uint8_t buffers);
109 extern void r_ble_log_async_output_dump_all(bool output);
110 extern void esp_panic_handler_reconfigure_wdts(uint32_t timeout_ms);
111 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
112 extern int r_ble_controller_deinit(void);
113 extern int r_ble_controller_enable(uint8_t mode);
114 extern int r_ble_controller_disable(void);
115 extern int esp_register_ext_funcs (struct ext_funcs_t *);
116 extern void esp_unregister_ext_funcs (void);
117 extern int r_esp_ble_ll_set_public_addr(const uint8_t *addr);
118 extern int esp_register_npl_funcs (struct npl_funcs_t *p_npl_func);
119 extern void esp_unregister_npl_funcs (void);
120 extern void npl_freertos_mempool_deinit(void);
121 extern uint32_t r_os_cputime_get32(void);
122 extern uint32_t r_os_cputime_ticks_to_usecs(uint32_t ticks);
123 extern void r_ble_lll_rfmgmt_set_sleep_cb(void *s_cb, void *w_cb, void *s_arg,
124                                           void *w_arg, uint32_t us_to_enabled);
125 extern void r_ble_rtc_wake_up_state_clr(void);
126 extern int os_msys_init(void);
127 extern void os_msys_deinit(void);
128 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
129 extern sleep_retention_entries_config_t *r_esp_ble_mac_retention_link_get(uint8_t *size, uint8_t extra);
130 extern void r_esp_ble_set_wakeup_overhead(uint32_t overhead);
131 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
132 #if CONFIG_PM_ENABLE
133 extern void r_esp_ble_stop_wakeup_timing(void);
134 #endif // CONFIG_PM_ENABLE
135 extern void r_esp_ble_change_rtc_freq(uint32_t freq);
136 extern int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x,
137                                 const uint8_t *peer_pub_key_y,
138                                 const uint8_t *our_priv_key, uint8_t *out_dhkey);
139 extern int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv);
140 extern int r_ble_txpwr_set(esp_ble_enhanced_power_type_t power_type, uint16_t handle, int power_level);
141 extern int r_ble_txpwr_get(esp_ble_enhanced_power_type_t power_type, uint16_t handle);
142 extern int r_ble_get_npl_element_info(esp_bt_controller_config_t *cfg, ble_npl_count_info_t * npl_info);
143 extern char *ble_controller_get_compile_version(void);
144 extern int esp_ble_register_bb_funcs(void);
145 extern void esp_ble_unregister_bb_funcs(void);
146 extern uint32_t _bt_bss_start;
147 extern uint32_t _bt_bss_end;
148 extern uint32_t _bt_controller_bss_start;
149 extern uint32_t _bt_controller_bss_end;
150 extern uint32_t _bt_data_start;
151 extern uint32_t _bt_data_end;
152 extern uint32_t _bt_controller_data_start;
153 extern uint32_t _bt_controller_data_end;
154 
155 /* Local Function Declaration
156  *********************************************************************
157  */
158 static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status);
159 static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status);
160 static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth,
161                                void *param, uint32_t prio, void *task_handle, uint32_t core_id);
162 static void task_delete_wrapper(void *task_handle);
163 static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler,
164                                   void *arg, void **ret_handle_in);
165 static int esp_intr_free_wrapper(void **ret_handle);
166 static void osi_assert_wrapper(const uint32_t ln, const char *fn, uint32_t param1, uint32_t param2);
167 static uint32_t osi_random_wrapper(void);
168 static void esp_reset_rpa_moudle(void);
169 static int esp_ecc_gen_key_pair(uint8_t *pub, uint8_t *priv);
170 static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
171                               const uint8_t *our_priv_key, uint8_t *out_dhkey);
172 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
173 static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, bool end);
174 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
175 static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void);
176 #endif // #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
177 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
178 /* Local variable definition
179  ***************************************************************************
180  */
181 /* Static variable declare */
182 static DRAM_ATTR esp_bt_controller_status_t ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
183 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
184 const static uint32_t log_bufs_size[] = {CONFIG_BT_LE_LOG_CTRL_BUF1_SIZE, CONFIG_BT_LE_LOG_HCI_BUF_SIZE, CONFIG_BT_LE_LOG_CTRL_BUF2_SIZE};
185 enum log_out_mode {
186     LOG_DUMP_MEMORY,
187     LOG_ASYNC_OUT,
188     LOG_STORAGE_TO_FLASH,
189 };
190 
191 bool log_is_inited = false;
192 #if CONFIG_BT_LE_CONTROLLER_LOG_DUMP_ONLY
193 uint8_t log_output_mode = LOG_DUMP_MEMORY;
194 #else
195 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
196 uint8_t log_output_mode = LOG_STORAGE_TO_FLASH;
197 #else
198 uint8_t log_output_mode = LOG_ASYNC_OUT;
199 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
200 #endif // CONFIG_BT_LE_CONTROLLER_LOG_DUMP_ONLY
201 
esp_bt_log_output_mode_set(uint8_t output_mode)202 void esp_bt_log_output_mode_set(uint8_t output_mode)
203 {
204     log_output_mode = output_mode;
205 }
206 
esp_bt_log_output_mode_get(void)207 uint8_t esp_bt_log_output_mode_get(void)
208 {
209     return log_output_mode;
210 }
211 
esp_bt_controller_log_init(uint8_t log_output_mode)212 esp_err_t esp_bt_controller_log_init(uint8_t log_output_mode)
213 {
214     esp_err_t ret = ESP_OK;
215     interface_func_t bt_controller_log_interface;
216     bt_controller_log_interface = esp_bt_controller_log_interface;
217     bool task_create;
218     uint8_t buffers = 0;
219 
220     if (log_is_inited) {
221         return ret;
222     }
223 
224 #if CONFIG_BT_LE_CONTROLLER_LOG_CTRL_ENABLED
225     buffers |= ESP_BLE_LOG_BUF_CONTROLLER;
226 #endif // CONFIG_BT_LE_CONTROLLER_LOG_CTRL_ENABLED
227 #if CONFIG_BT_LE_CONTROLLER_LOG_HCI_ENABLED
228     buffers |= ESP_BLE_LOG_BUF_HCI;
229 #endif // CONFIG_BT_LE_CONTROLLER_LOG_HCI_ENABLED
230 
231     switch (log_output_mode) {
232         case LOG_DUMP_MEMORY:
233             task_create = false;
234             break;
235         case LOG_ASYNC_OUT:
236         case LOG_STORAGE_TO_FLASH:
237             task_create = true;
238 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
239             if (log_output_mode == LOG_STORAGE_TO_FLASH) {
240                 esp_bt_ctrl_log_partition_get_and_erase_first_block();
241             }
242 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
243             break;
244         default:
245             assert(0);
246     }
247 
248     ret = r_ble_log_init_async(bt_controller_log_interface, task_create, buffers, (uint32_t *)log_bufs_size);
249     if (ret == ESP_OK) {
250         log_is_inited = true;
251     }
252     return ret;
253 }
254 
esp_bt_ontroller_log_deinit(void)255 void esp_bt_ontroller_log_deinit(void)
256 {
257     r_ble_log_deinit_async();
258     log_is_inited = false;
259 }
260 
261 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
262 #include "esp_partition.h"
263 #include "hal/wdt_hal.h"
264 
265 #define MAX_STORAGE_SIZE          (CONFIG_BT_LE_CONTROLLER_LOG_PARTITION_SIZE)
266 #define BLOCK_SIZE                (4096)
267 #define THRESHOLD                 (3072)
268 #define PARTITION_NAME            "bt_ctrl_log"
269 
270 static const esp_partition_t *log_partition;
271 static uint32_t write_index = 0;
272 static uint32_t next_erase_index = BLOCK_SIZE;
273 static bool block_erased = false;
274 static bool stop_write = false;
275 static bool is_filled = false;
276 
esp_bt_ctrl_log_partition_get_and_erase_first_block(void)277 static void esp_bt_ctrl_log_partition_get_and_erase_first_block(void)
278 {
279     log_partition = NULL;
280     assert(MAX_STORAGE_SIZE % BLOCK_SIZE == 0);
281     // Find the partition map in the partition table
282     log_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, PARTITION_NAME);
283     assert(log_partition != NULL);
284     // Prepare data to be read later using the mapped address
285     ESP_ERROR_CHECK(esp_partition_erase_range(log_partition, 0, BLOCK_SIZE));
286     write_index = 0;
287     next_erase_index = BLOCK_SIZE;
288     block_erased = false;
289     is_filled = false;
290     stop_write = false;
291 }
292 
esp_bt_controller_log_storage(uint32_t len,const uint8_t * addr,bool end)293 static int esp_bt_controller_log_storage(uint32_t len, const uint8_t *addr, bool end)
294 {
295     if (len > MAX_STORAGE_SIZE) {
296         return -1;
297     }
298 
299     if (stop_write) {
300         return 0;
301     }
302 
303     if (((write_index) % BLOCK_SIZE) >= THRESHOLD && !block_erased) {
304         // esp_rom_printf("Ers nxt: %d,%d\n", next_erase_index, write_index);
305         esp_partition_erase_range(log_partition, next_erase_index, BLOCK_SIZE);
306         next_erase_index = (next_erase_index + BLOCK_SIZE) % MAX_STORAGE_SIZE;
307         block_erased = true;
308     }
309 
310     if (((write_index + len) / BLOCK_SIZE) >  (write_index / BLOCK_SIZE)) {
311         block_erased = false;
312     }
313 
314     if (write_index + len <= MAX_STORAGE_SIZE) {
315         esp_partition_write(log_partition, write_index, addr, len);
316         write_index = (write_index + len) % MAX_STORAGE_SIZE;
317     } else {
318         uint32_t first_part_len = MAX_STORAGE_SIZE - write_index;
319         esp_partition_write(log_partition, write_index, addr, first_part_len);
320         esp_partition_write(log_partition, 0, addr + first_part_len, len - first_part_len);
321         write_index = len - first_part_len;
322         is_filled = true;
323         // esp_rom_printf("old idx: %d,%d\n",next_erase_index, write_index);
324     }
325 
326     return 0;
327 }
328 
esp_bt_read_ctrl_log_from_flash(bool output)329 void esp_bt_read_ctrl_log_from_flash(bool output)
330 {
331     esp_partition_mmap_handle_t mmap_handle;
332     uint32_t read_index;
333     const void *mapped_ptr;
334     const uint8_t *buffer;
335     uint32_t print_len;
336     uint32_t max_print_len;
337     esp_err_t err;
338 
339     print_len = 0;
340     max_print_len = 4096;
341     err = esp_partition_mmap(log_partition, 0, MAX_STORAGE_SIZE, ESP_PARTITION_MMAP_DATA, &mapped_ptr, &mmap_handle);
342     if (err != ESP_OK) {
343         ESP_LOGE("FLASH", "Mmap failed: %s", esp_err_to_name(err));
344         return;
345     }
346 
347     portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
348     portENTER_CRITICAL_SAFE(&spinlock);
349     esp_panic_handler_reconfigure_wdts(5000);
350     r_ble_log_async_output_dump_all(true);
351     esp_bt_ontroller_log_deinit();
352     stop_write = true;
353 
354     buffer = (const uint8_t *)mapped_ptr;
355     esp_panic_handler_reconfigure_wdts(5000);
356     if (is_filled) {
357         read_index = next_erase_index;
358     } else {
359         read_index = 0;
360     }
361 
362     esp_rom_printf("\r\nREAD_CHECK:%ld,%ld,%d\r\n",read_index, write_index, is_filled);
363     esp_rom_printf("\r\n[DUMP_START:");
364     while (read_index != write_index) {
365         esp_rom_printf("%02x ", buffer[read_index]);
366         if (print_len > max_print_len) {
367             esp_panic_handler_reconfigure_wdts(5000);
368             print_len = 0;
369         }
370 
371         print_len++;
372         read_index = (read_index + 1) % MAX_STORAGE_SIZE;
373     }
374 
375     esp_rom_printf(":DUMP_END]\r\n");
376     portEXIT_CRITICAL_SAFE(&spinlock);
377     esp_partition_munmap(mmap_handle);
378     err = esp_bt_controller_log_init(log_output_mode);
379     assert(err == ESP_OK);
380 }
381 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
382 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
383 
384 /* This variable tells if BLE is running */
385 static bool s_ble_active = false;
386 #ifdef CONFIG_PM_ENABLE
387 static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock = NULL;
388 #endif // CONFIG_PM_ENABLE
389 static DRAM_ATTR modem_clock_lpclk_src_t s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_INVALID;
390 
391 #define BLE_CONTROLLER_MALLOC_CAPS          (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT|MALLOC_CAP_DMA)
malloc_ble_controller_mem(size_t size)392 void *malloc_ble_controller_mem(size_t size)
393 {
394     return heap_caps_malloc(size, BLE_CONTROLLER_MALLOC_CAPS);
395 }
396 
get_ble_controller_free_heap_size(void)397 uint32_t get_ble_controller_free_heap_size(void)
398 {
399     return heap_caps_get_free_size(BLE_CONTROLLER_MALLOC_CAPS);
400 }
401 
402 #define BLE_RTC_DELAY_US_LIGHT_SLEEP                    (5100)
403 #define BLE_RTC_DELAY_US_MODEM_SLEEP                    (1500)
404 
405 static const struct osi_coex_funcs_t s_osi_coex_funcs_ro = {
406     ._magic = OSI_COEX_MAGIC_VALUE,
407     ._version = OSI_COEX_VERSION,
408     ._coex_wifi_sleep_set = NULL,
409     ._coex_core_ble_conn_dyn_prio_get = NULL,
410     ._coex_schm_status_bit_set = coex_schm_status_bit_set_wrapper,
411     ._coex_schm_status_bit_clear = coex_schm_status_bit_clear_wrapper,
412 };
413 
414 struct ext_funcs_t ext_funcs_ro = {
415     .ext_version = EXT_FUNC_VERSION,
416     ._esp_intr_alloc = esp_intr_alloc_wrapper,
417     ._esp_intr_free = esp_intr_free_wrapper,
418     ._malloc = bt_osi_mem_malloc_internal,
419     ._free = bt_osi_mem_free,
420     ._task_create = task_create_wrapper,
421     ._task_delete = task_delete_wrapper,
422     ._osi_assert = osi_assert_wrapper,
423     ._os_random = osi_random_wrapper,
424     ._ecc_gen_key_pair = esp_ecc_gen_key_pair,
425     ._ecc_gen_dh_key = esp_ecc_gen_dh_key,
426     ._esp_reset_rpa_moudle = esp_reset_rpa_moudle,
427     .magic = EXT_FUNC_MAGIC_VALUE,
428 };
429 
esp_reset_rpa_moudle(void)430 static void IRAM_ATTR esp_reset_rpa_moudle(void)
431 {
432 
433 }
434 
osi_assert_wrapper(const uint32_t ln,const char * fn,uint32_t param1,uint32_t param2)435 static void IRAM_ATTR osi_assert_wrapper(const uint32_t ln, const char *fn,
436                                          uint32_t param1, uint32_t param2)
437 {
438     BT_ASSERT_PRINT("BLE assert: line %d in function %s, param: 0x%x, 0x%x", ln, fn, param1, param2);
439 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
440     esp_ble_controller_log_dump_all(true);
441 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
442     assert(0);
443 }
444 
osi_random_wrapper(void)445 static uint32_t IRAM_ATTR osi_random_wrapper(void)
446 {
447     return esp_random();
448 }
449 
coex_schm_status_bit_set_wrapper(uint32_t type,uint32_t status)450 static void coex_schm_status_bit_set_wrapper(uint32_t type, uint32_t status)
451 {
452 #if CONFIG_SW_COEXIST_ENABLE
453     coex_schm_status_bit_set(type, status);
454 #endif // CONFIG_SW_COEXIST_ENABLE
455 }
456 
coex_schm_status_bit_clear_wrapper(uint32_t type,uint32_t status)457 static void coex_schm_status_bit_clear_wrapper(uint32_t type, uint32_t status)
458 {
459 #if CONFIG_SW_COEXIST_ENABLE
460     coex_schm_status_bit_clear(type, status);
461 #endif // CONFIG_SW_COEXIST_ENABLE
462 }
463 
task_create_wrapper(void * task_func,const char * name,uint32_t stack_depth,void * param,uint32_t prio,void * task_handle,uint32_t core_id)464 static int task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth,
465                                 void *param, uint32_t prio, void *task_handle, uint32_t core_id)
466 {
467     return (uint32_t)xTaskCreatePinnedToCore(task_func, name, stack_depth, param, prio, task_handle,
468                                              (core_id < portNUM_PROCESSORS ? core_id : tskNO_AFFINITY));
469 }
470 
task_delete_wrapper(void * task_handle)471 static void task_delete_wrapper(void *task_handle)
472 {
473     vTaskDelete(task_handle);
474 }
475 
esp_ecc_gen_key_pair(uint8_t * pub,uint8_t * priv)476 static int esp_ecc_gen_key_pair(uint8_t *pub, uint8_t *priv)
477 {
478     int rc = -1;
479 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
480     rc = ble_sm_alg_gen_key_pair(pub, priv);
481 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
482     return rc;
483 }
484 
esp_ecc_gen_dh_key(const uint8_t * peer_pub_key_x,const uint8_t * peer_pub_key_y,const uint8_t * our_priv_key,uint8_t * out_dhkey)485 static int esp_ecc_gen_dh_key(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
486                               const uint8_t *our_priv_key, uint8_t *out_dhkey)
487 {
488     int rc = -1;
489 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
490     rc = ble_sm_alg_gen_dhkey(peer_pub_key_x, peer_pub_key_y, our_priv_key, out_dhkey);
491 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
492     return rc;
493 }
494 
esp_intr_alloc_wrapper(int source,int flags,intr_handler_t handler,void * arg,void ** ret_handle_in)495 static int esp_intr_alloc_wrapper(int source, int flags, intr_handler_t handler,
496                                   void *arg, void **ret_handle_in)
497 {
498     int rc = esp_intr_alloc(source, flags | ESP_INTR_FLAG_IRAM, handler,
499                             arg, (intr_handle_t *)ret_handle_in);
500     return rc;
501 }
502 
esp_intr_free_wrapper(void ** ret_handle)503 static int esp_intr_free_wrapper(void **ret_handle)
504 {
505     int rc = 0;
506     rc = esp_intr_free((intr_handle_t) * ret_handle);
507     *ret_handle = NULL;
508     return rc;
509 }
510 
esp_bt_rtc_slow_clk_select(uint8_t slow_clk_src)511 void esp_bt_rtc_slow_clk_select(uint8_t slow_clk_src)
512 {
513     /* Select slow clock source for BT momdule */
514     switch (slow_clk_src) {
515         case MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL:
516             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using main XTAL as clock source");
517             modem_clock_select_lp_clock_source(PERIPH_BT_MODULE, slow_clk_src, (320 - 1));
518             break;
519         case MODEM_CLOCK_LPCLK_SRC_RC_SLOW:
520             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using 136 kHz RC as clock source, can only run legacy ADV or SCAN due to low clock accuracy!");
521             modem_clock_select_lp_clock_source(PERIPH_BT_MODULE, slow_clk_src, (5 - 1));
522             break;
523         case MODEM_CLOCK_LPCLK_SRC_XTAL32K:
524             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using external 32.768 kHz XTAL as clock source");
525             modem_clock_select_lp_clock_source(PERIPH_BT_MODULE, slow_clk_src, (1 - 1));
526             break;
527         case MODEM_CLOCK_LPCLK_SRC_RC32K:
528             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using 32 kHz RC as clock source, can only run legacy ADV or SCAN due to low clock accuracy!");
529             modem_clock_select_lp_clock_source(PERIPH_BT_MODULE, slow_clk_src, (1 - 1));
530             break;
531         case MODEM_CLOCK_LPCLK_SRC_EXT32K:
532             ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Using 32 kHz oscillator as clock source, can only run legacy ADV or SCAN due to low clock accuracy!");
533             modem_clock_select_lp_clock_source(PERIPH_BT_MODULE, slow_clk_src, (1 - 1));
534             break;
535         default:
536     }
537 }
538 
esp_bt_get_lpclk_src(void)539 modem_clock_lpclk_src_t esp_bt_get_lpclk_src(void)
540 {
541     return s_bt_lpclk_src;
542 }
543 
esp_bt_set_lpclk_src(modem_clock_lpclk_src_t clk_src)544 void esp_bt_set_lpclk_src(modem_clock_lpclk_src_t clk_src)
545 {
546     if (clk_src >= MODEM_CLOCK_LPCLK_SRC_MAX) {
547         return;
548     }
549 
550     s_bt_lpclk_src = clk_src;
551 }
552 
controller_sleep_cb(uint32_t enable_tick,void * arg)553 IRAM_ATTR void controller_sleep_cb(uint32_t enable_tick, void *arg)
554 {
555     if (!s_ble_active) {
556         return;
557     }
558 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
559     r_ble_rtc_wake_up_state_clr();
560 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
561     esp_phy_disable(PHY_MODEM_BT);
562 #ifdef CONFIG_PM_ENABLE
563     esp_pm_lock_release(s_pm_lock);
564 #endif // CONFIG_PM_ENABLE
565     s_ble_active = false;
566 }
567 
controller_wakeup_cb(void * arg)568 IRAM_ATTR void controller_wakeup_cb(void *arg)
569 {
570     if (s_ble_active) {
571         return;
572     }
573 #ifdef CONFIG_PM_ENABLE
574     esp_pm_lock_acquire(s_pm_lock);
575     r_ble_rtc_wake_up_state_clr();
576 #endif //CONFIG_PM_ENABLE
577     esp_phy_enable(PHY_MODEM_BT);
578     s_ble_active = true;
579 }
580 
581 #ifdef CONFIG_FREERTOS_USE_TICKLESS_IDLE
sleep_modem_ble_mac_retention_init(void * arg)582 static esp_err_t sleep_modem_ble_mac_retention_init(void *arg)
583 {
584     uint8_t size;
585     int extra = *(int *)arg;
586     sleep_retention_entries_config_t *ble_mac_modem_config = r_esp_ble_mac_retention_link_get(&size, extra);
587     esp_err_t err = sleep_retention_entries_create(ble_mac_modem_config, size, REGDMA_LINK_PRI_BT_MAC_BB, SLEEP_RETENTION_MODULE_BLE_MAC);
588     if (err == ESP_OK) {
589         ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Modem BLE MAC retention initialization");
590     }
591     return err;
592 }
593 
sleep_modem_ble_mac_modem_state_init(uint8_t extra)594 static esp_err_t sleep_modem_ble_mac_modem_state_init(uint8_t extra)
595 {
596     int retention_args = extra;
597     sleep_retention_module_init_param_t init_param = {
598         .cbs     = { .create = { .handle = sleep_modem_ble_mac_retention_init, .arg = &retention_args } },
599         .depends = BIT(SLEEP_RETENTION_MODULE_BT_BB)
600     };
601     esp_err_t err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_BLE_MAC, &init_param);
602     if (err == ESP_OK) {
603         err = sleep_retention_module_allocate(SLEEP_RETENTION_MODULE_BLE_MAC);
604     }
605     return err;
606 }
607 
sleep_modem_ble_mac_modem_state_deinit(void)608 static void sleep_modem_ble_mac_modem_state_deinit(void)
609 {
610     esp_err_t err = sleep_retention_module_free(SLEEP_RETENTION_MODULE_BLE_MAC);
611     if (err == ESP_OK) {
612         err = sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_BLE_MAC);
613         assert(err == ESP_OK);
614     }
615 }
616 
sleep_modem_light_sleep_overhead_set(uint32_t overhead)617 void IRAM_ATTR sleep_modem_light_sleep_overhead_set(uint32_t overhead)
618 {
619     r_esp_ble_set_wakeup_overhead(overhead);
620 }
621 #endif /* CONFIG_FREERTOS_USE_TICKLESS_IDLE */
622 
623 
controller_sleep_init(void)624 esp_err_t controller_sleep_init(void)
625 {
626     esp_err_t rc = 0;
627 
628 #ifdef CONFIG_BT_LE_SLEEP_ENABLE
629     ESP_LOGW(NIMBLE_PORT_LOG_TAG, "BLE modem sleep is enabled");
630 #if CONFIG_FREERTOS_USE_TICKLESS_IDLE
631     r_ble_lll_rfmgmt_set_sleep_cb(controller_sleep_cb, controller_wakeup_cb, 0, 0,
632                                 BLE_RTC_DELAY_US_LIGHT_SLEEP);
633 #else
634     r_ble_lll_rfmgmt_set_sleep_cb(controller_sleep_cb, controller_wakeup_cb, 0, 0,
635                                 BLE_RTC_DELAY_US_MODEM_SLEEP);
636 #endif /* FREERTOS_USE_TICKLESS_IDLE */
637 #endif // CONFIG_BT_LE_SLEEP_ENABLE
638 
639 #ifdef CONFIG_PM_ENABLE
640     rc = esp_pm_lock_create(ESP_PM_CPU_FREQ_MAX, 0, "bt", &s_pm_lock);
641     if (rc != ESP_OK) {
642         goto error;
643     }
644     rc = esp_deep_sleep_register_hook(&r_esp_ble_stop_wakeup_timing);
645     if (rc != ESP_OK) {
646         goto error;
647     }
648 #endif //CONFIG_PM_ENABLE
649 #if CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE
650     /* Create a new regdma link for BLE related register restoration */
651     rc = sleep_modem_ble_mac_modem_state_init(0);
652     if (rc != ESP_OK) {
653         goto error;
654     }
655     esp_sleep_enable_bt_wakeup();
656     ESP_LOGW(NIMBLE_PORT_LOG_TAG, "Enable light sleep, the wake up source is BLE timer");
657 
658     rc = esp_pm_register_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
659     if (rc != ESP_OK) {
660         goto error;
661     }
662 #endif /* CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE */
663     return rc;
664 
665 #ifdef CONFIG_PM_ENABLE
666 error:
667 #endif // CONFIG_PM_ENABLE
668 #if CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE
669     esp_sleep_disable_bt_wakeup();
670     esp_pm_unregister_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
671 #endif /* CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE */
672 #ifdef CONFIG_PM_ENABLE
673     esp_deep_sleep_deregister_hook(&r_esp_ble_stop_wakeup_timing);
674     /*lock should release first and then delete*/
675     if (s_pm_lock != NULL) {
676         esp_pm_lock_delete(s_pm_lock);
677         s_pm_lock = NULL;
678     }
679 #endif // CONFIG_PM_ENABLE
680 
681     return rc;
682 }
683 
controller_sleep_deinit(void)684 void controller_sleep_deinit(void)
685 {
686 #if CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE
687     r_ble_rtc_wake_up_state_clr();
688     esp_sleep_disable_bt_wakeup();
689     sleep_modem_ble_mac_modem_state_deinit();
690     esp_pm_unregister_inform_out_light_sleep_overhead_callback(sleep_modem_light_sleep_overhead_set);
691 #endif /* CONFIG_BT_LE_SLEEP_ENABLE && CONFIG_FREERTOS_USE_TICKLESS_IDLE */
692 #ifdef CONFIG_PM_ENABLE
693     esp_deep_sleep_deregister_hook(&r_esp_ble_stop_wakeup_timing);
694     /* lock should be released first */
695     esp_pm_lock_delete(s_pm_lock);
696     s_pm_lock = NULL;
697 #endif //CONFIG_PM_ENABLE
698 }
699 
700 typedef enum {
701     FILTER_DUPLICATE_PDUTYPE = BIT(0),
702     FILTER_DUPLICATE_LENGTH  = BIT(1),
703     FILTER_DUPLICATE_ADDRESS = BIT(2),
704     FILTER_DUPLICATE_ADVDATA = BIT(3),
705     FILTER_DUPLICATE_DEFAULT = FILTER_DUPLICATE_PDUTYPE | FILTER_DUPLICATE_ADDRESS,
706     FILTER_DUPLICATE_PDU_ALL = 0xF,
707     FILTER_DUPLICATE_EXCEPTION_FOR_MESH = BIT(4),
708     FILTER_DUPLICATE_AD_TYPE = BIT(5),
709 }disc_duplicate_mode_t;
710 
711 
712 extern void r_filter_duplicate_mode_enable(disc_duplicate_mode_t mode);
713 extern void r_filter_duplicate_mode_disable(disc_duplicate_mode_t mode);
714 extern void r_filter_duplicate_set_ring_list_max_num(uint32_t max_num);
715 extern void r_scan_duplicate_cache_refresh_set_time(uint32_t period_time);
716 
717 int
ble_vhci_disc_duplicate_mode_enable(int mode)718 ble_vhci_disc_duplicate_mode_enable(int mode)
719 {
720     // TODO: use vendor hci to update
721     r_filter_duplicate_mode_enable(mode);
722     return true;
723 }
724 
725 int
ble_vhci_disc_duplicate_mode_disable(int mode)726 ble_vhci_disc_duplicate_mode_disable(int mode)
727 {
728     // TODO: use vendor hci to update
729     r_filter_duplicate_mode_disable(mode);
730     return true;
731 }
732 
ble_vhci_disc_duplicate_set_max_cache_size(int max_cache_size)733 int ble_vhci_disc_duplicate_set_max_cache_size(int max_cache_size){
734     // TODO: use vendor hci to update
735     r_filter_duplicate_set_ring_list_max_num(max_cache_size);
736     return true;
737 }
738 
ble_vhci_disc_duplicate_set_period_refresh_time(int refresh_period_time)739 int ble_vhci_disc_duplicate_set_period_refresh_time(int refresh_period_time){
740     // TODO: use vendor hci to update
741     r_scan_duplicate_cache_refresh_set_time(refresh_period_time);
742     return true;
743 }
744 
745 /**
746  * @brief Config scan duplicate option mode from menuconfig (Adapt to the old configuration method.)
747  */
ble_controller_scan_duplicate_config(void)748 void ble_controller_scan_duplicate_config(void)
749 {
750     uint32_t duplicate_mode = FILTER_DUPLICATE_DEFAULT;
751     uint32_t cache_size = 100;
752 #if CONFIG_BT_LE_SCAN_DUPL == true
753     cache_size = CONFIG_BT_LE_LL_DUP_SCAN_LIST_COUNT;
754     if (CONFIG_BT_LE_SCAN_DUPL_TYPE == 0) {
755         duplicate_mode = FILTER_DUPLICATE_ADDRESS | FILTER_DUPLICATE_PDUTYPE;
756     } else if (CONFIG_BT_LE_SCAN_DUPL_TYPE == 1) {
757         duplicate_mode = FILTER_DUPLICATE_ADVDATA;
758     } else if (CONFIG_BT_LE_SCAN_DUPL_TYPE == 2) {
759         duplicate_mode = FILTER_DUPLICATE_ADDRESS | FILTER_DUPLICATE_ADVDATA;
760     }
761     duplicate_mode |= FILTER_DUPLICATE_EXCEPTION_FOR_MESH;
762 
763     ble_vhci_disc_duplicate_set_period_refresh_time(CONFIG_BT_LE_SCAN_DUPL_CACHE_REFRESH_PERIOD);
764 #endif
765 
766     ble_vhci_disc_duplicate_mode_disable(0xFFFFFFFF);
767     ble_vhci_disc_duplicate_mode_enable(duplicate_mode);
768     ble_vhci_disc_duplicate_set_max_cache_size(cache_size);
769 }
770 
ble_rtc_clk_init(esp_bt_controller_config_t * cfg)771 static void ble_rtc_clk_init(esp_bt_controller_config_t *cfg)
772 {
773     if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_INVALID) {
774 #if CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL
775         s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL;
776 #else
777 #if CONFIG_RTC_CLK_SRC_INT_RC
778         s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_RC_SLOW;
779 #elif CONFIG_RTC_CLK_SRC_EXT_CRYS
780         if (rtc_clk_slow_src_get() == SOC_RTC_SLOW_CLK_SRC_XTAL32K) {
781             s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_XTAL32K;
782         } else {
783             ESP_LOGW(NIMBLE_PORT_LOG_TAG, "32.768kHz XTAL not detected, fall back to main XTAL as Bluetooth sleep clock");
784             s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL;
785         }
786 #elif CONFIG_RTC_CLK_SRC_INT_RC32K
787         s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_RC32K;
788 #elif CONFIG_RTC_CLK_SRC_EXT_OSC
789         s_bt_lpclk_src = MODEM_CLOCK_LPCLK_SRC_EXT32K;
790 #else
791         ESP_LOGE(NIMBLE_PORT_LOG_TAG, "Unsupported clock source");
792         assert(0);
793 #endif
794 #endif /* CONFIG_BT_LE_LP_CLK_SRC_MAIN_XTAL */
795     }
796 
797     if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_MAIN_XTAL) {
798         cfg->rtc_freq = 100000;
799     } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_XTAL32K) {
800         cfg->rtc_freq = 32768;
801     } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC_SLOW) {
802         cfg->rtc_freq = 30000;
803     } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_RC32K) {
804         cfg->rtc_freq = 32000;
805     } else if (s_bt_lpclk_src == MODEM_CLOCK_LPCLK_SRC_EXT32K) {
806         cfg->rtc_freq = 32000;
807     }
808     esp_bt_rtc_slow_clk_select(s_bt_lpclk_src);
809 }
810 
esp_bt_controller_init(esp_bt_controller_config_t * cfg)811 esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
812 {
813     uint8_t mac[6];
814     esp_err_t ret = ESP_OK;
815     ble_npl_count_info_t npl_info;
816     uint8_t hci_transport_mode;
817 
818     memset(&npl_info, 0, sizeof(ble_npl_count_info_t));
819     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) {
820         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
821         return ESP_ERR_INVALID_STATE;
822     }
823 
824     if (!cfg) {
825         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "cfg is NULL");
826         return ESP_ERR_INVALID_ARG;
827     }
828 
829     ret = esp_register_ext_funcs(&ext_funcs_ro);
830     if (ret != ESP_OK) {
831         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "register extend functions failed");
832         return ret;
833     }
834 
835     /* Initialize the function pointers for OS porting */
836     npl_freertos_funcs_init();
837     struct npl_funcs_t *p_npl_funcs = npl_freertos_funcs_get();
838     if (!p_npl_funcs) {
839         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl functions get failed");
840         return ESP_ERR_INVALID_ARG;
841     }
842 
843     ret = esp_register_npl_funcs(p_npl_funcs);
844     if (ret != ESP_OK) {
845         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl functions register failed");
846         goto free_mem;
847     }
848 
849     r_ble_get_npl_element_info(cfg, &npl_info);
850     npl_freertos_set_controller_npl_info(&npl_info);
851     if (npl_freertos_mempool_init() != 0) {
852         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl mempool init failed");
853         ret = ESP_ERR_INVALID_ARG;
854         goto free_mem;
855     }
856 
857 #if CONFIG_BT_NIMBLE_ENABLED
858     /* ble_npl_eventq_init() needs to use npl functions in rom and
859      * must be called after esp_bt_controller_init().
860      */
861     ble_npl_eventq_init(nimble_port_get_dflt_eventq());
862 #endif // CONFIG_BT_NIMBLE_ENABLED
863     /* Enable BT-related clocks */
864     modem_clock_module_enable(PERIPH_BT_MODULE);
865     modem_clock_module_mac_reset(PERIPH_BT_MODULE);
866     /* Select slow clock source for BT momdule */
867     ble_rtc_clk_init(cfg);
868 
869     if (ble_osi_coex_funcs_register((struct osi_coex_funcs_t *)&s_osi_coex_funcs_ro) != 0) {
870         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "osi coex funcs reg failed");
871         ret = ESP_ERR_INVALID_ARG;
872         goto modem_deint;
873     }
874 
875 #if CONFIG_SW_COEXIST_ENABLE
876     coex_init();
877 #endif // CONFIG_SW_COEXIST_ENABLE
878 
879 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
880     ret = esp_bt_controller_log_init(log_output_mode);
881     if (ret != ESP_OK) {
882         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "ble_controller_log_init failed %d", ret);
883         goto modem_deint;
884     }
885 #endif // CONFIG_BT_CONTROLLER_LOG_ENABLED
886     ret = esp_ble_register_bb_funcs();
887     if (ret != ESP_OK) {
888         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "esp_ble_register_bb_funcs failed %d", ret);
889         goto modem_deint;
890     }
891 
892     ret = r_ble_controller_init(cfg);
893     if (ret != ESP_OK) {
894         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "r_ble_controller_init failed %d", ret);
895         goto modem_deint;
896     }
897 
898     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "ble controller commit:[%s]", ble_controller_get_compile_version());
899 
900     ble_controller_scan_duplicate_config();
901 
902     ret = os_msys_init();
903     if (ret != ESP_OK) {
904         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "msys_init failed %d", ret);
905         goto free_controller;
906     }
907 
908     ret = controller_sleep_init();
909     if (ret != ESP_OK) {
910         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "controller_sleep_init failed %d", ret);
911         goto free_controller;
912     }
913     ESP_ERROR_CHECK(esp_read_mac((uint8_t *)mac, ESP_MAC_BT));
914     ESP_LOGI(NIMBLE_PORT_LOG_TAG, "Bluetooth MAC: %02x:%02x:%02x:%02x:%02x:%02x",
915              mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
916     swap_in_place(mac, 6);
917     r_esp_ble_ll_set_public_addr(mac);
918 
919     ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED;
920 
921 #if CONFIG_BT_LE_HCI_INTERFACE_USE_RAM
922     hci_transport_mode = HCI_TRANSPORT_VHCI;
923 #elif CONFIG_BT_LE_HCI_INTERFACE_USE_UART
924     hci_transport_mode = HCI_TRANSPORT_UART_NO_DMA;
925 #if CONFIG_BT_LE_UART_HCI_DMA_MODE
926     hci_transport_mode = HCI_TRANSPORT_UART_UHCI;
927 #endif // CONFIG_BT_LE_UART_HCI_DMA_MODE
928 #endif // CONFIG_BT_LE_HCI_INTERFACE_USE_RAM
929     ret = hci_transport_init(hci_transport_mode);
930     if (ret) {
931         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "hci transport init failed %d", ret);
932         goto free_controller;
933     }
934 
935     return ESP_OK;
936 free_controller:
937     hci_transport_deinit();
938     controller_sleep_deinit();
939     os_msys_deinit();
940     r_ble_controller_deinit();
941 modem_deint:
942     esp_ble_unregister_bb_funcs();
943 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
944     esp_bt_ontroller_log_deinit();
945 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
946     modem_clock_deselect_lp_clock_source(PERIPH_BT_MODULE);
947     modem_clock_module_disable(PERIPH_BT_MODULE);
948 #if CONFIG_BT_NIMBLE_ENABLED
949     ble_npl_eventq_deinit(nimble_port_get_dflt_eventq());
950 #endif // CONFIG_BT_NIMBLE_ENABLED
951 free_mem:
952     npl_freertos_mempool_deinit();
953     esp_unregister_npl_funcs();
954     npl_freertos_funcs_deinit();
955     esp_unregister_ext_funcs();
956     return ret;
957 }
958 
esp_bt_controller_deinit(void)959 esp_err_t esp_bt_controller_deinit(void)
960 {
961     if ((ble_controller_status < ESP_BT_CONTROLLER_STATUS_INITED) ||
962         (ble_controller_status >= ESP_BT_CONTROLLER_STATUS_ENABLED)) {
963         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
964         return ESP_FAIL;
965     }
966 
967     hci_transport_deinit();
968     controller_sleep_deinit();
969 
970     os_msys_deinit();
971 
972     modem_clock_deselect_lp_clock_source(PERIPH_BT_MODULE);
973     modem_clock_module_disable(PERIPH_BT_MODULE);
974 
975     r_ble_controller_deinit();
976     esp_ble_unregister_bb_funcs();
977 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
978     esp_bt_ontroller_log_deinit();
979 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
980 
981 #if CONFIG_BT_NIMBLE_ENABLED
982     /* De-initialize default event queue */
983     ble_npl_eventq_deinit(nimble_port_get_dflt_eventq());
984 #endif // CONFIG_BT_NIMBLE_ENABLED
985 
986     esp_unregister_npl_funcs();
987 
988     esp_unregister_ext_funcs();
989 
990     /* De-initialize npl functions */
991     npl_freertos_funcs_deinit();
992 
993     npl_freertos_mempool_deinit();
994 
995     ble_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
996 
997     return ESP_OK;
998 }
999 
esp_bt_controller_enable(esp_bt_mode_t mode)1000 esp_err_t esp_bt_controller_enable(esp_bt_mode_t mode)
1001 {
1002     esp_err_t ret = ESP_OK;
1003 
1004     if (mode != ESP_BT_MODE_BLE) {
1005         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller mode");
1006         return ESP_FAIL;
1007     }
1008     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_INITED) {
1009         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
1010         return ESP_FAIL;
1011     }
1012     if (!s_ble_active) {
1013 #if CONFIG_PM_ENABLE
1014         esp_pm_lock_acquire(s_pm_lock);
1015 #endif  // CONFIG_PM_ENABLE
1016         esp_phy_enable(PHY_MODEM_BT);
1017         s_ble_active = true;
1018     }
1019     esp_btbb_enable();
1020 #if CONFIG_SW_COEXIST_ENABLE
1021     coex_enable();
1022 #endif // CONFIG_SW_COEXIST_ENABLE
1023 
1024     if (r_ble_controller_enable(mode) != 0) {
1025         ret = ESP_FAIL;
1026         goto error;
1027     }
1028     ble_controller_status = ESP_BT_CONTROLLER_STATUS_ENABLED;
1029     return ESP_OK;
1030 
1031 error:
1032 #if CONFIG_SW_COEXIST_ENABLE
1033     coex_disable();
1034 #endif
1035     esp_btbb_disable();
1036     if (s_ble_active) {
1037         esp_phy_disable(PHY_MODEM_BT);
1038 #if CONFIG_PM_ENABLE
1039         esp_pm_lock_release(s_pm_lock);
1040 #endif  // CONFIG_PM_ENABLE
1041         s_ble_active = false;
1042     }
1043     return ret;
1044 }
1045 
esp_bt_controller_disable(void)1046 esp_err_t esp_bt_controller_disable(void)
1047 {
1048     if (ble_controller_status < ESP_BT_CONTROLLER_STATUS_ENABLED) {
1049         ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state");
1050         return ESP_FAIL;
1051     }
1052     if (r_ble_controller_disable() != 0) {
1053         return ESP_FAIL;
1054     }
1055 #if CONFIG_SW_COEXIST_ENABLE
1056     coex_disable();
1057 #endif
1058     esp_btbb_disable();
1059     if (s_ble_active) {
1060         esp_phy_disable(PHY_MODEM_BT);
1061 #if CONFIG_PM_ENABLE
1062         esp_pm_lock_release(s_pm_lock);
1063 #endif  // CONFIG_PM_ENABLE
1064         s_ble_active = false;
1065     }
1066     ble_controller_status = ESP_BT_CONTROLLER_STATUS_INITED;
1067     return ESP_OK;
1068 }
1069 
esp_bt_controller_mem_release(esp_bt_mode_t mode)1070 esp_err_t esp_bt_controller_mem_release(esp_bt_mode_t mode)
1071 {
1072     ESP_LOGD(NIMBLE_PORT_LOG_TAG, "%s not implemented, return OK", __func__);
1073     return ESP_OK;
1074 }
1075 
try_heap_caps_add_region(intptr_t start,intptr_t end)1076 static esp_err_t try_heap_caps_add_region(intptr_t start, intptr_t end)
1077 {
1078     int ret = heap_caps_add_region(start, end);
1079 
1080     /* heap_caps_add_region() returns ESP_ERR_INVALID_SIZE if the memory region is
1081      * is too small to fit a heap. This cannot be termed as a fatal error and hence
1082      * we replace it by ESP_OK
1083      */
1084     if (ret == ESP_ERR_INVALID_SIZE) {
1085         return ESP_OK;
1086     }
1087     return ret;
1088 }
1089 
1090 
1091 typedef struct {
1092     intptr_t start;
1093     intptr_t end;
1094     const char* name;
1095 } bt_area_t;
1096 
esp_bt_mem_release_area(const bt_area_t * area)1097 static esp_err_t esp_bt_mem_release_area(const bt_area_t *area)
1098 {
1099     esp_err_t ret = ESP_OK;
1100     intptr_t mem_start = area->start;
1101     intptr_t mem_end = area->end;
1102     if (mem_start != mem_end) {
1103         ESP_LOGD(NIMBLE_PORT_LOG_TAG, "Release %s [0x%08x] - [0x%08x], len %d", area->name, mem_start, mem_end, mem_end - mem_start);
1104         ret = try_heap_caps_add_region(mem_start, mem_end);
1105     }
1106     return ret;
1107 }
1108 
esp_bt_mem_release_areas(const bt_area_t * area1,const bt_area_t * area2)1109 static esp_err_t esp_bt_mem_release_areas(const bt_area_t *area1, const bt_area_t *area2)
1110 {
1111     esp_err_t ret = ESP_OK;
1112 
1113     if (area1->end == area2->start) {
1114         bt_area_t merged_area = {
1115             .start = area1->start,
1116             .end = area2->end,
1117             .name = area1->name
1118         };
1119         ret = esp_bt_mem_release_area(&merged_area);
1120     } else {
1121         esp_bt_mem_release_area(area1);
1122         ret = esp_bt_mem_release_area(area2);
1123     }
1124 
1125     return ret;
1126 }
1127 
esp_bt_mem_release(esp_bt_mode_t mode)1128 esp_err_t esp_bt_mem_release(esp_bt_mode_t mode)
1129 {
1130     esp_err_t ret = ESP_OK;
1131 
1132     if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) {
1133         return ESP_ERR_INVALID_STATE;
1134     }
1135 
1136     bt_area_t bss = {
1137         .start = (intptr_t)&_bt_bss_start,
1138         .end   = (intptr_t)&_bt_bss_end,
1139         .name  = "BT BSS",
1140     };
1141     bt_area_t cont_bss = {
1142         .start = (intptr_t)&_bt_controller_bss_start,
1143         .end   = (intptr_t)&_bt_controller_bss_end,
1144         .name  = "BT Controller BSS",
1145     };
1146     bt_area_t data = {
1147         .start = (intptr_t)&_bt_data_start,
1148         .end   = (intptr_t)&_bt_data_end,
1149         .name  = "BT Data",
1150     };
1151     bt_area_t cont_data = {
1152         .start = (intptr_t)&_bt_controller_data_start,
1153         .end   = (intptr_t)&_bt_controller_data_end,
1154         .name  = "BT Controller Data"
1155     };
1156 
1157     if (mode & ESP_BT_MODE_BLE) {
1158         /* Start by freeing Bluetooth BSS section */
1159         if (ret == ESP_OK) {
1160             ret = esp_bt_mem_release_areas(&bss, &cont_bss);
1161         }
1162 
1163         /* Do the same thing with the Bluetooth data section */
1164         if (ret == ESP_OK) {
1165             ret = esp_bt_mem_release_areas(&data, &cont_data);
1166         }
1167     }
1168 
1169     return ret;
1170 }
1171 
1172 
esp_bt_controller_get_status(void)1173 esp_bt_controller_status_t esp_bt_controller_get_status(void)
1174 {
1175     return ble_controller_status;
1176 }
1177 
esp_ble_tx_power_set(esp_ble_power_type_t power_type,esp_power_level_t power_level)1178 esp_err_t esp_ble_tx_power_set(esp_ble_power_type_t power_type, esp_power_level_t power_level)
1179 {
1180     esp_err_t stat = ESP_FAIL;
1181 
1182     switch (power_type) {
1183     case ESP_BLE_PWR_TYPE_DEFAULT:
1184     case ESP_BLE_PWR_TYPE_ADV:
1185     case ESP_BLE_PWR_TYPE_SCAN:
1186         if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1187             stat = ESP_OK;
1188         }
1189         break;
1190     case ESP_BLE_PWR_TYPE_CONN_HDL0:
1191     case ESP_BLE_PWR_TYPE_CONN_HDL1:
1192     case ESP_BLE_PWR_TYPE_CONN_HDL2:
1193     case ESP_BLE_PWR_TYPE_CONN_HDL3:
1194     case ESP_BLE_PWR_TYPE_CONN_HDL4:
1195     case ESP_BLE_PWR_TYPE_CONN_HDL5:
1196     case ESP_BLE_PWR_TYPE_CONN_HDL6:
1197     case ESP_BLE_PWR_TYPE_CONN_HDL7:
1198     case ESP_BLE_PWR_TYPE_CONN_HDL8:
1199         if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_CONN, power_type, power_level) == 0) {
1200             stat = ESP_OK;
1201         }
1202         break;
1203     default:
1204         stat = ESP_ERR_NOT_SUPPORTED;
1205         break;
1206     }
1207 
1208     return stat;
1209 }
1210 
esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type,uint16_t handle,esp_power_level_t power_level)1211 esp_err_t esp_ble_tx_power_set_enhanced(esp_ble_enhanced_power_type_t power_type, uint16_t handle,
1212                                         esp_power_level_t power_level)
1213 {
1214     esp_err_t stat = ESP_FAIL;
1215     switch (power_type) {
1216     case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1217     case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
1218     case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1219         if (r_ble_txpwr_set(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0, power_level) == 0) {
1220             stat = ESP_OK;
1221         }
1222         break;
1223     case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
1224     case ESP_BLE_ENHANCED_PWR_TYPE_CONN:
1225         if (r_ble_txpwr_set(power_type, handle, power_level) == 0) {
1226             stat = ESP_OK;
1227         }
1228         break;
1229     default:
1230         stat = ESP_ERR_NOT_SUPPORTED;
1231         break;
1232     }
1233 
1234     return stat;
1235 }
1236 
esp_ble_tx_power_get(esp_ble_power_type_t power_type)1237 esp_power_level_t esp_ble_tx_power_get(esp_ble_power_type_t power_type)
1238 {
1239     int tx_level = 0;
1240 
1241     switch (power_type) {
1242     case ESP_BLE_PWR_TYPE_ADV:
1243     case ESP_BLE_PWR_TYPE_SCAN:
1244     case ESP_BLE_PWR_TYPE_DEFAULT:
1245         tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1246         break;
1247     case ESP_BLE_PWR_TYPE_CONN_HDL0:
1248     case ESP_BLE_PWR_TYPE_CONN_HDL1:
1249     case ESP_BLE_PWR_TYPE_CONN_HDL2:
1250     case ESP_BLE_PWR_TYPE_CONN_HDL3:
1251     case ESP_BLE_PWR_TYPE_CONN_HDL4:
1252     case ESP_BLE_PWR_TYPE_CONN_HDL5:
1253     case ESP_BLE_PWR_TYPE_CONN_HDL6:
1254     case ESP_BLE_PWR_TYPE_CONN_HDL7:
1255     case ESP_BLE_PWR_TYPE_CONN_HDL8:
1256         tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_CONN, power_type);
1257         break;
1258     default:
1259         return ESP_PWR_LVL_INVALID;
1260     }
1261 
1262     if (tx_level < 0) {
1263         return ESP_PWR_LVL_INVALID;
1264     }
1265 
1266     return (esp_power_level_t)tx_level;
1267 }
1268 
esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type,uint16_t handle)1269 esp_power_level_t esp_ble_tx_power_get_enhanced(esp_ble_enhanced_power_type_t power_type,
1270                                                 uint16_t handle)
1271 {
1272     int tx_level = 0;
1273 
1274     switch (power_type) {
1275     case ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT:
1276     case ESP_BLE_ENHANCED_PWR_TYPE_SCAN:
1277     case ESP_BLE_ENHANCED_PWR_TYPE_INIT:
1278         tx_level = r_ble_txpwr_get(ESP_BLE_ENHANCED_PWR_TYPE_DEFAULT, 0);
1279         break;
1280     case ESP_BLE_ENHANCED_PWR_TYPE_ADV:
1281     case ESP_BLE_ENHANCED_PWR_TYPE_CONN:
1282         tx_level = r_ble_txpwr_get(power_type, handle);
1283         break;
1284     default:
1285         return ESP_PWR_LVL_INVALID;
1286     }
1287 
1288     if (tx_level < 0) {
1289        return ESP_PWR_LVL_INVALID;
1290     }
1291 
1292     return (esp_power_level_t)tx_level;
1293 }
1294 
1295 #if CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
esp_bt_controller_log_interface(uint32_t len,const uint8_t * addr,bool end)1296 static void esp_bt_controller_log_interface(uint32_t len, const uint8_t *addr, bool end)
1297 {
1298     if (log_output_mode == LOG_STORAGE_TO_FLASH) {
1299 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
1300         esp_bt_controller_log_storage(len, addr, end);
1301 #endif //CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
1302     } else {
1303         portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
1304         portENTER_CRITICAL_SAFE(&spinlock);
1305         esp_panic_handler_reconfigure_wdts(1000);
1306         for (int i = 0; i < len; i++) {
1307             esp_rom_printf("%02x ", addr[i]);
1308         }
1309 
1310         if (end) {
1311             esp_rom_printf("\n");
1312         }
1313         portEXIT_CRITICAL_SAFE(&spinlock);
1314     }
1315 }
1316 
esp_ble_controller_log_dump_all(bool output)1317 void esp_ble_controller_log_dump_all(bool output)
1318 {
1319 #if CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
1320     esp_bt_read_ctrl_log_from_flash(output);
1321 #else
1322     portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
1323 
1324     portENTER_CRITICAL_SAFE(&spinlock);
1325     esp_panic_handler_reconfigure_wdts(5000);
1326     BT_ASSERT_PRINT("\r\n[DUMP_START:");
1327     r_ble_log_async_output_dump_all(output);
1328     BT_ASSERT_PRINT(":DUMP_END]\r\n");
1329     portEXIT_CRITICAL_SAFE(&spinlock);
1330 #endif // CONFIG_BT_LE_CONTROLLER_LOG_STORAGE_ENABLE
1331 }
1332 #endif // CONFIG_BT_LE_CONTROLLER_LOG_ENABLED
1333 
1334 #if (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED)
1335 #if CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
1336 #define BLE_SM_KEY_ERR 0x17
1337 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1338 #include "mbedtls/aes.h"
1339 #if CONFIG_BT_LE_SM_SC
1340 #include "mbedtls/cipher.h"
1341 #include "mbedtls/entropy.h"
1342 #include "mbedtls/ctr_drbg.h"
1343 #include "mbedtls/cmac.h"
1344 #include "mbedtls/ecdh.h"
1345 #include "mbedtls/ecp.h"
1346 
1347 static mbedtls_ecp_keypair keypair;
1348 #endif // CONFIG_BT_LE_SM_SC
1349 
1350 #else
1351 #include "tinycrypt/aes.h"
1352 #include "tinycrypt/constants.h"
1353 #include "tinycrypt/utils.h"
1354 
1355 #if CONFIG_BT_LE_SM_SC
1356 #include "tinycrypt/cmac_mode.h"
1357 #include "tinycrypt/ecc_dh.h"
1358 #endif // CONFIG_BT_LE_SM_SC
1359 #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1360 
1361 /* Based on Core Specification 4.2 Vol 3. Part H 2.3.5.6.1 */
1362 static const uint8_t ble_sm_alg_dbg_priv_key[32] = {
1363     0x3f, 0x49, 0xf6, 0xd4, 0xa3, 0xc5, 0x5f, 0x38, 0x74, 0xc9, 0xb3, 0xe3,
1364     0xd2, 0x10, 0x3f, 0x50, 0x4a, 0xff, 0x60, 0x7b, 0xeb, 0x40, 0xb7, 0x99,
1365     0x58, 0x99, 0xb8, 0xa6, 0xcd, 0x3c, 0x1a, 0xbd
1366 };
1367 
ble_sm_alg_gen_dhkey(const uint8_t * peer_pub_key_x,const uint8_t * peer_pub_key_y,const uint8_t * our_priv_key,uint8_t * out_dhkey)1368 int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x, const uint8_t *peer_pub_key_y,
1369                          const uint8_t *our_priv_key, uint8_t *out_dhkey)
1370 {
1371     uint8_t dh[32];
1372     uint8_t pk[64];
1373     uint8_t priv[32];
1374     int rc = BLE_SM_KEY_ERR;
1375 
1376     swap_buf(pk, peer_pub_key_x, 32);
1377     swap_buf(&pk[32], peer_pub_key_y, 32);
1378     swap_buf(priv, our_priv_key, 32);
1379 
1380 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1381     struct mbedtls_ecp_point pt = {0}, Q = {0};
1382     mbedtls_mpi z = {0}, d = {0};
1383     mbedtls_ctr_drbg_context ctr_drbg = {0};
1384     mbedtls_entropy_context entropy = {0};
1385 
1386     uint8_t pub[65] = {0};
1387     /* Hardcoded first byte of pub key for MBEDTLS_ECP_PF_UNCOMPRESSED */
1388     pub[0] = 0x04;
1389     memcpy(&pub[1], pk, 64);
1390 
1391     /* Initialize the required structures here */
1392     mbedtls_ecp_point_init(&pt);
1393     mbedtls_ecp_point_init(&Q);
1394     mbedtls_ctr_drbg_init(&ctr_drbg);
1395     mbedtls_entropy_init(&entropy);
1396     mbedtls_mpi_init(&d);
1397     mbedtls_mpi_init(&z);
1398 
1399     /* Below 3 steps are to validate public key on curve secp256r1 */
1400     if (mbedtls_ecp_group_load(&keypair.MBEDTLS_PRIVATE(grp), MBEDTLS_ECP_DP_SECP256R1) != 0) {
1401         goto exit;
1402     }
1403 
1404     if (mbedtls_ecp_point_read_binary(&keypair.MBEDTLS_PRIVATE(grp), &pt, pub, 65) != 0) {
1405         goto exit;
1406     }
1407 
1408     if (mbedtls_ecp_check_pubkey(&keypair.MBEDTLS_PRIVATE(grp), &pt) != 0) {
1409         goto exit;
1410     }
1411 
1412     /* Set PRNG */
1413     if ((rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0)) != 0) {
1414         goto exit;
1415     }
1416 
1417     /* Prepare point Q from pub key */
1418     if (mbedtls_ecp_point_read_binary(&keypair.MBEDTLS_PRIVATE(grp), &Q, pub, 65) != 0) {
1419         goto exit;
1420     }
1421 
1422     if (mbedtls_mpi_read_binary(&d, priv, 32) != 0) {
1423         goto exit;
1424     }
1425 
1426     rc = mbedtls_ecdh_compute_shared(&keypair.MBEDTLS_PRIVATE(grp), &z, &Q, &d,
1427                                      mbedtls_ctr_drbg_random, &ctr_drbg);
1428     if (rc != 0) {
1429         goto exit;
1430     }
1431 
1432     rc = mbedtls_mpi_write_binary(&z, dh, 32);
1433     if (rc != 0) {
1434         goto exit;
1435     }
1436 
1437 exit:
1438     mbedtls_ecp_point_free(&pt);
1439     mbedtls_mpi_free(&z);
1440     mbedtls_mpi_free(&d);
1441     mbedtls_ecp_point_free(&Q);
1442     mbedtls_entropy_free(&entropy);
1443     mbedtls_ctr_drbg_free(&ctr_drbg);
1444     if (rc != 0) {
1445         return BLE_SM_KEY_ERR;
1446     }
1447 
1448 #else
1449     if (uECC_valid_public_key(pk, &curve_secp256r1) < 0) {
1450         return BLE_SM_KEY_ERR;
1451     }
1452 
1453     rc = uECC_shared_secret(pk, priv, dh, &curve_secp256r1);
1454     if (rc == TC_CRYPTO_FAIL) {
1455         return BLE_SM_KEY_ERR;
1456     }
1457 #endif // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1458 
1459     swap_buf(out_dhkey, dh, 32);
1460     return 0;
1461 }
1462 
1463 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
mbedtls_gen_keypair(uint8_t * public_key,uint8_t * private_key)1464 static int mbedtls_gen_keypair(uint8_t *public_key, uint8_t *private_key)
1465 {
1466     int rc = BLE_SM_KEY_ERR;
1467     mbedtls_entropy_context entropy = {0};
1468     mbedtls_ctr_drbg_context ctr_drbg = {0};
1469 
1470     mbedtls_entropy_init(&entropy);
1471     mbedtls_ctr_drbg_init(&ctr_drbg);
1472     mbedtls_ecp_keypair_init(&keypair);
1473 
1474     if ((rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
1475                                     NULL, 0)) != 0) {
1476         goto exit;
1477     }
1478 
1479     if ((rc = mbedtls_ecp_gen_key(MBEDTLS_ECP_DP_SECP256R1, &keypair,
1480                                   mbedtls_ctr_drbg_random, &ctr_drbg)) != 0) {
1481         goto exit;
1482     }
1483 
1484     if ((rc = mbedtls_mpi_write_binary(&keypair.MBEDTLS_PRIVATE(d), private_key, 32)) != 0) {
1485         goto exit;
1486     }
1487 
1488     size_t olen = 0;
1489     uint8_t pub[65] = {0};
1490 
1491     if ((rc = mbedtls_ecp_point_write_binary(&keypair.MBEDTLS_PRIVATE(grp), &keypair.MBEDTLS_PRIVATE(Q), MBEDTLS_ECP_PF_UNCOMPRESSED,
1492               &olen, pub, 65)) != 0) {
1493         goto exit;
1494     }
1495 
1496     memcpy(public_key, &pub[1], 64);
1497 
1498 exit:
1499     mbedtls_ctr_drbg_free(&ctr_drbg);
1500     mbedtls_entropy_free(&entropy);
1501     if (rc != 0) {
1502         mbedtls_ecp_keypair_free(&keypair);
1503         return BLE_SM_KEY_ERR;
1504     }
1505 
1506     return 0;
1507 }
1508 #endif  // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1509 
1510 /**
1511  * pub: 64 bytes
1512  * priv: 32 bytes
1513  */
ble_sm_alg_gen_key_pair(uint8_t * pub,uint8_t * priv)1514 int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv)
1515 {
1516 #if CONFIG_BT_LE_SM_SC_DEBUG_KEYS
1517     swap_buf(pub, ble_sm_alg_dbg_pub_key, 32);
1518     swap_buf(&pub[32], &ble_sm_alg_dbg_pub_key[32], 32);
1519     swap_buf(priv, ble_sm_alg_dbg_priv_key, 32);
1520 #else
1521     uint8_t pk[64];
1522 
1523     do {
1524 #if CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1525         if (mbedtls_gen_keypair(pk, priv) != 0) {
1526             return BLE_SM_KEY_ERR;
1527         }
1528 #else
1529         if (uECC_make_key(pk, priv, &curve_secp256r1) != TC_CRYPTO_SUCCESS) {
1530             return BLE_SM_KEY_ERR;
1531         }
1532 #endif  // CONFIG_BT_LE_CRYPTO_STACK_MBEDTLS
1533         /* Make sure generated key isn't debug key. */
1534     } while (memcmp(priv, ble_sm_alg_dbg_priv_key, 32) == 0);
1535 
1536     swap_buf(pub, pk, 32);
1537     swap_buf(&pub[32], &pk[32], 32);
1538     swap_in_place(priv, 32);
1539 #endif // CONFIG_BT_LE_SM_SC_DEBUG_KEYS
1540     return 0;
1541 }
1542 
1543 #endif // CONFIG_BT_LE_SM_LEGACY || CONFIG_BT_LE_SM_SC
1544 #endif // (!CONFIG_BT_NIMBLE_ENABLED) && (CONFIG_BT_CONTROLLER_ENABLED)
1545