Edit online

应用编程

4 Dec 2024
Read time: 4 minute(s)

用户空间编程使用 CE 时,根据使用场景和需求的不同,有几层 API 可以选择:

  • AF_ALG Socket API

  • Libkcapi API

  • OpenSSL API


ce_userpace_api

1. 用户空间 API 对接

AF_ALG API

相关 API 可参考头文件 linux/if_alg.h

要使用内核提供的算法和驱动,需要知道对应的算法名字。可通过下列命令获取:
cat /proc/crypto
例如:
name         : ctr(aes)
driver       : ctr-aes-aic
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
internal     : no
type         : skcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
chunksize    : 16
walksize     : 16

name         : cbc(aes)
driver       : cbc-aes-aic
module       : kernel
priority     : 400
refcnt       : 1
selftest     : passed
internal     : no
type         : skcipher
async        : yes
blocksize    : 16
min keysize  : 16
max keysize  : 32
ivsize       : 16
chunksize    : 16
walksize     : 16

......

这里的 /proc/crypto 是目标平台上的文件

AF_ALG API 的特点:

  • 效率高

  • 接口灵活

  • 较为复杂

Libkcapi API

SDK 已经提供对应的 libkcapi 库,默认配置已经支持

  • 对称密钥算法

  • 非对称密钥算法

  • 消息摘要算法

  • 随机数读取

如果需要修改对应包的编译配置,可在 Luban SDK 顶层目录执行 make menuconfigmake m

配置界面的索引如下:
Third-party packages  --->
    -*- libkcapi  --->
        [*]   use prebuilt binary instead of building from source
        [*]   enable asym algorithm support
        [*]   build enc application
        [*]   build hasher application
        [*]   build rng read application
        [*]   build speed-test program
        [*]   build test program

Libkcapi 的特点:

  • 接口简单

  • 效率高

基于 Libkcapi API 的参考示例 source/artinchip/test-ce/kcapi/

OpenSSL API

Luban SDK 通过 OpenSSL 的 Engine 机制,以实现 Engine 库的方式,已经完成了对 OpenSSL 的对接。 无论是通过 OpenSSL 的命令行,还是通过使用库编程,都可以使用到 CE。

Engine 库有两个,根据不同的目的进行使用。

Engine 库和路径 说明
aic engine usr/lib/libengine_aic.so 实现 CE 所提供的对称密钥算法、RSA 算法和消息摘要算法该 Engine 实现的都是标准算法。
huk engine usr/lib/libengine_huk.so 实现了 HUK 保护的 AES 算法,可用于本地数据保护。使用该 Engine 时,输入的密钥会被 HUK 进行一次解密,然后才用于 AES 加解密。HUK 每一颗芯片不同,因此使用该 Engine 加密后的数据,仅当前平台可解密。

命令行中使用指定 Engine 的示例:

openssl enc -engine aic -p -nosalt -nopad -aes-128-ecb -e -K 0123 -in data.bin -out enc.bin

上述示例中,通过 -engine aic 指定了使用 aic engine。

当在 openssl.cnf 文件中配置了默认的 Engine 之后,命令行中可以忽略 -engine 参数。 具体配置可参考 /etc/ssl/openssl_aic.cnf 文件。

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
aic = aic_section

[aic_section]
engine_id = aic
dynamic_path = /usr/lib/libengine_aic.so
default_algorithms = CIPHERS,DIGESTS,RSA

Libopenssl API 的特点:

  • 功能强大

  • 调用效率稍差

基于 Libopenssl API 的参考示例: source/artinchip/test-ce/openssl/