Introduction【介绍】
很高兴拿到了“笙泉”公司提供的CortexM0的开发板,在拿到板子之前已经大致读过公司提供的参考资料。看了一些样例代码。从资料和样例代码里面,我已经嗅到了浓浓的湾湾半导体风味。由于自己工作的原因,之前开发过很多个MTK相关的平台,代码风格和芯片开发板等和欧美风有相当大的区别。怎么说呢,台湾半导体的代码风格的命名规则往往是驼峰和下划线共用,以自己的芯片型号打头的文件名往往让人觉得比较乱,模块也划分的不是很清楚,就是一种看代码的感觉,欧美风可能是由于母语的原因,命名让人看上去比较舒服,模块划分的错落有致,有一种看文章的感觉。半导体的设计也秉承了这种风格,湾湾的风格一切以实用为主,把功能做好了,能用了就行,而欧美的会有一种长远的打算,一些模块的设计往往都有较强的可拓展性,让人觉得特别以后还会更美好。扯远了,下面先爆个照,板子的风格,便宜,简单,实用,该有的都有。公司提供了基于KEIL的开发环境,相当友好,这里需要注意下,Keil必须要升级到5.28版本以上,不然相关的BSP包是安装不上的。
公司提供的仿真器和板子支持ICP,ISP和IAP的代码下载工作方式,使用非常的方便。
不清楚这三种方式,我这里简单说下,具体可以去问bing;一句话说呢,这三种方式都是为了把你的代码下载到内置的FLASH上去,他们的目的就是为了操作NOR FLASH。
ICP是透过板子的SWD接口使用仿真器下载程序到FLASH。
ISP是透过板子自带的ROM代码使用串口或者USB下载程序到FLASH
IAP是透过用户自己的应用程序来管理下载的程序,比方说我把FLASH分为两块A和B 区域,当前跑在A,数据更新在B,更新完成后,我把下次跳转的入口设置为B,就会使用B这边的代码来运行了,很简单吧。
公司提供的仿真器需要更新下Firmware,提供的开发包里面都有相应的工具,非常方便。当我把KEIL相关的包安装好,使用仿真器连上了我的KEIL,打开第一个样例程序的时候,大概花了半个小时。很方便。
OK,环境貌似已经搞好了,哦,忘了要给板子焊接上一个串口,这样才能输出调试信息嘛,LOG是非常重要的调试手段,对于一个RAW BOARD来说,没有串口就没有一切。飞快的看了下代码和DATASHEET,发现串口脚是PB6/PB7,飞快的焊接上座子。一切准备就绪。
CRC Evaluation【CRC的验证工作】
在开始具体的工作之前,我必须要把CRC简单介绍以下,特别要注意的是和SHA和MD5的区别,下面是引用的文章:
CRC32、MD5和SHA1是目前用来校验文件信息真实性的主要手段,使用这些校验算法可以发现保存或传输的信息是否受到损坏或篡改,防止文件或信息被恶意篡改。下面将分别介绍这几种校验算法。
1、CRC32
CRC全称为Cyclic Redundancy Check,又叫循环冗余校验。CRC是目前使用中最老的一种校验算法,它是由W. Wesley Peterson在1961年发表的论文中提出,CRC是种根据网络数据封包或电脑档案等数据产生简短固定位数校验码的一种散列函數(HASH,把任意长度的输入通过散列算法,最终变换成固定长度的摘要输出,其结果就是散列值,按照HASH算法,HASH具有单向性,不可逆性),主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。
尽管CRC在错误检测中非常有用,但CRC并不能可靠地校验数据完整性,这是因为CRC多项式是线性结构,可以非常容易地通过改变数据方式达到CRC碰撞,这里给一个更加通俗的解释,假设一串带有CRC校验的代码在传输中,如果连续出现差错,当出错次数达到一定次数时,那么几乎可以肯定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增加,碰撞几率会显著降低,比如CRC32比CRC16具有更可靠的验证性,CRC64又会比CRC32更可靠,当然这都是按照ITU规范标准条件下。
正因为CRC具有以上特点,对于网络上传输的文件类很少只使用CRC作为校验依据,文件传输相比通信底层传输风险更大,很容易受到人为干预影响。
2、MD5
MD5全称为Message-Digest Algorithm 5,又叫摘要算法和哈希算法。是Ronald L. Rivest在1992年间提出的,MD5由MD4、MD3、MD2改进而来,MD5散列长度通常是128位,是目前被大量广泛使用的散列算法之一,主要用于密码加密和文件校验等,虽然MD5比CRC的安全可靠性要高的多,但目前已经找到可行的破解方法。现在网上虽然出现有些破解网站和软件,不过可以肯定实际作用范围相当有限,比如,即使黑客拿到了PASSWORD MD5值,除了暴力破解,即使找到碰撞结果也未必能够影响用户安全问题,因为对于密码还要限定位数、类型等,但是如果是面向数字签名等应用,可能就会被破解掉。
3、SHA1
SHA全称为Secure Hash Algorithm,又叫安全散列算法。SHA是由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,SHA家族算法有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512(后四者通常并称SHA2),原理和MD4、MD5相似。SHA可将一个最大2^64位(2305843009213693952字节)信息,转换成一串160位(20字节)的散列值(摘要信息),是目前应用最广的HASH算法。同MD5一样,从理论角度,SHA1也不是绝对可靠,目前也已经找到SHA1的碰撞条件,但“实用”的碰撞算法软件还没出现。于是美国NIST又开始使用SHA2,研究更新的加密算法。
补充:虽然目前这几种校验算法都找到了破解条件,但像目前主流使用的MD5、SHA1还是值得信赖的,因为MD5和SHA1都具有高度的离散性,哪怕是只修改一个字节值都会导致MD5或SHA1值“巨大”变化,从实践角度,不同信息具有相同MD5或SHA1码的可能性非常低,通常认为是不可能的,对于普通的下载文件或操作系统,想通过简单的修改某个字节或某些字节,又要保证文件名、大小和安装可靠性的前提下,想达到MD5、SHA1碰撞效果也几乎是不可能的。
相同点:
CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。
不同点:
1. 算法不同。CRC采用多项式除法,MD5和SHA1使用的是替换、轮转等方法;
2. 校验值的长度不同。CRC校验位的长度跟其多项式有关系,一般为16位或32位;MD5是16个字节(128位);SHA1是20个字节(160位);
3. 校验值的称呼不同。CRC一般叫做CRC值;MD5和SHA1一般叫做哈希值(Hash)或散列值;
4. 安全性不同。这里的安全性是指检错的能力,即数据的错误能通过校验位检测出来。CRC的安全性跟多项式有很大关系,相对于MD5和SHA1要弱很多;MD5的安全性很高,不过大概在04年的时候被山东大学的王小云破解了;SHA1的安全性最高。
5. 效率不同,CRC的计算效率很高;MD5和SHA1比较慢。
6. 用途不同。CRC一般用作通信数据的校验(毕竟效率高适用于通信数据校验);MD5和SHA1用于安全(Security)领域,比如文件校验、数字签名等。
笔者曾经做过一个小项目,需要在某些设备出厂之前Burn一些KEY到OTP里面去,为了能在工厂进行安全生产,我们选用的某几个固定的SD卡,用上面固化的SN号码加上一些自定义的字串生成了一组CRC校验码,只有这些固定的SD卡插入后,加上这些卡上对应的文件字串,计算CRC32后和预置的CRC32进行比对,如果确认一致才可以把SD卡存放的KEY BLOW到OTP里面去。当然这个安全级别是非常低的,那是很多年以前的事情了,和现在的Secure BOOT, RSA和SHA512来比就差远啦。不过这款芯片集成了一个硬件的GPL逻辑,类似于一个非常简单的FPGA,能做硬件层面的CRC32计算还是挺有意思的。其实不光能做CRC计算,还能进行位反转和字节序转换等骚操作,也许能在一些特殊场景下派上用场。
我的计划是先用软件的方式来计算CRC32,然后和DMA的计算的效率进行比较,看看这个芯片带来了多大的性能提升。网上有现成的CRC32的实现方式,稍加改动就变成了我自己的。感谢“Michael Barr”先前的高光工作。
代码的逻辑如下图:
编译起来,很快修改了一些语法错误,跑起来啦!
32个字节的字串还看不出差别,这个需要大数据才行,我把数据长度扩展到了1KB
1KB的数据大概快了15ms,平均每个字符大概快15uS,对于一个48Mhz的M0CPU来说还算可以,如果是一个IOT设备经常和Server通信需要校验的话,还是可以省去不小的算力。
花了大半天时间做了这个DEMO,码了这么多字,希望大家喜欢。