Linux Kernel aarch64 Crypto原理和框架介绍

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈


相关推荐:
The Armv8 Cryptographic Extension在Linux Kernel中的应用
Armv8 Cryptographic Extension介绍
Linux kernel内核调用crypto算法的方法
Linux Kernel aarch64的ARM-CE aes-ecb的底层代码解析


说明: 在无特别的说明下,本文讲述得都是armv8-aarch64体系、linux kernel 4.14 arm64软件环境!

在这里插入图片描述

1、Linux的aarch64 crypto配置介绍

开启ARM-CE或ARM-Neon,编译aes-glue.c文件,aes-glue.c是Linux kernel crypto aarch32/64下ARM-CE或ARM-NEON加解密调用的顶级文件。

  • CONFIG_CRYPTO_AES_ARM64_CE_BLK
  • CONFIG_CRYPTO_AES_ARM64_NEON_BLK

注意,如果开启的是ARM-CE,则加入USE_V8_CRYPTO_EXTENSIONS宏定义
在这里插入图片描述
在aes-glue.c中,使用USE_V8_CRYPTO_EXTENSIONS宏控制的底层aes的链接.

#ifdef USE_V8_CRYPTO_EXTENSIONS
#define MODE			"ce"
#define PRIO			300
#define aes_setkey		ce_aes_setkey
#define aes_expandkey		ce_aes_expandkey
#define aes_ecb_encrypt		ce_aes_ecb_encrypt
#define aes_ecb_decrypt		ce_aes_ecb_decrypt
#define aes_cbc_encrypt		ce_aes_cbc_encrypt
#define aes_cbc_decrypt		ce_aes_cbc_decrypt
#define aes_ctr_encrypt		ce_aes_ctr_encrypt
#define aes_xts_encrypt		ce_aes_xts_encrypt
#define aes_xts_decrypt		ce_aes_xts_decrypt
MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions");
#else
#define MODE			"neon"
#define PRIO			200
#define aes_setkey		crypto_aes_set_key
#define aes_expandkey		crypto_aes_expand_key
#define aes_ecb_encrypt		neon_aes_ecb_encrypt
#define aes_ecb_decrypt		neon_aes_ecb_decrypt
#define aes_cbc_encrypt		neon_aes_cbc_encrypt
#define aes_cbc_decrypt		neon_aes_cbc_decrypt
#define aes_ctr_encrypt		neon_aes_ctr_encrypt
#define aes_xts_encrypt		neon_aes_xts_encrypt
#define aes_xts_decrypt		neon_aes_xts_decrypt
MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 NEON");
MODULE_ALIAS_CRYPTO("ecb(aes)");
MODULE_ALIAS_CRYPTO("cbc(aes)");
MODULE_ALIAS_CRYPTO("ctr(aes)");
MODULE_ALIAS_CRYPTO("xts(aes)");
#endif

在Kconfig中可以看出,在开启CONFIG_CRYPTO_AES_ARM64_CE_BLK或CONFIG_CRYPTO_AES_ARM64_NEON_BLK,还需要再次选择底层的算法。

config CRYPTO_AES_ARM64_CE_BLK
	tristate "AES in ECB/CBC/CTR/XTS modes using ARMv8 Crypto Extensions"
	depends on KERNEL_MODE_NEON
	select CRYPTO_BLKCIPHER
	select CRYPTO_AES_ARM64_CE
	select CRYPTO_AES_ARM64
	select CRYPTO_SIMD
config CRYPTO_AES_ARM64_NEON_BLK
	tristate "AES in ECB/CBC/CTR/XTS modes using NEON instructions"
	depends on KERNEL_MODE_NEON
	select CRYPTO_BLKCIPHER
	select CRYPTO_AES_ARM64
	select CRYPTO_AES
	select CRYPTO_SIMD

如选择ARM-CE的aes,除了打开CONFIG_CRYPTO_AES_ARM64_CE_BLK,还需要再次开启CONFIG_CRYPTO_AES_ARM64_CE,编译aes-ce-cipher.S,该文件实现了ARM-CE的底层逻辑;

obj-$(CONFIG_CRYPTO_AES_ARM64_CE) += aes-ce-cipher.o
CFLAGS_aes-ce-cipher.o += -march=armv8-a+crypto

如选择ARM-NEON的aes,除了打开CONFIG_CRYPTO_AES_ARM64_NEON_BLK,不需要在额外增加别的宏了,因为在aes-neon.S中已经实现了ARM-NEON的底层逻辑;

obj-$(CONFIG_CRYPTO_AES_ARM64_NEON_BLK) += aes-neon-blk.o
aes-neon-blk-y := aes-glue-neon.o aes-neon.o
2、Linux的aarch64 crypto的总结:

在这里插入图片描述

(1)、开启ARM-CE

如果开启ARM-CE,则需要打开:
CONFIG_CRYPTO_AES_ARM64_CE_BLK
CONFIG_CRYPTO_AES_ARM64_CE

接口实现:aes-glue.c
底层实现:aes-modes.S

接口形式:

#define MODE			"ce"
(同步)
.cra_name		= "__ecb-aes-" MODE,
.cra_name		= "__cbc-aes-" MODE,
.cra_name		= "__ctr-aes-" MODE,
.cra_name		= "__xts-aes-" MODE,
(异步)
.cra_driver_name	= "ecb-aes-" MODE,
.cra_driver_name	= "cbc-aes-" MODE,
.cra_driver_name	= "ctr-aes-" MODE,
.cra_driver_name	= "xts-aes-" MODE,
(2)、开启ARM-NEON

如果开启ARM-NEON,则需要打开:
CONFIG_CRYPTO_AES_ARM64_NEON_BLK

接口实现:aes-glue.c
底层实现:aes-neon.S

接口形式:

#define MODE			"neon"
(同步)
.cra_name		= "__ecb-aes-" MODE,
.cra_name		= "__cbc-aes-" MODE,
.cra_name		= "__ctr-aes-" MODE,
.cra_name		= "__xts-aes-" MODE,
(异步)
.cra_driver_name	= "ecb-aes-" MODE,
.cra_driver_name	= "cbc-aes-" MODE,
.cra_driver_name	= "ctr-aes-" MODE,
.cra_driver_name	= "xts-aes-" MODE,
(3)、纯软实现

如果以上都不开,则走纯软实现

接口实现:
linux/crypto$ ls ecb.c cbc.c ctr.c xts.c
cbc.c ctr.c ecb.c xts.c

接口形式:

.name = "ecb",
.name = "cbc",
.name = "ctr",
.name = "xts",
3、比较硬件实现和纯软实现

在这里插入图片描述
其实如果是芯片SOC的实现,方法也类似:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码改变世界ctw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值