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 | 名称 | 测试指令 | 预期现象(成功) | 失败可能原因 |
|---|---|---|---|---|
| 1 | CIPHER | ./sample_cipher 1 | AES CBC/CTR/ECB 加解密后与明文比对一致 → TEST_END_PASS | 加解密/比对失败 |
| 2 | CIPHER-MULTI | ./sample_cipher 2 | 多块批量 AES 各块比对一致 → PASS | 同上 |
| 3 | CIPHER-EFUSE | ./sample_cipher 3 | efuse CA key 加解密比对一致 → PASS | efuse 未烧 CA key(正常) |
| 4 | HASH | ./sample_cipher 4 | 输出固定长度摘要 → PASS | — |
| 5 | RNG | ./sample_cipher 5 | 打印随机字节 → PASS | — |
| 6 | RSA-SIGN | ./sample_cipher 6 | RSA 签名+验签通过 → PASS | 验签失败 |
| 7 | RSA-ENC | ./sample_cipher 7 | 公钥加密/私钥解密比对一致 → PASS | 比对失败 |
| 8 | CIPHER-VIA | ./sample_cipher 8 | 虚拟地址版 AES 比对一致 → PASS | 比对失败 |
1.4 目录结构
sample/cipher/
├── Makefile # 构建脚本
└── sample_cipher.c # 主程序(含所有测试用例)2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- 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 验签失败 | 公钥/私钥不匹配 | 检查密钥配置是否正确 |
