ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植



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库结构
这里写图片描述
其中,其中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 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发送相应的命令。

Library目录结构:

这里写图片描述

这里写图片描述

感兴趣可以研究下,架构和CryptoAuthLib是一样的,只不过API层没有实现,只能自己封装命令。我实际开发中并没有使用这个库,所以不再介绍。(写Bolg感觉比写代码都累啊。。。)
—>下节介绍ATECC508基本功能的API测试,并抓下I2C的包分析下其数据收发。

支持原创,转载请附引用链接。


博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


在这里插入图片描述

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
《STM32嵌入式系统开发实战指南:FreeRTOS与LwIP联合移植》是一本针对STM32嵌入式系统开发的书籍,主要介绍了如何在STM32平台上实现FreeRTOS实时操作系统和LwIP网络协议栈的联合移植。该书籍通过理论与实践相结合的方式,详细介绍了如何进行STM32芯片的初始化配置、FreeRTOS操作系统的移植及应用、LwIP网络协议栈的移植及应用等内容。 在《STM32嵌入式系统开发实战指南:FreeRTOS与LwIP联合移植》中,作者通过实际的案例和项目演示,向读者展示了如何利用STM32CubeMX工具进行芯片初始化配置,如何移植FreeRTOS实时操作系统,并详细介绍了FreeRTOS任务管理、任务间通信、时间管理、内存管理等内容。同时,书中还介绍了LwIP网络协议栈的基本原理、移植方法以及在实际项目中的应用。 该书籍的特点是系统性强,内容全面,操作实用,适合嵌入式系统开发初学者和从业人员使用。通过学习本书,读者可以全面掌握STM32芯片的初始化配置方法,了解FreeRTOS实时操作系统的移植和使用技巧,掌握LwIP网络协议栈的移植和应用实践,从而在实际项目中快速应用于嵌入式系统开发中。 总的来说,《STM32嵌入式系统开发实战指南:FreeRTOS与LwIP联合移植》通过丰富的案例和实践,帮助读者快速掌握STM32嵌入式系统开发的关键技术和方法,是一本值得推荐的实用性书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值