簡介
隨著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