之前和AVRCrypto的作者聊过,在AVR/ARM7的基础上,他认为RSA512以上计算时间就已经非常长了。所以我脑子里总是得到了MCU无法支持TLS的结论。ARM mbed收购PolarTLS之后,将其开源并更名为mbed TLS,成为mbed OS的一部分。我曾经尝试在最标准的STM32F103RB上实现,但是无法运行。
今天我利用ARM mbed online compiler和NUCLEO-F401RE重新做了一次快速测试。记过让人惊喜:F401RE居然可以在2秒钟内完成RSA2048位的计算,这已经符合主流的TLS证书要求。也可以用于Android USB设备认证,虽然现在AOA设备早就被人所遗忘。
图1:Tera-Term中F401RE所打印的各种密码算法性能对比
可以看到RSA-2048所需时间为52ms/1968ms,比我预算的几分钟要快许多,处于可接受的范围。如果使用ECC的ECDSA,最短也只需要403ms。非常实用。
但是有两点:
- 为何STM32F103RB无法运行基础的SHA-256算法而直接崩溃?
- F401RE运行后为何会抛出一个Stack underflow的错误?
F103RB基于M3内核,最高主频72MHz,F401RE基于M4内核,支持DSP/FPU,最高主频84MHz。如果mbed-TLS没有利用DSP和FPU,仅这些主频差别意味着F103RB其实也是可以支持TLS/RSA2048的认证的。
再次编译F103RB,系统终端提示RSA2048 malloc出错,意味着20KB RAM是主要的瓶颈,而且即使关闭RSA项目,ECDSA同样也没有任何输出。而对比F103RB/F401RE两者性能,大约是1:1.67左右,且与算法有关联。所以下次需要在STM32F103RE(64KB RAM)上测试一下。