简介
随着IoT设备爆发式的增长,IoT设备的安全性已经越来越得到广泛的重视,其应用场景包括敏感数据存储、云服务接入、网络安全通信、系统启动、系统固件升级、多媒体版权保护等。然而由于IoT设备能力、成本的碎片化,较难形成能够覆盖所有设备的普适方案,系统设计者必须提供高伸缩性、高可配置的系统方案。 CH5631芯片是用于智能语音交互类产品的AIOT平台,搭配RTOS系统软件和语音算法,在计算能力、存储性能、集成度、低功耗、安全做了深度优化,向产品开发者提供真正低成本、低功耗的完整解决方案。本文基于CH5631芯片平台介绍安全应用pangu_secure_demo的创建及安全组件的移植过程。
移植前准备
代码下载
YoC代码下载见YoC, 本文使用的YoC版本为7.4.
CH5631平台分析
CH5631平台主核为CK804T, 支持TEE安全机制的硬件安全保护,具有片上efuse资源,安全算法上支持AES/RSA/SHA/TRNG硬件安全引擎。
组件移植分析
移植mbedtls组件,支持系统云安全接入、网络安全通信。mbedtls安全算法通过调用sec_crypto组件间接调用CH5631平台硬件能力。
移植sec_crypto,提供安全算法接口。
移植key_mgr, 支持基于efuse的密钥存储。
pangu_secure_demo
基于pangu_demo模板快速创建新应用方案。
移植前请阅读了解yocbook相关内容 最小系统、安全机制及安全组件介绍、CSI设计驱动接口、阿里云(MQTT)传感数据上云例程。
CSI驱动移植。安全组件依赖AES、SHA、RSA、RNG、Efuse驱动。
安全组件移植
步骤1、创建pangu_secure_demo
YoC代码根目录下从模板创建目录
cd ./solutions
cp -r pangu_demo pangu_secure_demo
修改pangu_secure_demo/package.yaml 配置文件,修改后如下:
name: pangu_secure_demo
version: v7.4-dev # <必选项> 组件版本号
description: CH5631安全组件DEMO
type: solution
solution:
board_name: pangu_cpu0
cpu_id: cpu0
depends: # 该组件依赖其他的组件
- csi: v7.4-dev
- drivers: v7.4-dev
- minilibc: v7.4-dev
- aos: v7.4-dev
- rhino: v7.4-dev
- console: v7.4-dev
- csi_pangu: v7.4-dev
- pangu_cpu0: v7.4-dev # '>' | ‘>=' | ''
- uservice: v7.4-dev
- partition: v7.4-dev
编译参数
build_config:
include:
- app/include
-
internal_include:
- app/include
- app/src
libs:
libpath:
#cflag: "-g -O0"
ldflag: -nostartfiles -Wl,--gc-sections -lm -Wl,-ckmap="yoc.map" -Wl,-zmax-page-size=1024
源文件
source_file:
- app/src/init/cli_cmd.c
- app/src/init/init.c
- app/src/*.c
def_config:
CONFIG_DEBUG: 1
CONFIG_ARCH_CSKY: 1
CONFIG_PARAM_NOT_CHECK: 1
CONFIG_CLI: 1
CONFIG_KV_SMART: 1
CONFIG_SOFTWDT: 1
CONFIG_AT: 1
CONFIG_NTP: 1
CONFIG_USING_TLS: 1
CONFIG_NON_ADDRESS_FLASH: 1
CONFIG_KERNEL_WORKQUEUE: 1
CONFIG_SYSTICK_HZ: 1000
CONFIG_CHIP_PANGU: 1
CONFIG_CHIP_PANGU_CPU0: 1
CONFIG_KERNEL_RHINO: 1
CONFIG_ARCH_INTERRUPTSTACK: 4096
CONFIG_CLI_TASK_STACK_SIZE: 8192
CONFIG_VENDOR_NAME: "thead"
CONFIG_CHIP_NAME: "pangu"
CONFIG_BOARD_NAME: "pangu_cpu0"
CONFIG_CPU: "ck804ef"
删除pangu_demo代码并添加pangu_secure_demo应用的代码。添加后目录如下:
├── app
│ ├── include
│ │ ├── app_config.h
│ │ ├── app_init.h
│ │ ├── csi_config.h
│ │ └── yoc_config.h
│ └── src
│ ├── app_main.c
│ ├── app_main.h
│ ├── demo_ecc_dsa.c
│ ├── demo_ecc_utils.c
│ ├── demo_ecc_utils.h
│ ├── demo_key_mgr.c
│ ├── demo_mbedtls.c
│ ├── demo_sec_crypto.c
│ ├── demo_sec_alimqtt.c
│ ├── demo_utils.h
│ ├── init
│ │ ├── cli_cmd.c
│ │ └── init.c
├── Makefile
├── package.yaml
├── README.md
└── SConstruct
步骤2、安全组件配置
package.yaml中添加安全组件依赖:
depends: # 该组件依赖其他的组件
...
- mbedtls: v7.4-dev
- sec_crypto: v7.4-dev
- key_mgr: v7.4-dev
package.yaml中添加配置项,设置平台安全机制为TEE:
CONFIG_TEE_CA: 1
package.yaml中添加配置项,使mbedtls 安全算法调用sec_crypto平台实现,进而间接调用平台TEE安全机制。
MBEDTLS_AES_ALT: 1
MBEDTLS_SHA256_ALT: 1
MBEDTLS_RSA_ALT: 1
package.yaml中添加配置项,支持密钥存储在efuse中:
CONFIG_TB_KP: 1
package.yaml 配置文件修改后如下:
name: pangu_secure_demo
version: v7.4-dev # <必选项> 组件版本号
description: CH5631安全组件DEMO
type: solution
solution:
board_name: pangu_cpu0
cpu_id: cpu0
depends: # 该组件依赖其他的组件
- csi: v7.4-dev
- drivers: v7.4-dev
- minilibc: v7.4-dev
- aos: v7.4-dev
- rhino: v7.4-dev
- console: v7.4-dev
- csi_pangu: v7.4-dev
- pangu_cpu0: v7.4-dev # '>' | ‘>=' | ''
- uservice: v7.4-dev
- partition: v7.4-dev
- mbedtls: v7.4-dev
- sec_crypto: v7.4-dev
- key_mgr: v7.4-dev
编译参数
build_config:
include:
- app/include
-
internal_include:
- app/include
- app/src
libs:
libpath:
ldflag: -nostartfiles -Wl,--gc-sections -lm -Wl,-ckmap="yoc.map" -Wl,-zmax-page-size=1024
源文件
source_file:
- app/src/init/*
- app/src/*.c
def_config:
CONFIG_DEBUG: 1
CONFIG_ARCH_CSKY: 1
CONFIG_PARAM_NOT_CHECK: 1
CONFIG_CLI: 1
CONFIG_KV_SMART: 1
CONFIG_SOFTWDT: 1
CONFIG_AT: 1
CONFIG_NTP: 1
CONFIG_USING_TLS: 1
CONFIG_NON_ADDRESS_FLASH: 1
CONFIG_KERNEL_WORKQUEUE: 1
CONFIG_SYSTICK_HZ: 1000
CONFIG_CHIP_PANGU: 1
CONFIG_CHIP_PANGU_CPU0: 1
CONFIG_KERNEL_RHINO: 1
CONFIG_ARCH_INTERRUPTSTACK: 4096
CONFIG_CLI_TASK_STACK_SIZE: 8192
CONFIG_VENDOR_NAME: "thead"
CONFIG_CHIP_NAME: "pangu"
CONFIG_BOARD_NAME: "pangu_cpu0"
CONFIG_CPU: "ck804ef"
##secure config##
CONFIG_TEE_CA: 1
#mbedtls
MBEDTLS_AES_ALT: 1
MBEDTLS_SHA256_ALT: 1
MBEDTLS_RSA_ALT: 1
#key_mgr
CONFIG_TB_KP: 1
#pangu_secure_demo
MBEDTLS_SELF_TEST: 1
CONFIG_SECURITY_DEMO_MBEDTLS: 1
CONFIG_SECURITY_DEMO_SEC_CRYPTO: 1
CONFIG_SECURITY_DEMO_TEST: 1
CONFIG_SECURITY_DEMO_KEY_MGR: 1
步骤3、移植验证
该步骤验证以上的移植是否成功。
编译pangu_secure_demo 并烧写镜像。
重启单板,系统自动运行pangu_secure_demo程序。
重启后串口应该有如下打印,提示输入运行命令。
Welcome to CLI...
mbedtls基本验证命令
sdemo mbedtls
运行成功后串口有如下打印:
AES-ECB-128 (dec): passed
AES-ECB-128 (enc): passed
AES-ECB-192 (dec): passed
AES-ECB-192 (enc): passed
AES-ECB-256 (dec): passed
AES-ECB-256 (enc): passed
AES-CBC-128 (dec): passed
AES-CBC-128 (enc): passed
AES-CBC-192 (dec): passed
AES-CBC-192 (enc): passed
AES-CBC-256 (dec): passed
AES-CBC-256 (enc): passed
AES-CTR-128 (dec): passed
AES-CTR-128 (enc): passed
AES-CTR-128 (dec): passed
AES-CTR-128 (enc): passed
AES-CTR-128 (dec): passed
AES-CTR-128 (enc): passed
SHA-1 test #1: passed
SHA-1 test #2: passed
SHA-1 test #3: passed
SHA-224 test #1: passed
SHA-224 test #2: passed
SHA-224 test #3: passed
SHA-256 test #1: passed
SHA-256 test #2: passed
SHA-256 test #3: passed
CTR_DRBG : passed
CTR_DRBG : passed
RSA key validation: passed
PKCS#1 encryption : passed
PKCS#1 decryption : passed
PKCS#1 data sign : passed
PKCS#1 sig. verify: passed
key_mgr验证命令:
sdemo km
运行成功后串口有如下打印:
key_mgr_demo_main passed!
sec_crypto验证命令
sdemo sec_crypto
运行成功后串口有如下打印:
sec_crypto_sha1_demo passed!
sec_crypto_sha224_demo passed!
sec_crypto_sha256_demo passed!
sec_crypto_rng_demo passed!
sec_crypto_aes_demo passed!
sec_crypto_rsa_demo passed!
mbedtls组件联网验证
通过调用mbedtls实现已MQTT方式安全接入aliyun IoT,验证mbedtls正常工作。
package.yaml中配置MQTT需要的WIFI SSID、PSK、device name信息:
CONFIG_WIFI_SSID: "TESTXXX"
CONFIG_WIFI_PSK: "TESTXXX"
CONFIG_DEVICE_NAME: "e6d0ec6104400000b97baff21bebe40f"
通过串口 CLI命令配置从阿里云注册的联网三要素,如:
factory setali 222lg7ARENf e6d0ec1234400000b97baff21bebe40f 9aaa94b0bdfabdcab815b79ec51ae37e ab09
运行MQTT接入命令:
sdemo alimqtt
运行成功后串口有如下打印:
[ 22.594]tls LD CA root Cert
[ 22.599]tls SSL/TLS struct
[ 22.602]tls Conn /a18lg7ARENf.iot-as-mqtt.cn-shanghai.aliyuncs.com/1883
[ 22.684]tls Handshake
[ 22.938]tls Verify X.509
[ 22.941]tls certverify ret 0x00
[ 22.997]app_net CONNNECT SUCCESS
运行数据发布命令:
sdemo push
运行成功后串口有如下打印:
{"temp":20,"humi":20,"led":1,"deviceName":"e6d0ec6104400000b97baff21bebe40f"}
[ 28.877]app_net push action
[ 28.976]app_net PUSH_SUCCESS