Foreword
给MCU移植Crypto、SSL、SSH、SFTP等库,真的找不到一个例子,目前看到的库大部分都是商用的。
比如wolfssh、CycloneSSH、libssh2、TinySSH、microSSH、Dropbear,这些库可能linux使用比较多,但是那边安装移植也方便多了,降到MCU一库难求,更别说详细的移植文档了,基本没有
wolfssh
https://www.wolfssl.com/products/wolfssh/
wolfssh移植
wolfssh的库整个集成到了CubeMX中,简单的几个操作就可以把ssh集成进去
系统时钟不要用systick,留给FreeRTOS用
随便加一个input IO作为SD卡的输入检测
再随便加一个串口作为SSH的端口
以太网选择RMII模式,地址改到0x24开头
SD卡改到4线模式
FATFS选择SD卡
打开RNG,SSL需要随机数生成
LWIP开启,Driver_PHY选择LAN8742,后面也是
接着wolfSSL和wolfSSH都需要下载,开启
SSH开启以后,IO选择LWIP,SFTP打开,SCP可以关闭
SSL这里需要支持FreeRTOS
关闭wolfCrypt test,这个编译会带进来很多多语言的内容,keil编译会出错
剩下设置就随便改改,就可以生成代码了,生成以后依然编译不了,还需要修改一些点
首先在wolfSSL.I-CUBE-wolfSSL_conf.h
里需要定义板子,如果不是wolf测试的板子,需要在下面这里定义具体用的是哪种类型的,具体硬件库啊、加密方式啊、库的版本、使用的串口是哪个需要明确一下
//#warning Please define a hardware platform!
/* This means there is not a pre-defined platform for your board/CPU */
/* You need to define a CPU type, HW crypto and debug UART */
/* CPU Type: WOLFSSL_STM32F1, WOLFSSL_STM32F2, WOLFSSL_STM32F4,
WOLFSSL_STM32F7, WOLFSSL_STM32H7, WOLFSSL_STM32L4, WOLFSSL_STM32L5,
WOLFSSL_STM32G0, WOLFSSL_STM32WB and WOLFSSL_STM32U5 */
#define WOLFSSL_STM32H7
/* Debug UART used for printf */
/* The UART interface number varies for each board/CPU */
/* Typically this is the UART attached to the ST-Link USB CDC UART port */
#define HAL_CONSOLE_UART huart1
/* Hardware Crypto - uncomment as available on hardware */
//#define WOLFSSL_STM32_PKA
//#define NO_STM32_RNG
//#undef NO_STM32_HASH
//#undef NO_STM32_CRYPTO
//#define WOLFSSL_GENSEED_FORTEST /* if no HW RNG is available use test seed */
#define STM32_HAL_V2
- H743是没有HASH,也没有CRYPTO的,但是有RNG
移除所有test相关代码,这个部分用gcc编译更容易过一些
..\include\stdio.h(372): error: #2746: argument for attribute "nonnull" is larger than number of parameters
const char * __restrict /*format*/, ...) __attribute__((__nonnull__(1,2)));
这个错暂时解不掉,得用CubeIDE编译才行,Keil这里过不去
CycloneSSH
https://www.oryx-embedded.com/products/CycloneSSH.html
CycloneSSH是oryx-embedded下的一个库,他们包含很多相关组件
https://www.st.com.cn/zh/partner-products-and-services/cyclonessh.html
ST官方也有他们的合作页面,但是CubeMX里不支持生成
虽然Github也开源了,放出来了源码,但是那个源码一个demo都没有,任何文档也没有,接口也没说,只能干看着。
要查看Demo需要下载官方的代码,然后在demo里面有各个公司各个板子的demo工厂,这里以stm32h743i_eval的板子为例,测试了一下SFTP的demo
先修改代码同意协议,否则无法生成
/*
* CycloneTCP Open is licensed under GPL version 2. In particular:
*
* - If you link your program to CycloneTCP Open, the result is a derivative
* work that can only be distributed under the same GPL license terms.
*
* - If additions or changes to CycloneTCP Open are made, the result is a
* derivative work that can only be distributed under the same license terms.
*
* - The GPL license requires that you make the source code available to
* whoever you make the binary available to.
*
* - If you sell or distribute a hardware product that runs CycloneTCP Open,
* the GPL license requires you to provide public and full access to all
* source code on a nondiscriminatory basis.
*
* If you fully understand and accept the terms of the GPL license, then edit
* the os_port_config.h header and add the following directive:
*
* #define GPL_LICENSE_TERMS_ACCEPTED
*/
#ifndef GPL_LICENSE_TERMS_ACCEPTED
#error Before compiling CycloneTCP Open, you must accept the terms of the GPL license
#endif
如果不定义GPL_LICENSE_TERMS_ACCEPTED
会导致这里报错,编译不下去
CycloneSSH的问题在于虽然他用demo可以直接编译,但是他底层调用的是他自己的TCPIP接口,也就是CycloneTCP,而不是Lwip,这就导致如果你要移植,必须还得搞懂TCP这里的接口具体是什么的,怎么往下对接,Lwip的底层你也得熟悉才能完成这个事情
Summary
带了安全的协议真的麻烦
Quote
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=616445