ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
2017-07-16 13:49
1581 查看
ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
Atmel两个官方lib介绍CryptoAuthLib简介
bitbang方式移植CryptoAuthLib
从逻辑和代码上分析CryptoAuthLib的底层驱动调用结构关系
508A 另一个小型libATECC108A-508A Library简介
Atmel两个官方lib介绍
Atmel加密芯片都是以统一规划的命令,利用各类命令字节通过I2C与外界进行交互,以实现其各种安全功能。当然收发这些命令以各类功能实现都有相应的软件Lib作为支撑。开始开发之前,需要大体了解Atmel官方提供的软件库,这里针对Atecc508A有两个官方Lib(C 语言):
1 CryptoAuthLib (大而全的一个库)。官网下载传送门:http://www.atmel.com/zh/cn/tools/CryptoAuthLib.aspx
2、ATECC108A-508A Library :(小而精)目前版本为Atmel-CryptoAuth-ATECC108A-508A_Library-Distributable_1.2.1
一、CryptoAuthLib简介
概述Atmel CryptoAuthentication Library是Atmel 兼容其加密芯片系列一个总的软件库,里面实现了从底层到命令层以及应用层开发使用的所有API,并支持Git使用。
该库还在不断完善,兼容Atmel许多开发板,目前能够support的加密芯片有:
ATECCx08A (ATECC108A, ATECC508A)
ATSHA204A
ATAES132A
目录结构
该软件库的说明文档还是写的比较清楚的,其目录 结构如下:
其中,其中lib/docs不多说,文档挺多可以自己慢慢看。
- lib/basic里面是常用的基本API函数,如basic/atca_basic.c中包括初始化atcab_init()、获取随机数atcab_random()等等,下面会具体讲解其使用。
- lib/atcacert 下面是证书相关的API,包括x509格式的证书创建/获取、解析、重组等。
- lib/hal 就是硬件抽象层了,在移植CryptoAuthLib时 需要利用这些文件移植到自己的平台上使用。
- lib/crypto 就是一些算法的纯软件实现,比如SHA、ECDSA等,一般用于与加密芯片内部计算结果核对,508一个卖点也是算法实现能够比纯软件计算快10倍左右,如果都是用软件实现该算法,不用芯片来提速就没有意义了。
系统整体架构图
Lib中最主要的三种对象类型:
Device (ATCADevice) :设备对象
Command (ATCACommand) :包括加密芯片支持的各种命令
Interface (ATCAIface) : 包括硬件抽象层中,底层驱动操作(收发数据)
三种对象结构联系
二、CryptoAuthLib的移植
: I2C驱动在软件架构中的位置:在lib中,底层通讯相关驱动都在/lib/hal/ 目录下。
如果是使用的Atmel所支持的开发板,就可以直接使用相应的文件如果是其他平台,可以使用bit_bang模式,很方便移植到自己的平台。当然如果其他平台想使用真实I2C硬件控制器,则就需要自己写代码适配了。
由于我使用的STM32板子,为快速移植,通过Bigbang方式与508进行I2C通讯,下面介绍移植过程:
三 、bitbang方式移植CryptoAuthLib
(1)、Hal目录删减官方Lib hal目录文件如上图,因为是使用bitbang,所以保留其中选中的即可,其他为各开发板提供的驱动都可以删除(还要保留个timer.h),将i2C_bitbang_xx.c改成自己平台的名称。
(2) 、atca_hal.h中打开I2C宏开关
#define ATCA_HAL_I2C //#define ATCA_HAL_SWI //#define ATCA_HAL_SPI //#define ATCA_HAL_UART //#define ATCA_HAL_KIT_HID //#define ATCA_HAL_KIT_CDC
这样在IFACE中就会开启I2C接口的相应函数,如下图:
(3) 、将i2c_bitbang_xx.h中有关I2C引脚操作的宏定义替换成自己平台的:
这里我使用的STM32系列,所以替换如下:(头文件和延时函数等替换小细节就不说了)
#define SCL_PIN GPIO_Pin_x #define SDA_PIN GPIO_Pin_x //I2C Hardware pin change #define I2C_ENABLE() I2C_GPIO_Config(SDA_PIN, OUTPUT); I2C_GPIO_Config(SCL_PIN, OUTPUT) #define I2C_DISABLE() I2C_GPIO_Config(SDA_PIN, INPUT); I2C_GPIO_Config(SCL_PIN, INPUT) #define I2C_CLOCK_LOW() GPIO_ResetBits(GPIOB, SCL_PIN) #define I2C_CLOCK_HIGH() GPIO_SetBits(GPIOB, SCL_PIN) #define I2C_DATA_LOW() GPIO_ResetBits(GPIOB, SDA_PIN) #define I2C_DATA_HIGH() GPIO_SetBits(GPIOB, SDA_PIN) #define I2C_DATA_IN() GPIO_ReadInputDataBit(GPIOB, SDA_PIN) //GPIOB->IDR & SDA_PIN #define I2C_SET_OUTPUT() I2C_GPIO_Config(SDA_PIN, OUTPUT) #define I2C_SET_OUTPUT_HIGH() I2C_SET_OUTPUT(); I2C_DATA_HIGH() #define I2C_SET_OUTPUT_LOW() I2C_SET_OUTPUT(); I2C_DATA_LOW() #define I2C_SET_INPUT() I2C_GPIO_Config(SDA_PIN, INPUT)
:
(4) 、将cryptoauthlib库放到自己的工程代码目录,编译调试即可
四、从逻辑和代码分析CryptoAuthLib的底层驱动调用结构关系:
由上图可知:每一个设备都会先初始化一个Interface,然后由ATCAIFace去调用底层Hal的各种函数,而Hal又最终去调用的I2C驱动函数。这种封装将上层应用与底层驱动分离,为系统移植带来很多便利。
基于该模型自上而下开始代码分析:
第一层:在atca_iface.c (libraries\cryptoauthlib\lib目录)中 ,有_atinit()这么一个函数,会在atcab_init初始化设备时调用,函数里实现了hal层通讯函数与API层的绑定:ATCA_STATUS _atinit(ATCAIface caiface, ATCAHAL_t *hal) { // get method mapping to HAL methods for this interface hal_iface_init( caiface->mIfaceCFG, hal ); caiface->atinit = hal->halinit; caiface->atpostinit = hal->halpostinit; caiface->atsend = hal->halsend; caiface->atreceive = hal->halreceive; caiface->atwake = hal->halwake; caiface->atsleep = hal->halsleep; caiface->atidle = hal->halidle; caiface->hal_data = hal->hal_data; return ATCA_SUCCESS; }
第二层:在atca_hal.c (libraries\cryptoauthlib\lib\hal) 中,实现了Hal层与底层通讯驱动函数的绑定,例如在前面我们打开了I2C宏: ATCA_I2C_IFACE,则现在hal层各函数就会与I2C相关函数绑定:
ATCA_STATUS hal_iface_init( ATCAIfaceCfg *cfg, ATCAHAL_t *hal ) { ATCA_STATUS status = ATCA_COMM_FAIL; switch (cfg->iface_type) { case ATCA_I2C_IFACE: #ifdef ATCA_HAL_I2C hal->halinit = &hal_i2c_init; hal->halpostinit = &hal_i2c_post_init; hal->halreceive = &hal_i2c_receive; hal->halsend = &hal_i2c_send; hal->halsleep = &hal_i2c_sleep; hal->halwake = &hal_i2c_wake; hal->halidle = &hal_i2c_idle; hal->halrelease = &hal_i2c_release; hal->hal_data = NULL; status = ATCA_SUCCESS; #endif break; case ATCA_SWI_IFACE: #ifdef ATCA_HAL_SWI...
第三层:进入Hal_i2c_bitbang.c (libraries\cryptoauthlib\lib\hal),执行相应函数,比如上层通过atsend调用到了hal_i2c_send,就会执行该函数:该函数模拟了I2C通讯时序,(既先Start信号拉低SDA,之后发送7位地址位+1位读写,然后发送数据位、最后Stop信号拉高SDA),将一串数据发送到I2C总线。
ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength) { ATCAIfaceCfg *cfg = atgetifacecfg(iface); ATCA_STATUS status = ATCA_TX_TIMEOUT; int bus = cfg->atcai2c.bus; txdata[0] = 0x03; //!< Word Address Value = Command txlength++; //!< count Word Address byte towards txlength //! Set I2C pins i2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl); do { //! Address the device and indicate that bytes are to be written status = hal_i2c_send_slave_address(iface, I2C_WRITE); if (status != ATCA_SUCCESS) break; //! Send the remaining bytes status = i2c_send_bytes(txlength, txdata); } while (0); //! Send STOP regardless of i2c_status i2c_send_stop(); return status; }
第四层:上一层调用的hal_i2c_send调用的i2c_send_bytes等函数,就是在i2c_bitbang_xx.c中的函数,其实也就是替换宏定义的i2c实现对应引脚控制,以发出符合i2c规范的电平信号:例如i2c_bitbang_xx.c中的i2c_send_start,其中的I2C_CLOCK_HIGH()等函数是否眼熟? 就是上面我们替换的I2C宏,功能设置相应SCL引脚为高。
void i2c_send_start(void) { //! Set clock high in case we re-start. I2C_CLOCK_HIGH(); I2C_SET_OUTPUT_HIGH(); I2C_DATA_LOW(); I2C_HOLD_DELAY(); I2C_CLOCK_LOW(); }
至此,CryptoAuthLib讲解和移植完毕,可以愉快地调用508API啦~
五、508A 另一个小型libATECC108A-508A Library简介
ATECC108A-508A Library是专门针对108/508开发的一个小型库,包括eccx08_helper、eccx08_libarary。但这里只是包含了底层通讯层和命令解析层,并没有封装好应用层实现的API,所以使用时需要根据需求,二次封装API发送相应的命令。
目录结构如图:
感兴趣可以研究下,架构和CryptoAuthLib是一样的,只不过API层没有实现,只能自己封装命令。我实际开发中并没有使用这个库,所以不再介绍。(写Bolg感觉比写代码都累啊。。。)
—>下节介绍ATECC508基本功能的API测试,并抓下I2C的包分析下其数据收发。
支持原创,转载请附引用链接。
相关文章推荐
- [置顶] ATECC508A芯片开发笔记(一):初识加密芯片
- ATECC508A芯片开发笔记(五):Provision执行过程及代码分析
- ATECC508A芯片开发笔记(六):产生CSR以及申请证书(X.509)流程及其内容分析
- ATECC508A芯片开发笔记(三):获取508A串号、随机数源码及I2C抓包分析
- 为AM335x+Linux移植SGX+OpenGL+Qt5之完全开发笔记
- 【TINY4412】U-BOOT移植笔记:(1)移植前准备
- 【C#学习笔记】-Lesson1-学习及开发目的、开发环境简介
- python基础教程学习笔记 — 准备Windows下开发环境
- LFS-Linux From Scratch学习笔记——简介与准备工作
- Android开发学习笔记:Service的简介和启动方式
- 张高兴的 Windows 10 IoT 开发笔记:无线收发芯片 nRF24L01
- Android开发学习笔记:BroadcastReceiver简介和注册方式
- CC1310笔记1:开发准备
- Java笔记16:开发前准备
- web前端笔记1-开发网站准备工作
- 无线通讯LoRa---SX1278芯片开发笔记
- 【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
- PiscisOS开发笔记_1_PiscisOS的诞生和系统特性简介
- Java笔记16:开发前准备
- Ubunt的开发环境Andriod快速移植笔记