目录

  • 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可分为以下几类:

  1. Basic API – Best for ease of use.

  2. Core API – Best for use of any device feature, power developer.
    BasicAPI执行时会自动调用Core的函数,在Basic API不能满足需求的时候推荐使用

  3. PKI X.509 Certificate & TLS – PKI applications which store and
    retrieve X.509 certificates.

  4. PKI-Certificate API:因为证书数据分为不可修改的模板 boilerplate和动态Dynamic
    data两部分,该部分API主要负责后者,既X.509证书重组

  5. PKI TLS – Secure communication key agreement protocols. Crypto
    Utilities – General software hash implementations.

  6. PKI-TLS API:实现ECDH算法(508A)与OpenSSL TLS的整合,如利用ECDH产生TLS的session key
    SHA-256等哈希算法的API,可用在没有加密芯片的Host端做运算

  7. 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 库简介与移植相关推荐

  1. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云    邮箱: happylifemxy@163.com    期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...

  2. iOS工程开发笔记二

    iOS工程开发笔记<二> 在Xcode 4, 5的模板工程中可以看到Precompile Prefix Header,但是在Xcode 6被去除了. Xcode 6去掉Precompile ...

  3. 微信小程序开发笔记二(WXSS和CSS样式美化)

    微信小程序开发笔记二(WXSS和CSS样式美化) 一.CSS基本知识 1.Class选择器的定义 2.ID选择器的定义 3.ID选择器和class选择器的区别 4.CSS中设置颜色 5.CSS中的文本 ...

  4. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  5. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云 邮箱: happ ...

  6. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模 五 粒子系统模拟 二

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  7. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云    邮箱: h ...

  8. 【Visual C++】游戏开发笔记二十一 游戏基础物理建模(三) 摩擦力系统模拟

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7555785 作者:毛星云    邮箱: h ...

  9. 【Visual C++】游戏开发笔记二十五 最简化的DirectX开发环境的配置

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7672101 作者:毛星云    邮箱: h ...

最新文章

  1. sdwan技术发展正蚕食mpls市场—vecloud
  2. 设计模式总结 (4)结构型模式
  3. optee_os中静态共享内存的注册
  4. 需求实在太旺盛,三星电子考虑扩大在华芯片产能
  5. Hadoop之HDFS读写数据流程
  6. 小米“618”战报:全平台支付金额破190亿,同比增长90%
  7. 基于STM32的简易交通灯设计
  8. 单片机基础教程那么多,什么样才是靠谱的学习方式
  9. 如果物联网平台一直不盈利,行业集体该怎么活?
  10. MySql经典面试题(含表)
  11. 流形上的微积分和微分形式的可视化导论(一)
  12. Latex证明环境:白方块/黑方块
  13. 查询oracle表空间是否满了,oracle表空间满了,导致数据不能写入数据库
  14. 《惊涛大冒险》观后感
  15. 支持外链的mp3网站
  16. C#关闭、启动、重启IIS
  17. oracle 整倍数,Linux x86主机运行天数是24.8的倍数都有可能引发Oracle bug及解决方法...
  18. clang fatal error: ‘stdio.h‘ file not found
  19. PubMed 文献下载流程,收费文献下载办法
  20. 马上七夕了程序员如何给爱人一个浪漫表白?

热门文章

  1. python的基本统计和分组分析和分布分析和交叉分析和结构分析
  2. 如何在Windows平台用Java代码暴力破解WIFI密码
  3. Sensor系列五 App实现获取gsensor数据
  4. 人工智能之路学习计划
  5. 初学Python画五角星
  6. easyUI分页中,如何实现页面跳转,再返回时,仍然到跳转前页数。(含页面显示条数)
  7. 客制化PO单据模板(实例)
  8. 泛型中的 T、E、K、V,还记得嘛?
  9. 时间轮算法HashedWheelTimer
  10. 助力工业物联网,工业大数据项目介绍及环境构建【一、二】