现在来扯扯淡:
很早以前抢沙发抢了菜农大叔的一块助学板,拿来也没怎么玩过,俺先前拼凑了一个加密的Bootloader出来,正好大叔也喜欢搞密码的东西,就在助学板上面折腾了下。
为啥是拼凑,各位看官往下看
新塘M0有一个好玩的应用,那就是AN1024,用USB Mass Storage实现的ISP。本以为这没有什么,因为俺在STM32上就玩过。
《5分钟用STM32的内置Flash做一个超小U盘》
我晕,EDNChina坑爹啊,以前发的**排版都不成样子了,难道是firefox的问题
这是ednchina的原文链接
http://bbs.**/BLOG_ARTICLE_280560.HTM
算了,还是看盗版的吧。还好盗版链接的排版没变,太坑爹了,看个自己发的**都要看盗版的。
http://www.**.com/bbs/article_244_97168.html
扯远了,言归正传,继续来看新塘的Mass Storage ISP
下载编译后一看,俺不淡定了,这玩意儿居然是塞在LDROM中的,也就是整个做下来不到4K。
我X,这是什么样的代码啊。还好这是开源的。
我看了看,很显然,他没有用BSP中的USB Framework,而直接处理的USB中断。哦,说错了,在LDROM中是没有中断的,需要不停地去查询USB相关寄存器的标志。
而且所有descriptor都限制在了64bytes以内,这样简化了UsbStdReq的代码和逻辑。
既然Mass Storage都能放进4K的空间中,那HID协议更能放得下了,然后我就尝试将他的Mass Storage ISP转换成HID ISP。
HID设备也是不需要驱动程序的,不过需要一个应用程序。
HID ISP做成之后用了还不到3K的空间,还有1K多空余的,心想这不浪费了么。
于是琢磨着加点料在里面,和ISP相关的那就是加密了,加密算法网上也有现成的,而且也是用来做bootloader的,那就是Atmel的AVR231,AES Bootloader。
AVR231说他的ROM空间占用不到2K,“AES Bootloader fits into 2-KB”。
心想我只是做个ISP,加密在PC上做,芯片里面只要解密就行了。
AES是个对称算法,我不用加密的只用解密,那就应该"fits into 1-KB"。下代码,稍微改了下,编译,我了个去,果然是4K不到。
当然光下载还是不行,还得校验一下下载的程序是否正确,我用CRC做校验,正好菜农大叔也喜欢CRC。
32位机当然用crc32。多项式和顺序就用STM32的那个。(因为之前做过STM32的Bootloader,STM32的CRC代码是现成的,又被我借来用了)
/*0001*/ unsigned long CalcCrc32(const unsigned char* data, unsigned long size)
/*0002*/ {
/*0003*/ unsigned long crc = CRC32_MASK;
/*0004*/ while(size--){
/*0005*/ crc = (crc << 8) ^ Crc32Table[ ((crc >> (32-8)) & 0xFF) ^ *data++];
/*0006*/ }
/*0007*/ crc ^= CRC32_MASK;
/*0008*/ return crc;
/*0009*/ }
好了就这样吧,不过还有问题,这密钥不能全都一样吧,于是乎,我把LDROM的最后一个page用来存一些参数,其实只用了几十个bytes。里面包括序列号和密钥的信息。
NUC120的一页是512字节,所以我的这个bootloader占用的空间要控制在 4096-512=3584 bytes。还好,折腾一番之后代码刚好能塞进去。
就这样
修改了新塘AN1024的Mass Storage ISP,加入了Atmel AVR231的AES加密算法,再用STM32的CRC32做校验。
于是乎,一个只有3.5K的AES HID Bootloader就这样拼凑出来了。
该Bootloader的最大特点就是VID和PID都是0x250。菜农要不再去化点缘,把这个VID买下来吧。
#define VENDOR_ID 0x0250
#define PRODUCT_ID 0x0250
当然,它的默认密钥也全是250
unsigned char kTable[32]
#ifdef STM32
;
#else
={
0x02, 0x50, 0x02, 0x50, 0x02, 0x50, 0x02, 0x50,
0x02, 0x50, 0x02, 0x50, 0x02, 0x50, 0x02, 0x50,
0x02, 0x50, 0x02, 0x50, 0x02, 0x50, 0x02, 0x50,
0x02, 0x50, 0x02, 0x50, 0x02, 0x50, 0x02, 0x50,
};
#endif |