diff --git a/compile_all.py b/compile_all.py index a9ca585..8f256ba 100755 --- a/compile_all.py +++ b/compile_all.py @@ -8,7 +8,7 @@ import random import subprocess -def build(algo_dir, template_dir="templates/linux"): +def build(algo_dir, template_dir): # create a new directory for the build build_dir = None while build_dir is None: @@ -131,8 +131,8 @@ def main(argv): - # For testing, we only do the first - files = files[:1] + # For testing, we only do the first 5 + files = files[:5] # Clear the build directory as it is a leftover from the previous execution if os.path.isdir('build'): @@ -148,11 +148,15 @@ def main(argv): for t, d in files: print() print(d) - b = build(d) + b = build(d, template_dir) test_script.write("./test.py %s %s\n" % (t, os.path.join(b, 'test'))) st = os.stat(test_script_path) os.chmod(test_script_path, st.st_mode | stat.S_IEXEC) + print() + print() + print("Now execute ' %s ' to start the test" % test_script_path) + if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/templates/blackpill/Src/main.c b/templates/blackpill/Src/main.c index 656e05a..ba2758d 100644 --- a/templates/blackpill/Src/main.c +++ b/templates/blackpill/Src/main.c @@ -44,32 +44,21 @@ #include "crypto_aead.h" #include "api.h" -#ifndef KEY_LENGTH -#define KEY_LENGTH 16 -#endif +#define MAX_LEN 1400 -#ifndef NSEC_LENGTH -#define NSEC_LENGTH 0 -#endif - -#ifndef NPUB_LENGTH -#define NPUB_LENGTH 0 -#endif - -unsigned char c[1400]; +unsigned char c[MAX_LEN]; unsigned long long clen = 0; -unsigned char m[1400]; +unsigned char m[MAX_LEN]; unsigned long long mlen = 0; -unsigned char ad[1400]; +unsigned char ad[MAX_LEN]; unsigned long long adlen = 0; -unsigned char nsec[512]; -unsigned long long nslen = NSEC_LENGTH; -unsigned char npub[512]; -unsigned long long nplen = NPUB_LENGTH; -unsigned char k[512]; -unsigned long long klen = KEY_LENGTH; -unsigned char rcv; +unsigned char nsec[CRYPTO_NSECBYTES]; +const unsigned long long nslen = CRYPTO_NSECBYTES; +unsigned char npub[CRYPTO_NPUBBYTES]; +const unsigned long long nplen = CRYPTO_NPUBBYTES; +unsigned char k[CRYPTO_KEYBYTES]; +const unsigned long long klen = CRYPTO_KEYBYTES; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); @@ -78,296 +67,325 @@ static void MX_USART1_UART_Init(void); static void read_variable_serial(unsigned char action); static void write_variable_serial(unsigned char target[], unsigned long long len); -static void read_variable_serial(unsigned char action){ - - uint32_t len; - for (int i = 3; i >= 0; i--) { - while (LL_USART_IsActiveFlag_RXNE(USART1)); - rcv = LL_USART_ReceiveData8(USART1); - len |= (uint32_t) rcv << i*8; - } - - for (int i = 0; i < len; i++) { - while (LL_USART_IsActiveFlag_RXNE(USART1)); - rcv = LL_USART_ReceiveData8(USART1); - // Implement all cases or use another concept at all - switch(action) { - case 'k': - k[i] = rcv; - break; - default: - return -1: - } - - } +static void read_serial(void *dst, unsigned int len) { + unsigned char *buf = dst; + for (int i = 0; i < len; i++) { + while (LL_USART_IsActiveFlag_RXNE(USART1)); + buf[i] = LL_USART_ReceiveData8(USART1); + } +} + +static void write_serial(const void *src, unsigned int len) { + const unsigned char *buf = src; + for (int i = 0; i < len; i++) { + while (!LL_USART_IsActiveFlag_TXE(USART1)); + LL_USART_TransmitData8(USART1, buf[i]); + } +} + +static void read_variable_serial(unsigned char action) { + uint32_t len; + read_serial(&len, sizeof(len)); + + switch(action) { + case 'k': + while (len != CRYPTO_KEYBYTES); + read_serial(k, len); + break; + case 'p': + while (len != CRYPTO_NPUBBYTES); + read_serial(k, len); + break; + case 's': + while (len != CRYPTO_NSECBYTES); + read_serial(k, len); + break; + case 'a': + while (len > MAX_LEN); + adlen = len; + read_serial(ad, len); + break; + case 'm': + while (len > MAX_LEN); + mlen = len; + read_serial(m, len); + break; + case 'c': + while (len > MAX_LEN); + clen = len; + read_serial(c, len); + break; + default: + for (;;); + } +} + +static void write_variable_serial(unsigned char target[], unsigned long long len) { + write_serial(&len, sizeof(len)); + write_serial(target, len); +} + + +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + + + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO); + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); + + NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* System interrupt init*/ + + /**NOJTAG: JTAG-DP Disabled and SW-DP Enabled + */ + LL_GPIO_AF_Remap_SWJ_NOJTAG(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + unsigned char rcv; + int res; + + while (1) { + read_serial(&rcv, sizeof(rcv)); + switch (rcv) { + case 'c': + case 'm': + case 'a': + case 'k': + case 's': + case 'p': + read_variable_serial(rcv); + break; + + case 'C': write_variable_serial(c, clen); break; + case 'M': write_variable_serial(m, mlen); break; + case 'A': write_variable_serial(ad, adlen); break; + case 'K': write_variable_serial(k, klen); break; + case 'S': write_variable_serial(nsec, nslen); break; + case 'P': write_variable_serial(npub, nplen); break; + + case 'd': + res = crypto_aead_decrypt(m, &mlen, nsec, c, clen, ad, adlen, npub, k); + break; + + case 'e': + res = crypto_aead_encrypt(c, &clen, m, mlen, ad, adlen, nsec, npub, k); + break; + + default: + return 2; + } + /* USER CODE END WHILE */ + } +} - static void write_variable_serial(unsigned char target[], unsigned long long len) { - - unsigned char trm; - for (int i = 3; i >= 0; i--) { - trm = (uint8_t) len >> i*8; - while (!LL_USART_IsActiveFlag_TXE(USART1)); - LL_USART_TransmitData8(USART1, trm); - } - - for (int i = 0; i < len; i++) { - while (!LL_USART_IsActiveFlag_TXE(USART1)); - LL_USART_TransmitData8(USART1, target[i]); - } +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); + + if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1) + { + Error_Handler(); + } + LL_RCC_HSI_SetCalibTrimming(16); + LL_RCC_HSI_Enable(); + + /* Wait till HSI is ready */ + while(LL_RCC_HSI_IsReady() != 1) + { + + } + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_12); + LL_RCC_PLL_Enable(); + + /* Wait till PLL is ready */ + while(LL_RCC_PLL_IsReady() != 1) + { + + } + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + + /* Wait till System clock is ready */ + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + + } + LL_Init1msTick(48000000); + LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); + LL_SetSystemCoreClock(48000000); +} - } +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + /* USER CODE BEGIN USART1_Init 0 */ - int main(void) - { - /* USER CODE BEGIN 1 */ + /* USER CODE END USART1_Init 0 */ - /* USER CODE END 1 */ + LL_USART_InitTypeDef USART_InitStruct = {0}; - /* MCU Configuration--------------------------------------------------------*/ + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + /* Peripheral clock enable */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_9; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO); - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); - - NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* System interrupt init*/ - - /**NOJTAG: JTAG-DP Disabled and SW-DP Enabled - */ - LL_GPIO_AF_Remap_SWJ_NOJTAG(); + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN USART1_Init 1 */ - /* USER CODE END Init */ + /* USER CODE END USART1_Init 1 */ + USART_InitStruct.BaudRate = 115200; + USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; + USART_InitStruct.StopBits = LL_USART_STOPBITS_1; + USART_InitStruct.Parity = LL_USART_PARITY_NONE; + USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; + USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; + LL_USART_Init(USART1, &USART_InitStruct); + LL_USART_ConfigAsyncMode(USART1); + LL_USART_Enable(USART1); + /* USER CODE BEGIN USART1_Init 2 */ - /* Configure the system clock */ - SystemClock_Config(); + /* USER CODE END USART1_Init 2 */ - /* USER CODE BEGIN SysInit */ +} - /* USER CODE END SysInit */ +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); + + /**/ + LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3 + |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7 + |LL_GPIO_PIN_8|LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10 + |LL_GPIO_PIN_11|LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15 + |LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6 + |LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_12; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + LL_GPIO_AF_EnableRemap_PD01(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_USART1_UART_Init(); - /* USER CODE BEGIN 2 */ +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - - while (1) { - /* USER CODE END WHILE */ - while (LL_USART_IsActiveFlag_RXNE(USART1)); - rcv = LL_USART_ReceiveData8(USART1); - switch (rcv) { - case 'c': - case 'm': - case 'a': - case 'k': - case 's': - case 'p': read_variable(rcv); break; - case 'C': write_variable(c, clen); break; - case 'M': write_variable(m, mlen); break; - case 'A': write_variable(ad, adlen); break; - case 'K': write_variable(k, klen); break; - case 'S': write_variable(nsec, nslen); break; - case 'P': write_variable(npub, nplen); break; - - - case 'e': - res = crypto_aead_encrypt(c, &clen, m, mlen, ad, adlen, nsec, npub, k); - break; - default: - return 2; - } - - /** - * @brief System Clock Configuration - * @retval None - */ - void SystemClock_Config(void) - { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); - - if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1) - { - Error_Handler(); - } - LL_RCC_HSI_SetCalibTrimming(16); - LL_RCC_HSI_Enable(); - - /* Wait till HSI is ready */ - while(LL_RCC_HSI_IsReady() != 1) - { - - } - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_12); - LL_RCC_PLL_Enable(); - - /* Wait till PLL is ready */ - while(LL_RCC_PLL_IsReady() != 1) - { - - } - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) - { - - } - LL_Init1msTick(48000000); - LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); - LL_SetSystemCoreClock(48000000); - } - - /** - * @brief USART1 Initialization Function - * @param None - * @retval None - */ - static void MX_USART1_UART_Init(void) - { - - /* USER CODE BEGIN USART1_Init 0 */ - - /* USER CODE END USART1_Init 0 */ - - LL_USART_InitTypeDef USART_InitStruct = {0}; - - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* Peripheral clock enable */ - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); - - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); - /**USART1 GPIO Configuration - PA9 ------> USART1_TX - PA10 ------> USART1_RX - */ - GPIO_InitStruct.Pin = LL_GPIO_PIN_9; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = LL_GPIO_PIN_10; - GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN USART1_Init 1 */ - - /* USER CODE END USART1_Init 1 */ - USART_InitStruct.BaudRate = 115200; - USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; - USART_InitStruct.StopBits = LL_USART_STOPBITS_1; - USART_InitStruct.Parity = LL_USART_PARITY_NONE; - USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; - USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; - LL_USART_Init(USART1, &USART_InitStruct); - LL_USART_ConfigAsyncMode(USART1); - LL_USART_Enable(USART1); - /* USER CODE BEGIN USART1_Init 2 */ - - /* USER CODE END USART1_Init 2 */ - - } - - /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ - static void MX_GPIO_Init(void) - { - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); - LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); - - /**/ - LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3 - |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7 - |LL_GPIO_PIN_8|LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10 - |LL_GPIO_PIN_11|LL_GPIO_PIN_13|LL_GPIO_PIN_14|LL_GPIO_PIN_15 - |LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6 - |LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_12; - GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /**/ - LL_GPIO_AF_EnableRemap_PD01(); - - } - - /* USER CODE BEGIN 4 */ - - /* USER CODE END 4 */ - - /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ - void Error_Handler(void) - { - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - - /* USER CODE END Error_Handler_Debug */ - } + /* USER CODE END Error_Handler_Debug */ +} #ifdef USE_FULL_ASSERT - /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ - void assert_failed(uint8_t *file, uint32_t line) - { - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ - } + /* USER CODE END 6 */ +} #endif /* USE_FULL_ASSERT */ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/