Crypto Engine - 算法引擎
Crypto是内核一个独立的子系统,源码在kernel/crypto下,它实现了对算法的统一管理,并提供出统一的数据处理接口给其他子系统使用;
因此基于这套框架,我们不仅可以使用kernel已有的crypto算法对数据做转换,还能自行扩展添加算法,整个算法框架如下。
它实现了对称加解密,非对称加解密,认证加解密,hash,Hmac,伪随机数生成算法和压缩算法。
CE 按照Linux内核中的 Crypto 框架设计,在应用层能够和OpenSSL完美配合,很容易扩展完成多种硬件算法的支持。整个软件架构的关系图如下:
其中,[App] 是指用户的应用程序;[Crypto框架]是Linux内核自带的加密算法管理框架;紫色区域需要我们开发或修改,它们分别是:
-
Demo,基于OpenSSL的示例代码。
-
OpenSSL,一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面。
-
Crypto用户态接口,内核crypto框架和用户态的接口部分。
-
SS Driver即CE Driver,负责操作CE硬件控制器。
可以看到,和用户应用程序直接打交道的是OpenSSL标准接口(将在第4章详述),这样App也很容易嵌入硬件的加解密功能。
需要指出,标准的OpenSSL还不能直接和内核中的Crypto框架互通,需要在OpenSSL中注册一个引擎插件(af_alg插件),并在App中要配置OpenSSL使用af_alg引擎。
由于某 些应用场景中,不想使用OpenSSL标准接口来操作CE的接口,因为openssl编译出来的库比较大,不适合小内存方案。因此CE驱动还提供CE设备节点方式供用户空间使用,如图所示,通过CE的设备节点方式不经过Crypto的框架,直接调用加解密接口。
模块配置
驱动配置
Linux 支持多种加解密接口:
加解密接口 | 备注 |
---|---|
Linux内核源生加解密接口 | C语言实现 |
ARM加解密接口 | 采用ARM的加速指令实现 |
CE加解密接口 | 加解密硬件加速模块 |
Linux 内核源生加解密接口
在这里选择自己需要的 API 即可,内核源生加解密接口是软件实现的支持的范围最广
Cryptographic API ->
< > CBC support
-*- CTR support
...
ARM加解密接口
如果数据块是以8K为单位,或 8K 以下,可以采用 ARM 的加速指令这比CE模块的性能更加有优势,需要注意的是如果开启 ARM 的加速指令,必须关闭 CE 的配置,因为CE的配置优先级更加高。
[*] ARM64 Accelerated Cryptographic Algorithms --->
< > SHA-224/SHA-256 digest algorithm for arm64
< > SHA-384/SHA-512 digest algorithm for arm64
< > SHA-1 digest algorithm (ARMv8 Crypto Extensions)
...
ARM OpenSSL 加解密接口
这里以选择使用 NEON 加速 AES 类算法为示例,介绍如何在用户空间通过 OpenSSL 库使用 ARM 指令优化的加解密接口。
首先勾选 AES in ECB/CBC/CTR/XTS modes using NEON instructions
模块开启 ARM 指令优化
[*] ARM64 Accelerated Cryptographic Algorithms --->
<*> AES in ECB/CBC/CTR/XTS modes using NEON instructions
然后开启 NET 选项
然后配置 Networking options
Networking support ->
Networking options ->
<*> Unix domain sockets
打开用户接口
CONFIG_CRYPTO_USER_API
CONFIG_CRYPTO_USER_API_HASH
CONFIG_CRYPTO_USER_API_SKCIPHER
CONFIG_CRYPTO_USER_API_RNG
CONFIG_CRYPTO_USER_API_AEAD
同时关闭硬件 CE
CE 原生调用接口
勾选
CE Drivers ->
< > Support socket AF_ALG API for CE
<*> CE support the systemcall interface for user api
CE OpenSSL 调用方法
需要勾选 Support socket AF_ALG API for CE
CE Drivers ->
<*> Support socket AF_ALG API for CE
< > CE support the systemcall interface for user api
同时配置 Linux 内核的 Sockets 支持,开启 NET 选项
然后配置 Networking options
Networking support ->
Networking options ->
<*> Unix domain sockets