ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
目录
- ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植
- Atmel两个官方lib介绍
- 一、CryptoAuthLib简介
- Lib中最主要的三种对象类型:
- 二、CryptoAuthLib的移植
- 三 、bitbang方式移植CryptoAuthLib
- 四、从逻辑和代码分析CryptoAuthLib的底层驱动调用结构关系:
- 基于该模型自上而下开始代码分析:
- 至此,CryptoAuthLib讲解和移植完毕,可以愉快地调用508API啦~
- 五、508A 另一个小型libATECC108A-508A Library简介
- Library目录结构:
- 博主热门文章推荐:
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中最主要的三种对象类型:
- ATCADevice:Device 设备对象
由ATCAIface和ATCACommand实例组成,初始化Basic 的API会自动创建一个对象,通过该对象完成各种operation,There is one instance of an ATCADevice per physical device expected to manage the system.
- ATCAIface :Interface 包括硬件抽象层中,底层驱动操作(收发数据)
ATCAIface定义了与底层加密芯片通信的接口函数,将 HAL 的API函数与应用层关联起来 ,以屏蔽底层通讯层(I2C、UART)的差异。
- ATCACommand:Command 包括加密芯片支持的各种命令
ATCACommand对象主要将命令重组成数组,以便发送到加密芯片。ATCACommand对象不发送命令,只build命令;例如确定命令响应包的大小、计算CRC等。
三种对象结构联系:
根据应用功能不同,Lib中的API可分为以下几类:
Basic API – Best for ease of use.
Core API – Best for use of any device feature, power developer.
BasicAPI执行时会自动调用Core的函数,在Basic API不能满足需求的时候推荐使用PKI X.509 Certificate & TLS – PKI applications which store and
retrieve X.509 certificates.PKI-Certificate API:因为证书数据分为不可修改的模板 boilerplate和动态Dynamic
data两部分,该部分API主要负责后者,既X.509证书重组PKI TLS – Secure communication key agreement protocols. Crypto
Utilities – General software hash implementations.PKI-TLS API:实现ECDH算法(508A)与OpenSSL TLS的整合,如利用ECDH产生TLS的session key
SHA-256等哈希算法的API,可用在没有加密芯片的Host端做运算HAL – Hardware abstraction layer integrates with physical interfaces
修改HAL的API移植到不同的平台
二、CryptoAuthLib的移植
I2C驱动在软件架构中的位置:
在lib中,底层通讯相关驱动都在**/lib/hal/** 目录下。
如果是使用的Atmel所支持的开发板,就可以直接使用相应的文件如果是其他平台,可以使用bit_bang模式,很方便移植到自己的平台。当然如果其他平台想使用真实I2C硬件控制器,则就需要自己写代码适配了。
由于我使用的STM32板子,为快速移植,通过Bitbang方式与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库放到自己的工程代码目录,编译调试即可
这部分驱动代码下载地址: AT508HALCode_STM32F4.zip https://download.csdn.net/download/HowieXue/19777277
四、从逻辑和代码分析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 interfacehal_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_I2Chal->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;#endifbreak;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 = Commandtxlength++; //!< count Word Address byte towards txlength//! Set I2C pinsi2c_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 writtenstatus = hal_i2c_send_slave_address(iface, I2C_WRITE);if (status != ATCA_SUCCESS)break;//! Send the remaining bytesstatus = i2c_send_bytes(txlength, txdata);} while (0);//! Send STOP regardless of i2c_statusi2c_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发送相应的命令。
Library目录结构:
感兴趣可以研究下,架构和CryptoAuthLib是一样的,只不过API层没有实现,只能自己封装命令。我实际开发中并没有使用这个库,所以不再介绍。(写Bolg感觉比写代码都累啊。。。)
—>下节介绍ATECC508基本功能的API测试,并抓下I2C的包分析下其数据收发。
支持原创,转载请附引用链接。
博主热门文章推荐:
一篇读懂系列:
- 一篇读懂无线充电技术(附方案选型及原理分析)
- 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
LoRa Mesh系列:
- LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
- LoRa学习:信道占用检测原理(CAD)
- LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)
ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植相关推荐
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云 邮箱: happylifemxy@163.com 期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...
- iOS工程开发笔记二
iOS工程开发笔记<二> 在Xcode 4, 5的模板工程中可以看到Precompile Prefix Header,但是在Xcode 6被去除了. Xcode 6去掉Precompile ...
- 微信小程序开发笔记二(WXSS和CSS样式美化)
微信小程序开发笔记二(WXSS和CSS样式美化) 一.CSS基本知识 1.Class选择器的定义 2.ID选择器的定义 3.ID选择器和class选择器的区别 4.CSS中设置颜色 5.CSS中的文本 ...
- [安卓开发笔记二]android Studio通过jni调用C++代码
[安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云 邮箱: happ ...
- 【Visual C++】游戏开发笔记二十三 游戏基础物理建模 五 粒子系统模拟 二
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云 邮箱: h ...
- 【Visual C++】游戏开发笔记二十一 游戏基础物理建模(三) 摩擦力系统模拟
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7555785 作者:毛星云 邮箱: h ...
- 【Visual C++】游戏开发笔记二十五 最简化的DirectX开发环境的配置
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7672101 作者:毛星云 邮箱: h ...
最新文章
- sdwan技术发展正蚕食mpls市场—vecloud
- 设计模式总结 (4)结构型模式
- optee_os中静态共享内存的注册
- 需求实在太旺盛,三星电子考虑扩大在华芯片产能
- Hadoop之HDFS读写数据流程
- 小米“618”战报:全平台支付金额破190亿,同比增长90%
- 基于STM32的简易交通灯设计
- 单片机基础教程那么多,什么样才是靠谱的学习方式
- 如果物联网平台一直不盈利,行业集体该怎么活?
- MySql经典面试题(含表)
- 流形上的微积分和微分形式的可视化导论(一)
- Latex证明环境:白方块/黑方块
- 查询oracle表空间是否满了,oracle表空间满了,导致数据不能写入数据库
- 《惊涛大冒险》观后感
- 支持外链的mp3网站
- C#关闭、启动、重启IIS
- oracle 整倍数,Linux x86主机运行天数是24.8的倍数都有可能引发Oracle bug及解决方法...
- clang fatal error: ‘stdio.h‘ file not found
- PubMed 文献下载流程,收费文献下载办法
- 马上七夕了程序员如何给爱人一个浪漫表白?