diff --git a/ide/STM32CUBE/README.md b/ide/STM32CUBE/README.md index 4284a13d..a4f12e75 100644 --- a/ide/STM32CUBE/README.md +++ b/ide/STM32CUBE/README.md @@ -2,13 +2,13 @@ The wolfSSH Cube Pack can be found [here](https://www.wolfssl.com/files/ide/I-CUBE-wolfSSH.pack) -1. The first step is to setup the wolfCrypt library in your ST project following the guide here [https://github.com/wolfSSL/wolfssl/blob/master/IDE/STM32Cube/README.md](https://github.com/wolfSSL/wolfssl/blob/master/IDE/STM32Cube/README.md). To run the wolfSSH unit tests, name the entry function `wolfSSHTest` instead of `wolfCryptDemo`. +1. The first step is to set up the wolfCrypt library in your ST project following the guide here [https://github.com/wolfSSL/wolfssl/blob/master/IDE/STM32Cube/README.md](https://github.com/wolfSSL/wolfssl/blob/master/IDE/STM32Cube/README.md). To run the wolfSSH unit tests, name the entry function `wolfSSHTest` instead of `wolfCryptDemo`. 2. Then install the wolfSSH Cube Pack in the same manner as the wolfSSL pack with CUBEMX. -3. Open the project `.ioc` file and click the `Softare Packs` drop down menu and then `Select Components`. Expand the `wolfSSH` pack and check all the components. +3. Open the project `.ioc` file and click the `Software Packs` drop down menu and then `Select Components`. Expand the `wolfSSH` pack and check all the components. -4. In the `Softare Packs` configuration category of the `.ioc` file, click on the wolfSSH pack and enable the library by checking the box. +4. In the `Software Packs` configuration category of the `.ioc` file, click on the wolfSSH pack and enable the library by checking the box. 5. Since LwIP is a dependency for the Cube Pack, enable LwIP in the `Middleware` configuration category of the project. Also enable the `LWIP_DNS` option in the LwIP configuration settings. diff --git a/ide/STM32CUBE/default_conf.ftl b/ide/STM32CUBE/default_conf.ftl new file mode 100644 index 00000000..524460db --- /dev/null +++ b/ide/STM32CUBE/default_conf.ftl @@ -0,0 +1,159 @@ +[#ftl] +/** + ****************************************************************************** + * File Name : ${name} + * Description : This file provides code for the configuration + * of the ${name} instances. + ****************************************************************************** +[@common.optinclude name=mxTmpFolder+"/license.tmp"/][#--include License text --] + ****************************************************************************** + */ +[#assign s = name] +[#assign toto = s?replace(".","_")] +[#assign toto = toto?replace("/","")] +[#assign toto = toto?replace("-","_")] +[#assign inclusion_protection = toto?upper_case] +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __${inclusion_protection}__ +#define __${inclusion_protection}__ + +#ifdef __cplusplus + extern "C" { +#endif + + +/* Includes ------------------------------------------------------------------*/ +[#if includes??] +[#list includes as include] +#include "${include}" +[/#list] +[/#if] + +[#-- SWIPdatas is a list of SWIPconfigModel --] +[#list SWIPdatas as SWIP] +[#-- Global variables --] +[#if SWIP.variables??] + [#list SWIP.variables as variable] +extern ${variable.value} ${variable.name}; + [/#list] +[/#if] + +[#-- Global variables --] + +[#assign instName = SWIP.ipName] +[#assign fileName = SWIP.fileName] +[#assign version = SWIP.version] + +/** + MiddleWare name : ${instName} + MiddleWare fileName : ${fileName} + MiddleWare version : ${version} +*/ +[#if SWIP.defines??] + [#list SWIP.defines as definition] +/*---------- [#if definition.comments??]${definition.comments}[/#if] -----------*/ +#define ${definition.name} #t#t ${definition.value} +[#if definition.description??]${definition.description} [/#if] + [/#list] +[/#if] + + + +[/#list] + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#define WOLFSSH_STM32_CUBEMX +/* #define WOLFSSL_CMSIS_RTOS */ +/* #define NO_FILESYSTEM */ + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +/* SCP */ +#undef WOLFSSH_SCP +#if defined(WOLFSSH_CONF_SCP) && WOLFSSH_CONF_SCP == 1 + #define WOLFSSH_SCP +#endif + +/* SFTP */ +#undef WOLFSSH_SFTP +#if !defined(NO_FILESYSTEM) && defined(WOLFSSH_CONF_SFTP) && WOLFSSH_CONF_SFTP == 1 + #define WOLFSSH_SFTP +#endif + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#if defined(WOLFSSH_CONF_DEBUG) && WOLFSSH_CONF_DEBUG == 1 + #define DEBUG_WOLFSSH +#endif + + +/* ------------------------------------------------------------------------- */ +/* wolfSSH IO */ +/* ------------------------------------------------------------------------- */ +#define WOLFSSH_LWIP +#define WOLFSSH_USER_IO +#define WOLFSSL_USER_IO + +/* To be defined for the target Socket API */ +#define WSTARTTCP() + +#define WOLFSSH_LOG_PRINTF +#define WOLFSSL_LOG_PRINTF +#define fprintf(err, ... ) printf(__VA_ARGS__) + +#define BENCH_EMBEDDED +#define NO_WRITEV +#define NO_DEV_RANDOM +#define USE_CERT_BUFFERS_2048 +#define WOLFSSL_USER_CURRTIME +#define SIZEOF_LONG_LONG 8 +#define NO_WOLFSSL_DIR +#define WOLFSSL_NO_CURRDIR +#define NO_WOLF_C99 +#define NO_MULTIBYTE_PRINT + + +#if !defined(NO_FILESYSTEM) + #define WOLFSSH_USER_FILESYSTEM +#endif +#define NO_WOLFSSH_DIR + + +#define XVALIDATEDATE(d, f,t) (0) +#define WOLFSSL_USER_CURRTIME /* for benchmark */ + +#define WOLFSSL_GENSEED_FORTEST /* Warning: define your own seed gen */ + +#define TFM_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT +#define WC_RSA_BLINDING + +/* #define NO_DH */ +#define HAVE_AESGCM +#define WOLFSSL_SHA512 +#define HAVE_ECC +#define HAVE_CURVE25519 +#define CURVE25519_SMALL +#define HAVE_ED25519 + +typedef unsigned int size_t; + +/* defines for unit tests */ +#define NO_UNITTEST_MAIN_DRIVER +#define NO_TESTSUITE_MAIN_DRIVER +#define NO_APITEST_MAIN_DRIVER + +#ifdef __cplusplus +} +#endif +#endif /* ${inclusion_protection}_H */ + +/** + * @} + */ + +/*****END OF FILE****/ diff --git a/ide/STM32CUBE/include.am b/ide/STM32CUBE/include.am new file mode 100644 index 00000000..eab01e7d --- /dev/null +++ b/ide/STM32CUBE/include.am @@ -0,0 +1,10 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= ide/STM32CUBE/main.c +EXTRA_DIST+= ide/STM32CUBE/wolfssh_test.c +EXTRA_DIST+= ide/STM32CUBE/wolfssh_test.h +EXTRA_DIST+= ide/STM32CUBE/myFilesystem.h +EXTRA_DIST+= ide/STM32CUBE/README.md +EXTRA_DIST+= ide/STM32CUBE/default_conf.ftl diff --git a/ide/STM32CUBE/main.c b/ide/STM32CUBE/main.c new file mode 100644 index 00000000..76155abd --- /dev/null +++ b/ide/STM32CUBE/main.c @@ -0,0 +1,227 @@ +/* main.c + * + * Copyright (C) 2014-2023 wolfSSL Inc. + * + * This file is part of wolfSSH. + * + * wolfSSH is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * wolfSSH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with wolfSSH. If not, see . + */ + +/* Example for main.c with STM32Cube/wolfssh_test.c */ + +#if 0 /* EXAMPLE main.c */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" +#include "lwip.h" + +RNG_HandleTypeDef hrng; + +UART_HandleTypeDef huart2; + +/* Definitions for defaultTask */ +osThreadId_t defaultTaskHandle; +const osThreadAttr_t defaultTask_attributes = { + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, +}; +/* Definitions for myTask02 */ +osThreadId_t myTask02Handle; +const osThreadAttr_t myTask02_attributes = { + .name = "myTask02", + .stack_size = 3000 * 4, + .priority = (osPriority_t) osPriorityLow, +}; + +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_RNG_Init(void); +static void MX_USART2_UART_Init(void); +void StartDefaultTask(void *argument); +extern void wolfSSHTest(void *argument); + +/* Retargets the C library printf function to the USART. */ +#include +#ifdef __GNUC__ +int __io_putchar(int ch) +#else +int fputc(int ch, FILE *f) +#endif +{ + HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF); + + return ch; +} +#ifdef __GNUC__ +int _write(int file,char *ptr, int len) +{ + int DataIdx; + for (DataIdx= 0; DataIdx< len; DataIdx++) { + __io_putchar(*ptr++); + } + return len; +} +#endif + +int main(void) +{ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + setvbuf(stdin, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stderr, NULL, _IONBF, 0); + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_RNG_Init(); + MX_USART2_UART_Init(); + + /* Init scheduler */ + osKernelInitialize(); + + /* creation of defaultTask */ + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); + + /* creation of myTask02 */ + myTask02Handle = osThreadNew(wolfSSHTest, NULL, &myTask02_attributes); + + /* Start scheduler */ + osKernelStart(); + + /* Infinite loop */ + while (1) {} +} + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 13; + RCC_OscInitStruct.PLL.PLLN = 195; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 5; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) + { + Error_Handler(); + } +} + +static void MX_RNG_Init(void) +{ + + hrng.Instance = RNG; + if (HAL_RNG_Init(&hrng) != HAL_OK) + { + Error_Handler(); + } +} + +static void MX_USART2_UART_Init(void) +{ + + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + +} + +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + + +void StartDefaultTask(void *argument) +{ + /* init code for LWIP */ + MX_LWIP_Init(); + /* Infinite loop */ + for(;;) + { + osDelay(1); + } +} + +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } +} + +void Error_Handler(void) +{ + __disable_irq(); + while (1) {} +} + +#ifdef USE_FULL_ASSERT +void assert_failed(uint8_t *file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ +} +#endif /* USE_FULL_ASSERT */ + + +#endif /* EXAMPLE main.c */ + diff --git a/ide/STM32CUBE/myFilesystem.h b/ide/STM32CUBE/myFilesystem.h new file mode 100644 index 00000000..13d0d813 --- /dev/null +++ b/ide/STM32CUBE/myFilesystem.h @@ -0,0 +1,152 @@ +/* myFilesystem.h + * + * Copyright (C) 2014-2023 wolfSSL Inc. + * + * This file is part of wolfSSH. + * + * wolfSSH is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * wolfSSH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with wolfSSH. If not, see . + */ + + +#ifndef MY_FILESYSTEM_H +#define MY_FILESYSTEM_H + +#ifdef WOLFSSH_USER_FILESYSTEM + + #define WFILE int + + #define WSEEK_END SEEK_END + #define WBADFILE NULL + #define WS_DELIM '/' +enum { + WOLFSSH_O_RDWR, WOLFSSH_O_RDONLY, WOLFSSH_O_WRONLY, + WOLFSSH_O_APPEND, WOLFSSH_O_CREAT, WOLFSSH_O_TRUNC, WOLFSSH_O_EXCL +} ; + +#define WSTAT_T stat_t +typedef struct { int i; } stat_t; + +#define WFD int +enum { O_RDWR, O_RDONLY, O_WRONLY, O_APPEND, O_CREAT, O_TRUNC, O_EXCL } ; + +static int WFOPEN(FILE **f, const char *n, const char *m){ + (void) n; (void) m; (void)f; + return NULL; +} + +static int WFCLOSE(FILE *f) { + (void) f; + return 0; +} + +static size_t WFREAD(void *b, size_t s, size_t n, FILE *f) { + (void) b; (void) s; (void) n; (void) f; + return 0; +} + +static size_t WFWRITE(const void *b, size_t s, size_t n, FILE *f) { + (void) b; (void) s; (void) n; (void) f; + return 0; +} + +static int WFSEEK(FILE *f, long int p, int m) { + (void) f; (void) p; (void) m; + return 0; +} + +static long int WFTELL(FILE *f) { + (void) f; + return 0; +} +static void WREWIND(FILE *f) { + (void) f; +} + +static int WOPEN (const char* n, int f, int m) { + (void) f; (void) n; (void) m; + return 0; +} + +static int WCLOSE(int f) { + (void) f; + return 0; +} + +static size_t WPREAD(int f, void* b, size_t c, off_t *o) { + (void) f; (void) b; (void) c; (void)o; + return 0; +} + +static size_t WPWRITE(int f, void* b, size_t c, off_t *o) { + (void) f; (void) b; (void) c; (void)o; + return 0; +} + +static char *WGETCWD(void *fs, char *f, size_t l){ + (void) fs; (void) f; (void) l; + return 0; +} + +static int WRMDIR(void *fs, const char *p){ + (void) p; + return 0; +} + +static int WMKDIR(void *fs, const char *p, mode_t m) { + (void) p; (void) m; + return 0; +} + +static int WREMOVE(void *fs, const char *p){ + (void) fs; (void) p; + return 0; +} + +static int WRENAME(void *fs, const char *p, const char *np){ + (void) fs; (void) p; (void)np; + return 0; +} + +static int WSTAT(const char *p, stat_t *b) { + (void) p; (void)b; + return 0; +} + +static int WLSTAT(const char *p, stat_t *b) { + (void) p; (void)b; + return 0; +} + +static int WCHMOD(void *fs, const char *p, mode_t m) { + (void) fs; (void) p; (void)m; + return 0; +} + +static int SFTP_GetAttributes(void* fs, const char* fileName, + void* atr, byte link, void* heap) { + (void)fs; (void)fileName; (void)atr; (void)link; (void)heap; + return 0; + +} + +static int SFTP_GetAttributes_Handle(void* ssh, byte* handle, int handleSz, + void* atr) { + (void)ssh; (void)handle; (void)handleSz; + + return 0; +} + +#endif /* WOLFSSH_USER_FILESYSTEM */ + +#endif diff --git a/ide/include.am b/ide/include.am index f0caa18b..b4973a1b 100644 --- a/ide/include.am +++ b/ide/include.am @@ -6,5 +6,6 @@ include ide/winvs/include.am include ide/CSBENCH/include.am include ide/MQX/include.am include ide/IAR-EWARM/include.am +include ide/STM32CUBE/include.am EXTRA_DIST += ide/Renesas diff --git a/wolfssh/port.h b/wolfssh/port.h index f13c1279..f14b3057 100644 --- a/wolfssh/port.h +++ b/wolfssh/port.h @@ -1182,13 +1182,9 @@ extern "C" { #elif defined(WOLFSSH_USER_FILESYSTEM) /* User-defined I/O support */ - #ifdef WOLFSSH_STM32_CUBEMX - #include - #else - #include "myFilesystem.h" - #endif + #include "myFilesystem.h" #else - + #include /* used for rmdir */ #include /* used for mkdir, stat, and lstat */ #include /* used for remove and rename */ diff --git a/wolfssh/test.h b/wolfssh/test.h index c336a6fa..91717e78 100644 --- a/wolfssh/test.h +++ b/wolfssh/test.h @@ -113,23 +113,29 @@ #include /* ignore SIGPIPE */ #endif + #define NUM_SOCKETS 5 +#elif defined(WOLFSSH_LWIP) + #include + #include + #include + #include + #include + #include + #ifndef SO_NOSIGPIPE + #include /* ignore SIGPIPE */ + #endif + #define SOCKET_T int #define NUM_SOCKETS 5 #else /* USE_WINDOWS_API */ #include #include #include - #ifdef WOLFSSH_LWIP - #include - #include - #include - #else - #include - #include - #include - #include - #include - #include - #endif + #include + #include + #include + #include + #include + #include #ifndef SO_NOSIGPIPE #include /* ignore SIGPIPE */ #endif