跳转至

security_subsys 快速入门

1. 概述与作用

security_subsys 是 Hi3516CV610 安全子系统的密码学示例合集, 可执行文件sample_cipher 通过 <index> 分发 11 个子样例,覆盖对称密码(AES / SM4,含 ECB/CBC/CFB/OFB/CTR/GCM/CCM)、消息认证码(CBC-MAC / CMAC / HMAC)、散列(SHA256 / SM3)、密钥派生(PBKDF2)、真随机数(TRNG)、非对称密码(RSA-3072/4096、ECC brainpoolP256r1/P384r1/P512r1、SM2)以及密钥管理(KM/KLAD/RootKey/KDF/OTP)。每个子样例在内存中完成加解密 / 签名验签 / hash 比对。

适用对象:需要在产品中调用海思 Cipher 硬件加速做加解密、签名、hash、随机数生成,或验证 KLAD/RootKey/KDF 密钥派生链路的工程师。

2. 执行准备

在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。

2.1 编译

cd samples/mpp/security_subsys && make

编译成功之后,在当前目录下会生成一个sample_cipher的可执行文件,可以放社区支持的开发板上运行。

2.2 加载 KO

ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本,load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。

由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令为:

./load3516cv610_20s_debug -i

可以通过-h命令查看具体用法:

./load3516cv610_20s_debug -h
Usage:  ./load3516cv610_20s_debug [-option] [-sensor0~1] 
options:
    -i                       insert modules
    -r                       remove modules
    -a                       remove modules first, then insert modules
    -sensor0~1 sensor_name   config sensor type    [default: hy006_3814_0011]
    -mmz_start               config MMZ start addr [default: 0x42000000]
    -mmz_size                config MMZ mem size [unit: M, default: 96M]
    -ir_auto                 config ir_auto enable [default: 0]
    -profile                 config sys_profile [default: 0]
    -h                       help information
Available sensors:hy006_3814_0011 bt1120/bt656/bt601
for example: ./load3516cv610_20s_debug -i -sensor0 hy006_3814_0011 -sensor1 hy006_3814_0011 -mmz_start 0x42000000 -mmz_size 96M -ir_auto 1

如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。

如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于/ko目录下,在系统启动后会自动加载这些ko。

由于加载脚本默认没有加载ot_otp.ko,因此需要手动加载ot_otp.ko(或者修改加载脚本load3516cv610_20s_debug),加载命令为:

# 此处假设使用的是社区发布的镜像,ko都已经位于单板的/ko目录,如果放置在其他目录,请到ko所在的目录执行
cd /ko
insmod ot_otp.ko

2.3 运行时依赖

在运行样例前,需要提前准备:

  • 指定运行时依赖的so库路径

MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:

```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```

如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。

  • 启动MPP服务

当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:

```shell
cd samples/mpp/sdk_server && make
```

在单板上执行./sdk_server &即可启动MPP服务。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于/usr/bin目录下,并在系统启动时会自动启动sdk_server。

2.4 运行样例

调用语法为 ./sample_cipher <index>,index 为单数字 1–11,可以执行./sample_cipher -h查看用法和支持的算法列表。

image-20260807174647750

3. 支持的 Case 列表

index 算法名称 算法描述 所在文件路径
1 sample_symc_clearkey aes算法cbc,ofb,cfb,ctr,ccm和gcm模式使用明文key进行加解密运算 sample/security_subsys/sample_symc_clearkey.c
2 sample_symc_rootkey aes算法cbc,ofb,cfb,ctr模式使用rootkey进行加解密运算 sample/security_subsys/sample_symc_rootkey.c
3 sample_symc_mac 基于对称密钥分组加密算法的消息认证码 sample/security_subsys/sample_symc_mac.c
4 sample_hash hash克隆,单包数据计算,多次update,hmac计算 sample/security_subsys/sample_hash.c
5 sample_pbkdf2 使用sha224,sha256,sm3派生密钥 sample/security_subsys/sample_pbkdf2.c
6 sample_trng 生成随机数 sample/security_subsys/sample_trng.c
7 sample_rsa rsa公钥加密、私钥解密,私钥签名、公钥验证 sample/security_subsys/sample_rsa.c
8 sample_ecc ECC公私钥对生成,检查点在ECC曲线上,ECDH密钥交换,私钥签名、公钥验证 sample/security_subsys/sample_ecc.c
9 sample_sm4 sm4算法使用clearkey和rootkey进行加解密 sample/security_subsys/sample_sm4.c
10 sample_sm3 hash克隆,单包数据计算,多次update,hmac-sm3计算 sample/security_subsys/sample_sm3.c
11 sample_sm2 SM2公钥加密、私钥解密,签名验证、检查点在ECC曲线上 sample/security_subsys/sample_sm2.c

对完整的11个case说明如下:

3.1 case 1

调用命令

./sample_cipher 1

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.2 case 2

调用命令

./sample_cipher 2

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.3 case 3

调用命令

./sample_cipher 3

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.4 case 4

调用命令

./sample_cipher 4

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.5 case 5

调用命令

./sample_cipher 5

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.6 case 6

调用命令

./sample_cipher 6

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.7 case 7

调用命令

./sample_cipher 7

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。case 7 在未填密钥前预期失败:打印 Please implement this function to get rsa3072 key!!!。需修改 sample_rsa.c 中 get_rsa3072_key 和 get_rsa4096_key(实现位于 sample_utils.c),填入真实 priv_key 和pub_key后重编再次运行,可参考第四章节生成公私钥对。

3.8 case 8

调用命令

./sample_cipher 8

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.9 case 9

调用命令

./sample_cipher 9

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.10 case 10

调用命令

./sample_cipher 10

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

3.11 case 11

调用命令

./sample_cipher 11

运行截图

Alt text

输出文件

无文件输出,全部在内存中比对结果。

控制台日志

以 ************ test <algo> ************ 起,成功时打印 ************ test <algo> success ************,失败时打印 ************ test <algo> failed ************。

正确性判断

控制台无 Error: 行,且出现 test <algo> success。

4. 其他

生成rsa公私钥命令参考

4.1 生成512字节rsa私钥

openssl genrsa -out private.pem 4096

4.2 从私钥中提取对应的公钥

openssl rsa -in private.pem -pubout -out public.pem

4.3 打印rsa公私钥

xxd -i private.pem

xxd -i public.pem