Cryptoauthlib是Microchip针对安全芯片发布的C语言的代码库。具有优秀的分层结构,可以很方便地移植到任意平台中。并且提供了针对常用SSL库的适配层,支持OpenSSL, MbedTLS, WolfSSL等。
目前大部分的Linux系统中使用OpenSSL,OpenSSL调用硬件SE是通过PKCS11来实现的。本文将介绍OpenSSL通过PKCS11来调用Cryptoauthlib,实现操作硬件SE的步骤。
基本的依赖关系为:
OpenSSL -> p11-kit -> libpkcs -> Cryptoauthlib
1. 硬件平台
在Arm平台下可以使用I2C或HID接口。对于嵌入式平台通常使用I2C接口直接操作安全芯片。
本文主要介绍I2C接口。
注意:安全芯片在平时处于休眠模式,不会响应I2C的操作,所以每次操作前都需要先唤醒芯片。
唤醒时序是:在SDA上发一个超过60uS的低电平,拉高后再等待1.5ms,通过器件地址比如0xC0直接读4个字节,如果是0x04, 0x11, 0x33, 0x43则说明芯片确实正确唤醒了。接下来才可以发正常需要的命令。
由于原生Linux内核不支持动态调整I2C的时钟频率,所以建议I2C时钟频率固定在100K,这样只需要通过I2C发送0x00就可以满足唤醒时序了。
由于软件的依赖关系比较复杂,强烈推荐使用Buildroot构建工具,其中已经支持了大部分的依赖库,比如openssl, openssl-engine, libp11, p11-kit, gnutls, libffi, libtasn1等。
2. 安装交叉编译工具
有两种方式安装编译工具链。
1. 使用apt自动安装
$ sudo apt-get install gcc-arm-linux-gnueabi
2. 使用buildroot搭建编译工具链
两种方式:
- 从buildroot源码自行构建工具链
- 安装Buildroot的SDK
通常如果需要自行定义目标板的运行库和相关工具时,需要按照需求配置目标板的运行环境。建议自行搭建builroot工具链。具体参考buildroot相关文档。
或者直接复制SDK安装文件到需要的目录下,运行解压命令即可。
解压后进入目录,运行一个shell脚本重定向编译环境。
命令如下
$ tar xzvf arm-buildroot-linux-gnueabi_sdk-buildroot.tar.gz
$ cd arm-buildroot-linux-gnueabi_sdk-buildroot
$ ./relocate-sdk.sh
3. 下载编译支持pkcs11的Cryptoauthlib库
我们需要支持pkcs11的版本, 在v3.3.0和之后的版本中,已经集成了pkcs11的功能,所以不需要专门下载这个pkcs11分支。
1. 获取cryptoauthlib最新版本
$ git clone https://github.com/MicrochipTech/cryptoauthlib
由于国内网络访问github比较慢,可以用下面的备用库
$ git clone https://gitee.com/flyerink/cryptoauthlib
2. 在源码目录下建立cmake交叉编译工具链文件arm_toolchain.cmake,具体路径需要根据自己的编译环境修改。
- 使用gcc-arm-linux-gnueabi工具链时
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /usr)
SET(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabi-g++)
SET(CMAKE_LINKER ${tools}/bin/arm-linux-gnueabi-ld)
SET(CMAKE_NM ${tools}/bin/arm-linux-gnueabi-nm)
SET(CMAKE_OBJCOPY ${tools}/bin/arm-linux-gnueabi-objcopy)
SET(CMAKE_OBJDUMP ${tools}/bin/arm-linux-gnueabi-objdump)
SET(CMAKE_RANLIB ${tools}/bin/arm-linux-gnueabi-ranlib)
- 使用buildroot工具链时
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set