首页
商城
  • English
  • 简体中文
首页
商城
  • English
  • 简体中文
  • 产品系列

    • FPGA+ARM

      • GM-3568JHF

        • 一、简介

          • GM-3568JHF 简介
        • 二、快速开始

          • 00 前言
          • 01 环境搭建
          • 02 编译说明
          • 03 烧录指南
          • 04 调试工具
          • 05 软件更新
          • 06 查看信息
          • 07 测试命令
          • 08 应用编译
          • 09 源码获取
        • 三、外设与接口

          • 01 USB
          • 02 显示与触摸
          • 03 以太网
          • 04 WIFI
          • 05 蓝牙
          • 06 TF-Card
          • 07 音频
          • 08 串口
          • 09 CAN
          • 10 RTC
        • 四、应用开发

          • 01 UART读写案例
          • 02 按键检测案例
          • 03 LED灯闪烁案例
          • 04 MIPI屏幕检测案例
          • 05 读取 USB 设备信息案例
          • 06 FAN 检测案例
          • 07 FPGA FSPI 通信案例
          • 08 FPGA DMA 读写案例
          • 09 GPS调试案例
          • 10 以太网测试案例
          • 11 RS485读写案例
          • 12 FPGA IIC 读写案例
          • 13 PN532 NFC读卡案例
          • 14 TF卡读写案例
        • 五、QT开发

          • 01 ARM64交叉编译器环境搭建
          • 02 QT 程序加入开机自启服务
        • 六、RKNN_NPU开发

          • 01 RK3568 NPU 概述
          • 02 开发环境搭建
          • 运行官方 YOLOv5 示例
        • 七、FPGA开发

          • ARM与FPGA通讯
          • FPGA开发手册
        • 八、其他

          • 01 根目录文件系统的修改
          • 02 系统自启服务
        • 九、资料下载

          • 资料下载
    • ShimetaPi

      • M4-R1

        • 一、简介

          • M4-R1简介
        • 二、快速上手

          • 01 OpenHarmony概述
          • 02 镜像烧录
          • 03 应用开发快速上手
          • 04 设备开发快速上手
        • 三、应用开发

          • 01 ArkUI

            • 1 ArkTS语言简介
            • 2 UI 组件-Row 容器介绍
            • 3 UI 组件-Column 容器介绍
            • 4 UI 组件-Text 组件
            • 5 UI 组件-Toggle 组件
            • 6 UI 组件-Slider 组件
            • 7 UI 组件-Animation 组件&Transition 组件
          • 02 资料获取

            • 1 OpenHarmony 官方资料
          • 03 开发须知

            • 1 Full-SDK替换教程
            • 2 引入和使用三方库
            • 3 HDC调试
            • 4 命令行恢复出厂模式
            • 5 升级App为system权限
          • 04 构建第一个应用

            • 1 构建第一个ArkTs应用-HelloWorld
          • 05 案例

            • 01 串口调试助手应用案例
            • 02 手写板应用案例
            • 03 数字时钟应用案例
            • 04 WIFI 信息获取应用案例
        • 四、设备开发

          • 1 Ubuntu环境开发

            • 01 环境搭建
            • 02 下载源码
            • 03 编译源码
          • 2 使用DevEco Device Tool 工具

            • 01 工具简介
            • 02 开发环境的搭建
            • 03 导入SDK
            • 04 HUAWEI DevEco Tool 功能介绍
        • 五、内核外设与接口

          • 01 指南
          • 02 设备树介绍
          • 03 NAPI 入门
          • 04 ArkTS入门
          • 05 NAPI开发实战演示
          • 06 GPIO介绍
          • 07 I2C通讯
          • 08 SPI通信
          • 09 PWM 控制
          • 10 串口通讯
          • 11 TF卡
          • 12 屏幕
          • 13 触摸
          • 14 Ethernet(以太网)
          • 15 M.2 硬盘
          • 16 音频
          • 17 WIFI & BT
          • 18 摄像头
        • 六、资料下载

          • 资料下载
      • M5-R1

        • 一、简介

          • M5-R1 开发文档
        • 二、快速上手

          • 镜像烧录
          • 环境搭建
          • 下载源码
        • 三、外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
        • 四、资料下载

          • 资料下载
      • Pico-G1

        • 一、产品概述

          • 01 产品介绍
          • 02 SDK版本基本信息
        • 二、快速入门

          • 01 开发环境搭建
          • 02 镜像编译
          • 03 镜像烧录
          • 04 系统登录
          • 05 网络配置
          • 06 文件传输
          • 07 SDK目录结构
          • 08 部署第一个应用程序
          • 09 部署第一个驱动程序
          • 10 SD卡挂载
        • 三、外设与接口

          • 01 GPIO控制
          • 02 UART串口通信
          • 03 I2C 通信
          • 04 SPI 通信
        • 四、MPP媒体开发

          • 01 MPP媒体处理软件
          • 02 图像处理链路
          • 03 视频输入
          • 04 图像编码
        • 五、NPU与AI

          • 01 NPU驱动与运行库架构
          • 02 .xmm 模型加载
          • 03 SVP视频处理
          • 04 AI降噪 (AI_NR)
        • 六、应用程序示例

          • 01 加解密接口应用
          • 02 ADC 采集应用
          • 03 低功耗应用
          • 04 音频处理应用
          • 05 视频编码应用
          • 06 视频输入应用
          • 07 视频图形子系统应用
          • 08 区域叠加应用
          • 09 智能视频引擎应用
          • 10 UVC 网络摄像头应用
          • 11 综合快速演示应用
          • 12 FPN 校正应用
          • 13 区域运动检测应用
          • 14 MTCNN 人脸检测应用
        • 七、扩展板外设功能例程

          • 00 - Pico 扩展板外设功能例程总览
          • 01 - OLED 显示应用
          • 02 - TFT 显示应用
          • 03 - MPU6050 陀螺仪应用
          • 04 - ADC 采集应用
          • 05 - 无源蜂鸣器应用
          • 06 - MQ 气体传感器应用
          • 07 - GPS 定位应用
          • 08 - SHT20 温湿度应用
          • 09 - 超声波测距应用
          • 10 - SPO2 血氧传感器应用
          • 11 - 电机控制应用
          • 12 - 舵机控制应用
    • 开源鸿蒙

      • SC-3568HA

        • 一、简介

          • SC-3568HA简介
        • 二、快速上手

          • OpenHarmony概述
          • 镜像烧录
          • 开发环境准备
          • Hello World应用以及部署
        • 三、应用开发

          • ArkUI

            • 第一章 ArkTS语言简介
            • 第二章 UI组件介绍和实际应用(上)
            • 第三章 UI组件介绍和实际应用(中)
            • 第四章 UI组件介绍和实际应用(下)
          • 拓展

            • 第一章 入门指引
            • 第二章 三方库的引用和使用
            • 第三章 应用编译以及部署
            • 第四章 命令行恢复出厂设置
            • 第五章 系统调试--HDC调试
            • 第六章 APP 稳定性测试
            • 第七章 应用测试
        • 四、设备开发

          • 第一章 环境搭建
          • 第二章 下载源码
          • 第三章 编译源码
        • 五、内核的外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • 树莓派拓展板
        • 六、资料下载

          • 资料下载
      • M-K1HSE

        • 一、简介

          • M-K1HSE 简介
        • 二、快速开始

          • 开发环境搭建
          • 源码获取
          • 编译说明
          • 烧录指南
        • 三、应用开发

          • 00 应用开发环境搭建
          • 01 第一个应用-Hello World
        • 四、外设与接口

          • 01 Audio
          • 02 RS485
          • 03 Display
        • 五、系统定制开发

          • 系统移植
          • 系统定制
          • 驱动开发
          • 系统调试
          • OTA升级
        • 六、资料下载

          • 资料下载
    • HVS视觉融合相机

      • 快速开始

        • 01 SDK 介绍
        • 02 资料下载
        • 03 设备固件烧录
        • 04 第一个 C++ 程序
        • 05 第一个 Python 程序
        • 06 Python 数据分析
        • 07 MultiVision Studio
      • 二次开发

        • 01 编程指引

          • 01 打开相机
          • 02 读取事件
          • 03 录制与回放
          • 04 事件处理(去噪)
          • 05 显示与可视化
          • 06 调参
          • 07 采集 APS 图像
        • 02 Toolkit SDK

          • 01 Hybrid Vision Toolkit
          • 02 快速上手
          • 03 C++ API
          • 04 Python API
        • 03 Algo SDK

          • 01 Hybrid Vision Algo
          • 02 Algo API
          • 03 Windows Algo SDK
        • 04 示例程序总览
        • 05 应用场景
      • 基础知识

        • 01 事件相机基础原理
        • 02 HVS 融合视觉
        • 03 事件可视化
        • 04 数据格式参考
        • 05 术语表
        • 06 偏置与调参
        • 07 视频教程
      • HVS 相机

        • 01 HVS 相机快速上手
        • 02 网络化能力

          • 01 HVS 相机系统架构
          • 2 EVS Network Server
          • 3 EVS Time Sync
          • 4 Web Window
        • 03 HVS 相机兼容性矩阵
        • 04 常见问题解决指南
        • 05 产品

          • CF-NRS1(灵光一号视觉融合相机)
      • HVS 模块

        • 01 MIPI 模块快速上手
        • 02 载板适配

          • RDK X5 载板适配
          • RDK S100 载板适配
          • 树莓派载板适配
          • 地瓜派载板适配
          • shimetapi 板载板适配
        • 03 MIPI 模块兼容性矩阵
        • 04 产品

          • EVS_003 传感器模块
    • AI硬件

      • 1684XB-32T

        • 一、简介

          • AIBOX-1684XB-32简介
        • 二、快速上手

          • 初次使用
          • 网络配置
          • 磁盘使用
          • 内存分配
          • 风扇策略
          • 固件升级
          • 交叉编译
          • 模型量化
        • 三、应用开发

          • 开发简介

            • Sophgo SDK开发
            • SOPHON-DEMO简介
          • 大语言模型

            • 部署Llama3示例
            • Sophon LLM_api_server开发
            • 部署MiniCPM-V-2_6
            • Qwen-2-5-VL图片视频识别DEMO
            • Qwen3-chat-DEMO
            • Qwen3-Qwen Agent-MCP开发
            • Qwen3-langchain-AI Agent
          • 深度学习

            • ResNet(图像分类)
            • LPRNet(车牌识别)
            • SAM(通用图像分割基础模型)
            • YOLOv5(目标检测)
            • OpenPose(人体关键点检测)
            • PP-OCR(光学字符识别)
        • 四、资料下载

          • 资料下载
      • 1684X-416T

        • 简介

          • AIBOX-1684X-416简介
        • Demo简单操作指引

          • shimeta智慧监控demo的简单使用说明
      • RDK-X5

        • 简介

          • RDK-X5 硬件简介
        • 快速开始

          • RDK-X5 快速开始
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-颜色识别检测
            • 实验03-手势识别体验
            • 实验04-YOLOv5物体检测
      • RDK-S100

        • 简介

          • RDK-S100 硬件简介
        • 快速开始

          • RDK-S100 硬件简介
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-图像处理基础
            • 实验03-目标检测
            • 实验04-图像分割
      • RK1828

        • 一、简介

          • M5-182X-A1 AI 边缘盒子 - 产品介绍
          • M5-182X-A1 硬件规格
          • M5-182X-A1 使用与安全
        • 二、快速开始

          • M5-182X-A1 镜像烧录
          • RK182X 硬件安装与验证
          • RK182X 开发环境快速搭建
          • RK182X SDK 总览
          • RK182X 环境搭建详解
          • RK182X 快速开始
          • 原厂 SDK 资料抽取记录
        • 三、开发指南

          • ClawChips 架构与原理
          • SKILL 使用手册
          • RK182X系列LLM推理(RK1828型号)
          • RK182X系列CNN推理(RK1828型号)
          • 模型转换
          • RK182X AI Agent 应用开发指南
          • RK182X 工业异常检测应用
        • 四、SDK 参考

          • RKNN3-SDK 概述

            • RKNN3 SDK 概述
          • RKNN3-Toolkit

            • RKNN3 Toolkit 安装与使用
          • RKLLM

            • RKLLM 设备端 LLM 推理
          • RK182X系列 NPU 概述与架构(RK1828型号)
          • RK182X INT8 量化推理部署
          • RK182X MPP 多媒体处理框架
          • MPP 详解

            • RK182X 视频解码
            • RK182X 视频编码
          • NPU 详解

            • RKNN 模型转换
            • RK182X NPU INT8 量化推理
            • RK182X 多模型并行推理
          • RGA 详解

            • RK182X RGA 2D 图形加速
          • VPU 详解

            • RK182X VPU 编解码
        • 五、硬件参考

          • RK182X系列 硬件架构概述(RK1828型号)
          • RK182X 引脚定义与复用配置
          • RK182X 引脚定义
          • RK182X 电源管理
          • RK182X 时钟与 PLL 配置
          • RK182X 时钟与频率配置
        • 六、实战教程

          • Hello World
          • Hello RK1828 - 第一个程序
          • RTSP 推流
          • RTSP 推流 + AI 分析
          • 视美泰AI龙虾一键部署
          • PaddleOCR-VL 文字识别
          • Qwen3-1.7B LLM 文本对话
          • AI 巡检多视角(Qwen3-VL 包装)
          • YOLOv5 目标检测
        • 七、资料下载

          • 资料下载
        • 八、常见问题

          • 常见问题
    • 核心板

      • C-3568BQ

        • 简介

          • C-3568BQ 简介
      • C-3588LQ

        • 简介

          • C-3588LQ 简介
      • GC-3568JBAF

        • 简介

          • GC-3568JBAF 简介
      • C-K1BA

        • 简介

          • C-K1BA 简介
    • 软件平台

      • ShiMetaPi Workbench

        • 一、产品简介

          • 产品概述
          • 核心架构
          • 功能入口
          • 支持的硬件
          • 版本说明
        • 二、快速入门

          • 安装与登录
          • 连接设备
          • 配置环境
          • 接入 AIHub
          • 首次调用模型
        • 三、用户指南

          • 工作区总览
          • 设备管理
          • 模型广场
          • 一键部署
          • 视觉 - SVP
          • 视觉 - 自定义模型
          • shimeta-py IDE
          • 终端
          • Agent 调试助手
          • 设置与资源
        • 四、常见问题

          • 安装与登录
          • 设备连接
          • 模型与部署
          • 视觉与运行时
          • 设置与其他
      • ShimetaPi软件源

        • 简介

          • ShimetaPi 软件源
        • Pico G1 (GK7206)

          • 快速开始

            • 安装与首次推理
            • shimeta_infer — 图片推理
            • shimeta_camera — 摄像头实时推理
            • SVP 场景检测
            • 文件传输与内置模型参考
            • 常见问题
          • HTTP API & Python SDK

            • HTTP API 参考
      • 模型微调训练平台

        • 一、平台介绍

          • 模型训练平台
        • 二、快速上手

          • 注册与登录
          • 创建第一个模型(30 分钟快速体验)
        • 三、训练指南

          • 数据准备与标注
          • 训练参数配置
          • 启动与监控训练
          • 模型评估与测试
        • 四、模型部署

          • 导出模型
          • 部署到边缘设备

01 加解密接口应用

本章节介绍 GK7206 的加解密接口应用示例 —— sample_cipher。该应用演示了芯片硬件加密模块的各种功能,包括 AES 对称加解密、RSA 签名与加解密、HASH 摘要、随机数生成以及 efuse 密钥管理等密码学操作。

应用源码位于 SDK 目录 sample/cipher/,提供了完整的密码学功能演示,是开发安全相关应用的参考模板。

1 应用概述

1.1 功能特性

  • AES 对称加解密:支持 ECB/CBC/CTR/CFB/OFB 五种工作模式,支持 128/256 位密钥
  • RSA 非对称加密:支持 RSA 签名与验签、公钥加密与私钥解密
  • HASH 摘要:支持 SHA1/SHA256 等哈希算法
  • 随机数生成:硬件随机数生成器(RNG)
  • efuse 密钥管理:支持从 efuse 读取 CA 密钥进行加解密
  • 多块批量处理:演示多块数据的批量加解密操作
  • 虚拟地址模式:支持使用虚拟地址进行加解密操作

1.2 技术参数

参数值
支持算法AES、RSA、SHA1、SHA256、RNG
AES 工作模式ECB、CBC、CTR、CFB、OFB
AES 密钥长度128 位、256 位
AES 数据位宽128 位
RSA 密钥长度1024/2048 位
HASH 算法SHA1、SHA256
内存占用极小(无硬件依赖)
NPU 使用不使用

1.3 测试用例列表

index名称测试指令预期现象(成功)失败可能原因
1CIPHER./sample_cipher 1AES CBC/CTR/ECB 加解密后与明文比对一致 → TEST_END_PASS加解密/比对失败
2CIPHER-MULTI./sample_cipher 2多块批量 AES 各块比对一致 → PASS同上
3CIPHER-EFUSE./sample_cipher 3efuse CA key 加解密比对一致 → PASSefuse 未烧 CA key(正常)
4HASH./sample_cipher 4输出固定长度摘要 → PASS—
5RNG./sample_cipher 5打印随机字节 → PASS—
6RSA-SIGN./sample_cipher 6RSA 签名+验签通过 → PASS验签失败
7RSA-ENC./sample_cipher 7公钥加密/私钥解密比对一致 → PASS比对失败
8CIPHER-VIA./sample_cipher 8虚拟地址版 AES 比对一致 → PASS比对失败

1.4 目录结构

sample/cipher/
├── Makefile              # 构建脚本
└── sample_cipher.c       # 主程序(含所有测试用例)

2 编译与部署

2.1 前置条件

在编译本应用之前,请确保已完成以下准备工作:

  1. SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
  2. SDK 已完整编译一次:应用依赖 SDK 的公共库和头文件

提示

本应用无硬件依赖,无需 sensor 或其他外设,可在任何情况下测试。

2.2 编译应用

# 进入 sample 目录
cd <SDK_PATH>/sample

# 编译 cipher 示例
make -C cipher clean && make -C cipher

或者从顶层编译:

make -C sample all

编译成功后,在 sample/cipher/ 目录下生成可执行文件 sample_cipher。

2.3 部署到板端

# 使用 SCP 传输到开发板
scp sample/cipher/sample_cipher root@<板端IP>:/tmp/

# 或通过 TFTP 下载
tftp -g -r sample_cipher <板端IP>

相关信息

由于本应用体积很小,可以直接放在 /tmp 运行,无需 SD 卡。

2.4 运行应用

# 添加执行权限
chmod +x /tmp/sample_cipher

# 运行测试用例(推荐顺序)
./sample_cipher 4    # HASH 测试
./sample_cipher 5    # RNG 测试
./sample_cipher 1    # AES 基础测试
./sample_cipher 7    # RSA 加密测试
./sample_cipher 6    # RSA 签名测试
./sample_cipher 2    # 多块批量测试
./sample_cipher 8    # 虚拟地址测试
./sample_cipher 3    # efuse 测试(可能失败)

2.5 预期输出

Index 1: CIPHER(AES 多模式加解密测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_cipher ~~~~~~~~~~~~~~~~~~~
chnid 0x2818049
ECB-AES-256-ORI:
0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
ECB-AES-256-ENC:
0x86 0x3a 0xe9 0x1f 0xd4 0xcf 0x51 0x13 0x2d 0xc3 0xe4 0xed 0xf0 0x9d 0xbc 0x6e
0x86 0x3a 0xe9 0x1f 0xd4 0xcf 0x51 0x13 0x2d 0xc3 0xe4 0xed 0xf0 0x9d 0xbc 0x6e
ECB-AES-256-DEC:
0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
****************** ecb_aes256 test PASS ******************
chnid 0x2818049
CBC-AES-256-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
CBC-AES-256-ENC:
0xe0 0xfa 0xab 0x42 0xd5 0xa5 0x5c 0x18 0xb0 0x13 0x1f 0x47 0x6c 0xa5 0xd0 0x0a
CBC-AES-256-DEC:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** cbc_aes256 test PASS ******************
chnid 0x2818049
CBC-AES-192-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
CBC-AES-192-ENC:
0x69 0x25 0x8f 0xc2 0x8d 0x58 0x8b 0x84 0x67 0x87 0x76 0x02 0x2f 0x9c 0x1c 0x91
CBC-AES-192-DEC:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** cbc_aes192 test PASS ******************
chnid 0x2818049
CBC-AES-128-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
CBC-AES-128-ENC:
0x76 0x49 0xab 0xac 0x81 0x19 0xb2 0x46 0xce 0xe9 0x8e 0x9b 0x12 0xe9 0x19 0x7d
CBC-AES-128-DEC:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** cbc_aes128 test PASS ******************
CFB-AES-128-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
0xae 0x2d 0x8a 0x57 0x1e 0x03 0xac 0x9c 0x9e 0xb7 0x6f 0xac 0x45 0xaf 0x8e 0x51
CFB-AES-128-ENC:
0x3b 0x3f 0xd9 0x2e 0xb7 0x2d 0xad 0x20 0x33 0x34 0x49 0xf8 0xe8 0x3c 0xfb 0x4a
0xc8 0xa6 0x45 0x37 0xa0 0xb3 0xa9 0x3f 0xcd 0xe3 0xcd 0xad 0x9f 0x1c 0xe5 0x8b
CFB-AES-128-DEC
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
0xae 0x2d 0x8a 0x57 0x1e 0x03 0xac 0x9c 0x9e 0xb7 0x6f 0xac 0x45 0xaf 0x8e 0x51
****************** cfb_aes128 test PASS ******************
CTR-AES-128-ORI:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
CTR-AES-128-ENC:
0x51 0x04 0xa1 0x06 0x16 0x8a 0x72 0xd9 0x79 0x0d 0x41 0xee 0x8e 0xda 0xd3 0x88
0xeb 0x2e 0x1e 0xfc 0x46 0xda 0x57 0xc8 0xfc 0xe6 0x30 0xdf 0x91 0x41 0xbe 0x28
CTR-AES-128-DEC
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
****************** ctr_aes128 test PASS ******************

################# FUNCTION 1 RUN SUCCESS #################

成功标志:################# FUNCTION 1 RUN SUCCESS #################,每个子测试显示 ****************** test PASS ******************。

固定与可变部分说明

  • 固定部分:所有 AES 加解密结果(对于固定的测试数据和密钥)
  • 可变部分:chnid(通道 ID,每次运行可能不同)

Index 2: CIPHER-MULTI(多块批量测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_multicipher ~~~~~~~~~~~~~~~~~~~
GOLD
0x76 0x49 0xab 0xac 0x81 0x19 0xb2 0x46 0xce 0xe9 0x8e 0x9b 0x12 0xe9 0x19 0x7d
0x4c 0xbb 0xc8 0x58 0x75 0x6b 0x35 0x81 0x25 0x52 0x9e 0x96 0x98 0xa3 0x8f 0x44
****************** multicipher_aes_cbc_enc test PASS ******************
****************** multicipher_aes_cbc_dec test PASS ******************

################# FUNCTION 2 RUN SUCCESS #################

成功标志:################# FUNCTION 2 RUN SUCCESS #################,加解密结果与 GOLD 标准值匹配。

固定与可变部分说明

  • 固定部分:所有加解密结果(对于固定的测试数据和密钥)
  • 可变部分:无(此测试输出完全固定)

Index 3: CIPHER-EFUSE(efuse CA key 测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_cipher_efuse ~~~~~~~~~~~~~~~~~~~
clear text:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
encrypted text:
0xf0 0xb7 0x6a 0x0c 0x16 0x06 0xd4 0xde 0x79 0xcb 0x5c 0x66 0xd3 0x51 0x0c 0xab
before decrypt:
0xf0 0xb7 0x6a 0x0c 0x16 0x06 0xd4 0xde 0x79 0xcb 0x5c 0x66 0xd3 0x51 0x0c 0xab
decrypted text:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** sample_cipher_efuse_vir test PASS ******************
clear text:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
encrypted text:
0xf0 0xb7 0x6a 0x0c 0x16 0x06 0xd4 0xde 0x79 0xcb 0x5c 0x66 0xd3 0x51 0x0c 0xab
before decrypt:
0xf0 0xb7 0x6a 0x0c 0x16 0x06 0xd4 0xde 0x79 0xcb 0x5c 0x66 0xd3 0x51 0x0c 0xab
decrypted text:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** sample_cipher_efuse_phy test PASS ******************

################# FUNCTION 3 RUN SUCCESS #################

成功标志:################# FUNCTION 3 RUN SUCCESS #################,解密后的明文与原始明文一致。 失败情况:如果 efuse 未烧录 CA key,会失败并显示错误,这是正常现象。

固定与可变部分说明

  • 固定部分:明文、密文和加密结果(对于固定的测试数据和密钥)
  • 可变部分:无(此测试输出完全固定)

Index 4: HASH(哈希摘要测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_hash ~~~~~~~~~~~~~~~~~~~
****************** sha1 test PASS ******************
****************** sha256 test PASS ******************
hmac-Sha1 result:
0xac 0xd4 0x9a 0xdd 0x87 0xba 0x3b 0xe2 0x93 0xdc 0x39 0xc1 0x72 0x06 0xbf 0xab
0x8b 0xde 0x59 0xe7
hmac-Sha1 result:
0xfc 0x66 0xa4 0xcb 0x9e 0xf4 0xe6 0x88 0x19 0xf3 0xe9 0x40 0xae 0xf0 0x7a 0x59
0x5b 0x72 0x7a 0x0f
hmac-Sha1 result:
0x73 0xd3 0x86 0xe3 0x0e 0x42 0x1a 0x27 0xc7 0x53 0xfa 0x45 0xa4 0x78 0x31 0x34
0xc0 0x2a 0x71 0x2b
****************** hmac_sha1 test PASS ******************
hmac-Sha256 result:
0xf1 0x2b 0xdb 0x85 0xbd 0x31 0xaa 0x46 0x84 0x3d 0xca 0x9b 0xde 0x9c 0xbf 0x63
0xba 0x00 0x55 0x02 0x60 0xdb 0xbf 0xc4 0xad 0x03 0xc4 0xdf 0x98 0x82 0x2c 0x57
hmac-Sha256 result:
0xef 0x03 0xc8 0xb5 0x2f 0xfc 0x02 0x3b 0x7a 0x99 0x69 0xf7 0x0e 0xf6 0x03 0x22
0x90 0x2b 0x47 0x98 0x1f 0x9b 0x8f 0xaf 0xfe 0x43 0xe5 0x61 0x33 0x8a 0xe3 0x44
hmac-Sha256 result:
0x4b 0x3b 0xf5 0xa2 0x57 0xb6 0xf9 0x10 0x35 0x9e 0xf4 0x8d 0x8a 0x3b 0xe1 0x6e
0x0a 0x09 0x3a 0x96 0x53 0x51 0x72 0xbd 0x6f 0x82 0x0d 0xbc 0xfb 0x1d 0x9b 0x00
****************** hmac_sha256 test PASS ******************
****************** sha224 test PASS ******************

################# FUNCTION 4 RUN SUCCESS #################

成功标志:################# FUNCTION 4 RUN SUCCESS #################,每个哈希测试显示 ****************** test PASS ******************。

固定与可变部分说明

  • 固定部分:所有 SHA1/SHA256/SHA224 哈希结果和 HMAC 结果(对于固定的测试数据和密钥)
  • 可变部分:无(此测试输出完全固定)

Index 5: RNG(随机数生成测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_rng ~~~~~~~~~~~~~~~~~~~
Random number: 0aeec5a2
Random number: 659363bd
Random number: 1ef83f38
Random number: fdd0708f
Random number: 8765b4e3
Random number: 25ac881e
Random number: 07cee115
Random number: 1c75e1b0
Random number: 88631d1a
Random number: c0e9987e

################# FUNCTION 5 RUN SUCCESS #################

成功标志:################# FUNCTION 5 RUN SUCCESS #################,生成 10 个随机数。

固定与可变部分说明

  • 固定部分:输出格式(10 个随机数)
  • 可变部分:每个随机数的值(每次运行都会不同)

Index 6: RSA-SIGN(RSA 签名测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_rsa_sign ~~~~~~~~~~~~~~~~~~~
****************** rsa_sign_verify test PASS ******************
****************** rsa_sign_verify test PASS ******************
****************** rsa_sign_verify_crt test PASS ******************
****************** rsa_sign_verify_crt test PASS ******************

################# FUNCTION 6 RUN SUCCESS #################

成功标志:################# FUNCTION 6 RUN SUCCESS #################,每个签名验证测试显示 ****************** test PASS ******************。 失败情况:如果显示 FAILED 而非 PASS,表明签名验证失败。

固定与可变部分说明

  • 固定部分:测试数量和通过状态(对于固定的测试密钥)
  • 可变部分:无(此测试输出完全固定)

Index 7: RSA-ENC(RSA 加密测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_rsa_enc ~~~~~~~~~~~~~~~~~~~
****************** pkcs_crt_dec test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pub_enc test PASS ******************
****************** pkcs_pri_enc test PASS ******************

################# FUNCTION 7 RUN SUCCESS #################

成功标志:################# FUNCTION 7 RUN SUCCESS #################,每个加密/解密测试显示 ****************** test PASS ******************。 失败情况:如果显示 FAILED 而非 PASS,表明加解密数据不匹配。

固定与可变部分说明

  • 固定部分:测试数量和通过状态(对于固定的测试密钥)
  • 可变部分:无(此测试输出完全固定)

Index 8: CIPHER-VIA(虚拟地址测试)

~~~~~~~~~~~~~~~~~~~~~ run sample_cipher_via ~~~~~~~~~~~~~~~~~~~
chnid 0x2818049
CBC-AES-128-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
CBC-AES-128-ENC:
0x76 0x49 0xab 0xac 0x81 0x19 0xb2 0x46 0xce 0xe9 0x8e 0x9b 0x12 0xe9 0x19 0x7d
CBC-AES-128-DEC:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
****************** cbc_aes128 test PASS ******************
CFB-AES-128-ORI:
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
0xae 0x2d 0x8a 0x57 0x1e 0x03 0xac 0x9c 0x9e 0xb7 0x6f 0xac 0x45 0xaf 0x8e 0x51
CFB-AES-128-ENC:
0x3b 0x3f 0xd9 0x2e 0xb7 0x2d 0xad 0x20 0x33 0x34 0x49 0xf8 0xe8 0x3c 0xfb 0x4a
0xc8 0xa6 0x45 0x37 0xa0 0xb3 0xa9 0x3f 0xcd 0xe3 0xcd 0xad 0x9f 0x1c 0xe5 0x8b
CFB-AES-128-DEC
0x6b 0xc1 0xbe 0xe2 0x2e 0x40 0x9f 0x96 0xe9 0x3d 0x7e 0x11 0x73 0x93 0x17 0x2a
0xae 0x2d 0x8a 0x57 0x1e 0x03 0xac 0x9c 0x9e 0xb7 0x6f 0xac 0x45 0xaf 0x8e 0x51
****************** cfb_aes128 test PASS ******************
CTR-AES-128-ORI:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
CTR-AES-128-ENC:
0x51 0x04 0xa1 0x06 0x16 0x8a 0x72 0xd9 0x79 0x0d 0x41 0xee 0x8e 0xda 0xd3 0x88
0xeb 0x2e 0x1e 0xfc 0x46 0xda 0x57 0xc8 0xfc 0xe6 0x30 0xdf 0x91 0x41 0xbe 0x28
CTR-AES-128-DEC
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f
****************** ctr_aes128 test PASS ******************

################# FUNCTION 8 RUN SUCCESS #################

成功标志:################# FUNCTION 8 RUN SUCCESS #################,虚拟地址模式加解密成功。 失败情况:如果显示 FAILED 而非 PASS,表明虚拟地址模式数据不匹配。

固定与可变部分说明

  • 固定部分:所有 AES 加解密结果(对于固定的测试数据和密钥)
  • 可变部分:chnid(通道 ID,每次运行可能不同)

3 内部执行逻辑详解

3.1 应用架构

本应用采用简单的命令行参数模式,通过 main() 函数的参数选择不同的测试用例:

int main(int argc, char *argv[])
{
    int index = 0;

    if (argc < 2) {
        usage();  // 打印用法说明
        return -1;
    }

    index = atoi(argv[1]);

    switch(index) {
        case 1: sample_cipher_test();       break;  // AES 基础测试
        case 2: sample_cipher_mult_test();  break;  // 多块批量测试
        case 3: sample_cipher_ca_test();    break;  // efuse CA key 测试
        case 4: sample_hash_test();         break;  // HASH 测试
        case 5: sample_rng_test();          break;  // RNG 测试
        case 6: sample_rsa_sign_test();     break;  // RSA 签名测试
        case 7: sample_rsa_enc_test();      break;  // RSA 加密测试
        case 8: sample_cipher_via_test();   break;  // 虚拟地址测试
        default: usage(); break;
    }

    return 0;
}

3.2 AES 加解密流程

AES 加解密测试(index 1)演示了 ECB/CBC/CTR 三种工作模式的加解密操作:

// 步骤 1:初始化 cipher 模块
xmedia_cipher_init();

// 步骤 2:创建 cipher 通道
xmedia_cipher_create_handle(&chnid);

// 步骤 3:配置 cipher 参数
xmedia_cipher_ctrl ctrl;
ctrl.alg = XMEDIA_CIPHER_ALG_AES;              // 算法:AES
ctrl.mode = XMEDIA_CIPHER_WORK_MODE_CBC;      // 工作模式:CBC
ctrl.aes_ctrl.bit_width = XMEDIA_CIPHER_BIT_WIDTH_128BIT;
ctrl.aes_ctrl.key_len = XMEDIA_CIPHER_KEY_AES_128BIT;
memcpy(ctrl.aes_ctrl.key, aes_key, 16);        // 密钥
memcpy(ctrl.aes_ctrl.iv, aes_iv, 16);         // IV(CBC/CTR 需要)

xmedia_cipher_config_handle(chnid, &ctrl);

// 步骤 4:分配输入输出缓冲区(MMZ 物理连续内存)
input_phy  = xmedia_mmz_alloc(NULL, "CIPHER_BufIn",  data_len);
input_vir  = xmedia_mmz_map(input_phy, data_len, cached);
output_phy = xmedia_mmz_alloc(NULL, "CIPHER_BufOut", data_len);
output_vir = xmedia_mmz_map(output_phy, data_len, cached);

// 步骤 5:加密
memcpy(input_vir, aes_src, data_len);
xmedia_cipher_encrypt(chnid, input_phy, output_phy, data_len);

// 步骤 6:解密
xmedia_cipher_decrypt(chnid, output_phy, input_phy, data_len);

// 步骤 7:验证
if (memcmp(input_vir, aes_src, data_len) == 0) {
    printf("memcmp decrypt and src OK!\n");
}

// 步骤 8:清理资源
xmedia_mmz_unmap(input_vir);
xmedia_mmz_free(input_phy);
xmedia_cipher_destroy_handle(chnid);
xmedia_cipher_exit();

3.3 RSA 签名与验签流程

RSA 签名测试(index 6)演示了使用 RSA 私钥签名、公钥验签的完整流程:

// 步骤 1:初始化 cipher 模块
xmedia_cipher_init();

// 步骤 2:创建 cipher 通道
xmedia_cipher_create_handle(&chnid);

// 步骤 3:配置 RSA 参数
xmedia_cipher_ctrl ctrl;
ctrl.alg = XMEDIA_CIPHER_ALG_RSA;
ctrl.rsa_ctrl.rsa_len = XMEDIA_CIPHER_RSA_2048;  // 2048 位 RSA
// ... 配置公钥/私钥 ...

xmedia_cipher_config_handle(chnid, &ctrl);

// 步骤 4:签名(私钥)
xmedia_cipher_sign(chnid, digest_phy, signature_phy);

// 步骤 5:验签(公钥)
xmedia_cipher_verify(chnid, digest_phy, signature_phy);

3.4 efuse CA 密钥测试

efuse CA 密钥测试(index 3)演示了从芯片 efuse 读取 CA 密钥进行加解密:

// 配置 cipher 使用 efuse CA 密钥
ctrl.key_by_ca = XMEDIA_TRUE;  // 使用 efuse 中的 CA 密钥

xmedia_cipher_config_handle(chnid, &ctrl);

// 后续加解密流程与普通 AES 相同
xmedia_cipher_encrypt(chnid, input_phy, output_phy, data_len);

注意

如果 efuse 未烧录 CA 密钥,此测试会失败,这是正常现象。

3.5 HASH 摘要与随机数生成

HASH 测试(index 4)和 RNG 测试(index 5)相对简单:

// HASH 摘要
xmedia_cipher_init();
xmedia_cipher_create_handle(&chnid);

ctrl.alg = XMEDIA_CIPHER_ALG_SHA256;
xmedia_cipher_config_handle(chnid, &ctrl);

xmedia_cipher_hash(chnid, input_phy, input_len, output_phy);

// RNG 随机数生成
xmedia_cipher_init();
xmedia_cipher_create_handle(&chnid);

xmedia_cipher_rng(chnid, output_phy, output_len);

3.6 多块批量处理

多块批量测试(index 2)演示了一次性处理多块数据:

// 分配大缓冲区
data_len = 32 * 10;  // 10 块,每块 32 字节
input_phy  = xmedia_mmz_alloc(NULL, "CIPHER_BufIn",  data_len);
output_phy = xmedia_mmz_alloc(NULL, "CIPHER_BufOut", data_len);

// 一次性加密/解密
xmedia_cipher_encrypt(chnid, input_phy, output_phy, data_len);
xmedia_cipher_decrypt(chnid, output_phy, input_phy, data_len);

3.7 虚拟地址模式

虚拟地址测试(index 8)演示了使用虚拟地址进行加解密:

// 使用虚拟地址而非物理地址
xmedia_cipher_encrypt_via(chnid, input_vir, output_vir, data_len);
xmedia_cipher_decrypt_via(chnid, output_vir, input_vir, data_len);

提示

虚拟地址模式更方便使用,但可能涉及缓存一致性问题。

4 关键编程要点

4.1 MMZ 内存管理

加解密操作需要使用物理连续内存(MMZ),不能使用普通的 malloc():

// 分配物理内存
xmedia_ulong phy = xmedia_mmz_alloc(NULL, "name", size);

// 映射到虚拟地址空间
void *vir = xmedia_mmz_map(phy, size, cached);

// 使用完毕后
xmedia_mmz_unmap(vir);
xmedia_mmz_free(phy);

4.2 IV 向量的使用

CBC、CTR、CFB、OFB 模式需要 IV(初始化向量),ECB 模式不需要:

if (mode != XMEDIA_CIPHER_WORK_MODE_ECB) {
    memcpy(ctrl.aes_ctrl.iv, aes_iv, AES_IV_LENGTH);
}

4.3 密钥长度与数据位宽

ctrl.aes_ctrl.bit_width = XMEDIA_CIPHER_BIT_WIDTH_128BIT;  // 固定 128 位
ctrl.aes_ctrl.key_len = XMEDIA_CIPHER_KEY_AES_128BIT;      // 128 位密钥
// 或 XMEDIA_CIPHER_KEY_AES_256BIT                         // 256 位密钥

4.4 错误处理

每个 API 调用都应检查返回值:

ret = xmedia_cipher_init();
if (XMEDIA_SUCCESS != ret) {
    printf("cipher init failed!\n");
    return ret;
}

5 常见问题排查

问题可能原因解决方案
测试 3 失败efuse 未烧 CA 密钥正常现象,不影响其他功能
加密结果不一致IV 未正确设置CBC/CTR 模式必须设置正确的 IV
MMZ 分配失败系统内存不足释放其他进程占用的内存
RSA 验签失败公钥/私钥不匹配检查密钥配置是否正确

6 参考链接

  • MPP 媒体处理平台
  • SDK 编译指南
  • LSADC ADC 采集应用
  • 低功耗应用
在 GitHub 上编辑此页
Next
02 ADC 采集应用