文章目录
1、Linux的aarch64 crypto配置介绍
2、Linux的aarch64 crypto的总结:
(1)、开启ARM-CE
(2)、开启ARM-NEON
(3)、纯软实现
3、比较硬件实现和纯软实现
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的实现,方法也类似:
添加威♥:sami01_2023,回复ARM中文,领取ARM中文手册