介绍

架构

硬件加密引擎驱动程序遵循 Linux 的加密子系统。Linux 加密子系统提供了一套丰富的加密算法,以及其他数据转换机制和调用这些机制的方法。Linux 加密提供了用于内核接口和用户空间的 API。

加密引擎软件架构如下图所示。

../../rst_linux/3_crypto_engine/figures/crypto_engine_software_arch.svg

加密引擎软件架构包含以下几个部分:

  • 加密驱动程序 加密驱动程序。它包含两个部分:

    • hash: 加密哈希函数。

    • AES: 加密 AES 函数。

  • 加密核心 加密子系统核心驱动程序。

    • Hash: 加密核心哈希函数算法。

    • Skcipher: 加密核心对称密钥密码算法。

    • AEAD: 加密核心带关联数据的认证加密算法。

    • Cryptographic API: 用于算法的加密 API(即低级 API)。

  • 应用 使用用户空间。

参考 crypto v5.4 或者 crypto v6.6 以获得更多细节。

实现

加密引擎驱动程序实现在以下文件:

文件

描述

<linux>/drivers/rtkdrivers/crypto/Kconfig

加密引擎驱动程序 Kconfig

<linux>/drivers/rtkdrivers/crypto/Makefile

加密引擎驱动程序 Makefile

<linux>/drivers/rtkdrivers/crypto/realtek-hash.c

哈希函数

<linux>/drivers/rtkdrivers/crypto/realtek-hash.h

哈希相关的函数声明、宏定义、结构定义以及其他引用的头文件

<linux>/drivers/rtkdrivers/crypto/realtek-aes.c

AES函数

<linux>/drivers/rtkdrivers/crypto/realtek-aes.h

AES相关的函数声明、宏定义、结构定义以及其他引用的头文件

<linux>/drivers/rtkdrivers/crypto/realtek-crypto.h

加密通用相关的函数声明、宏定义、结构定义以及其他引用的头文件

配置

设备树配置

哈希设备树节点:

hash: hash@400C8000 {
   compatible = "realtek,ameba-hash";
   reg = <0x400C8000 0x2000>;
   interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
};

哈希的设备树配置如下所列。

属性

描述

可配置

compatible

哈希驱动的描述。默认值: realtek, ameba-hash

reg

哈希设备的硬件地址和大小。默认值: <0x400C8000 0x2000>

interrupts

哈希设备的GIC编号。默认值: <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>

AES 设备树节点:

aes: aes@400C0000 {
   compatible = "realtek,amebad2-aes";
   reg = <0x400C0000 0x2000>;
   interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
};

AES 的设备树配置如下所列。

属性

描述

可配置

compatible

AES驱动的描述,默认值: realtek,ameba-aes.

reg

AES设备的硬件地址和大小。 默认值: <0x400C0000 0x2000>

interrupts

AES设备的GIC编号。默认值: <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>

编译配置

按需求选择 Device Drivers > Drivers for Realtek > Crypto Drivers > Hash driver and/or AES driver

../../rst_linux/3_crypto_engine/figures/build_config_crypto_drivers.png
../../rst_linux/3_crypto_engine/figures/build_config_hash_aes.png

APIs

用户空间 APIs

无。

内核空间 APIs

哈希 APIs

描述

crypto_register_ahash

向加密子系统注册异步哈希算法

1crypto_unregister_ahash

从加密子系统注销异步哈希算法

crypto_alloc_ahash

分配一个异步哈希密码句柄

crypto_free_ahash

清零并释放异步哈希句柄

ahash_request_alloc

分配请求数据结构

ahash_request_free

清零并释放请求数据结构

ahash_request_set_callback

设置异步回调函数

ahash_request_set_crypt

设置数据缓存

crypto_ahash_setkey

为加密句柄设置密钥

crypto_ahash_init

初始化消息摘要句柄

crypto_ahash_update

将数据添加到消息摘要进行处理

crypto_ahash_final

计算消息摘要

crypto_ahash_finup

更新并最终确定消息摘要

crypto_ahash_digest

计算缓冲区的消息摘要

crypto_ahash_export

提取当前消息摘要状态

crypto_ahash_import

导入消息摘要状态

对称密钥加密接口

描述

crypto_register_algs

将一系列加密算法注册到加密子系统

crypto_register_alg

将一个加密算法注册到加密子系统

crypto_unregister_algs

从加密子系统中注销一系列加密算法

crypto_unregister_alg

从加密子系统中注销一个加密算法

crypto_alloc_skcipher

分配一个对称密钥加密句柄

crypto_free_skcipher

将加密句柄归零并释放

skcipher_request_alloc

分配请求数据结构

skcipher_request_free

将请求数据结构归零并释放

crypto_skcipher_setkey

为加密设置密钥

skcipher_request_set_callback

设置加密回调函数

skcipher_request_set_crypt

设置数据缓存

crypto_skcipher_encrypt

执行加密操作

crypto_skcipher_decrypt

执行解密操作

AEAD 加密接口

描述

crypto_register_aead

向加密子系统注册一个 AEAD(带关联数据的认证加密)密码算法

crypto_unregister_aead

从加密子系统中注销一个 AEAD 密码算法

crypto_alloc_aead

分配一个 AEAD 密钥密码句柄

crypto_free_aead

将 AEAD 句柄清零并释放

aead_request_alloc

分配请求数据结构

aead_request_free

将请求数据结构清零并释放

crypto_aead_setkey

为 AEAD 密码设置密钥

aead_request_set_callback

设置 AEAD 回调函数

aead_request_set_crypt

设置数据缓存

aead_request_set_ad

设置关联数据信息

crypto_aead_encrypt

执行 AEAD 加密操作

crypto_aead_decrypt

执行 AEAD 解密操作

内核空间的加密演示位于 <test>/crypto