https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/arm/crypto
Auf dieser Grundlage werde ich kurz zusammenfassen, bis verschiedene Krypto-Implementierungen aufgerufen werden.
In ARM arch werden wir zusammenfassen, bis die NEON-Implementierung von SHA1 aktiviert und aufrufbereit ist.
Außerdem ** werde ich den Inhalt der Implementierung von NEON / SIMD ** nicht diskutieren.
KConfig
Es gibt verschiedene Kernelkonfigurationen in arch / arm / crypy / Kconfig.
arch/arm/crypto/Kconfig
menuconfig ARM_CRYPTO
bool "ARM Accelerated Cryptographic Algorithms"
depends on ARM
help
Say Y here to choose from a selection of cryptographic algorithms
implemented using ARM specific CPU features or instructions.
if ARM_CRYPTO
<Ausgelassen>
config CRYPTO_SHA1_ARM_NEON
tristate "SHA1 digest algorithm (ARM NEON)"
depends on KERNEL_MODE_NEON
select CRYPTO_SHA1_ARM
select CRYPTO_SHA1
select CRYPTO_HASH
help
SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2) implemented
using optimized ARM NEON assembly, when NEON instructions are
available.
Makefile
Es ist die übliche Beschreibung, die erforderlichen Dateien gemäß den in KConfig aktivierten Einstellungen zu importieren.
arch/arm/crypto/Makefile
obj-$(CONFIG_CRYPTO_AES_ARM) += aes-arm.o
obj-$(CONFIG_CRYPTO_AES_ARM_BS) += aes-arm-bs.o
obj-$(CONFIG_CRYPTO_SHA1_ARM) += sha1-arm.o
obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
<Ausgelassen>
aes-arm-y := aes-cipher-core.o aes-cipher-glue.o
aes-arm-bs-y := aes-neonbs-core.o aes-neonbs-glue.o
sha1-arm-y := sha1-armv4-large.o sha1_glue.o
sha1-arm-neon-y := sha1-armv7-neon.o sha1_neon_glue.o
sha256-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha256_neon_glue.o
sha1-arm-neon.o
Dies ist eine Kombination der beiden Dateien aus der Beschreibung "sha1-arm-neon-y: = sha1-armv7-neon.o sha1_neon_glue.o".
sha1_neon_glue.c
Wenn das Modul installiert ist, wird sha1_neon_mode_ [init | fini] registriert.
arch/arm/crypto/sha1_neon_glue.c
module_init(sha1_neon_mod_init);
module_exit(sha1_neon_mod_fini);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, NEON accelerated");
MODULE_ALIAS_CRYPTO("sha1");
sha1_neon_mod_init()
In sha1_neon_mod_init () wird die Implementierung für Neon registriert. Beachten Sie, dass ".init" zu "sha1_base_init" wird und die allgemeine Implementierung verwendet. Die anderen werden eindeutig als "sha1_neon_ *" implementiert.
arch/arm/crypto/sha1_neon_glue.c
static struct shash_alg alg = {
.digestsize = SHA1_DIGEST_SIZE,
.init = sha1_base_init,
.update = sha1_neon_update,
.final = sha1_neon_final,
.finup = sha1_neon_finup,
.descsize = sizeof(struct sha1_state),
.base = {
.cra_name = "sha1",
.cra_driver_name = "sha1-neon",
.cra_priority = 250,
.cra_blocksize = SHA1_BLOCK_SIZE,
.cra_module = THIS_MODULE,
}
};
static int __init sha1_neon_mod_init(void)
{
if (!cpu_has_neon())
return -ENODEV;
return crypto_register_shash(&alg);
}
sha1_neon_update()
arch/arm/crypto/sha1_neon_glue.c
static int sha1_neon_update(struct shash_desc *desc, const u8 *data,
unsigned int len)
{
struct sha1_state *sctx = shash_desc_ctx(desc);
if (!crypto_simd_usable() ||
(sctx->count % SHA1_BLOCK_SIZE) + len < SHA1_BLOCK_SIZE)
return sha1_update_arm(desc, data, len);
kernel_neon_begin();
sha1_base_do_update(desc, data, len,
(sha1_block_fn *)sha1_transform_neon);
kernel_neon_end();
return 0;
}
arch/arm/crypto/sha1_glue.c
int sha1_update_arm(struct shash_desc *desc, const u8 *data,
unsigned int len)
{
/* make sure casting to sha1_block_fn() is safe */
BUILD_BUG_ON(offsetof(struct sha1_state, state) != 0);
return sha1_base_do_update(desc, data, len,
(sha1_block_fn *)sha1_block_data_order);
}
EXPORT_SYMBOL_GPL(sha1_update_arm);
Hier,
--crypt_simd_usable () ist eine Funktion, die bestimmt, ob eine SIMD-Implementierung in crypt verfügbar ist. Es gibt eine Implementierung um https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/crypto/internal/simd.h#n64.
--Wenn die SIMD-Implementierung nicht mit Krypta verwendet werden kann und nicht verfügbar ist, wird ein Fallback-Prozess ausgeführt, der sha1_base_do_update ()
vom normalen sha1_update_arm ()
aufruft.
--kernel_neon_begin ()
undkernel_neon_end ()
sind Funktionen zum Schutz des NEON-Registers.
sha1_neon_finup() / sha1_neon_final()
Die Endverarbeitung wird zusammen beschrieben.
--Wenn simd nicht mit crypt verwendet werden kann, kehren Sie zur normalen Verarbeitung zurück.
sha1_neon_glue.c
static int sha1_neon_finup(struct shash_desc *desc, const u8 *data,
unsigned int len, u8 *out)
{
if (!crypto_simd_usable())
return sha1_finup_arm(desc, data, len, out);
kernel_neon_begin();
if (len)
sha1_base_do_update(desc, data, len,
(sha1_block_fn *)sha1_transform_neon);
sha1_base_do_finalize(desc, (sha1_block_fn *)sha1_transform_neon);
kernel_neon_end();
return sha1_base_finish(desc, out);
}
static int sha1_neon_final(struct shash_desc *desc, u8 *out)
{
return sha1_neon_finup(desc, NULL, 0, out);
}
sha1-armv7-neon.S
sha1_transform_neon()
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/arm/crypto/sha1-armv7-neon.S#n292
sha1-armv7-neon.S
/*
* Transform nblks*64 bytes (nblks*16 32-bit words) at DATA.
*
* unsigned int
* sha1_transform_neon (void *ctx, const unsigned char *data,
* unsigned int nblks)
*/
.align 3
ENTRY(sha1_transform_neon)
/* input:
* r0: ctx, CTX
* r1: data (64*nblks bytes)
* r2: nblks
*/
cmp RNBLKS, #0;
beq .Ldo_nothing;
<Ausgelassen>
Das ist alles.
Ausgehend vom Dateinamen werden die folgenden unterstützt.
(☆ = Nicht in x86, sondern in ARM)
(☆ = nicht in x86, sondern in ARM64)
(★ = nicht in ARM, sondern in x86)
Charakteristik: Wie erwartet wird es von allen verwendet, daher ist die Unterstützung heiß und dick ...
Features: Hmmm ... das sieht so aus, als hätte es keine Features.
Eigenschaften: MD5, AES, DES, CAMELLIA, SHA1, SHA256, SHA512 usw. Es scheint, dass es spezielle Anweisungen gibt!
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/sparc/crypto/opcodes.h
MIPS
S390
RISC-V
Nicht implementiert! !! Wenn Sie sich hier verpflichten, wird Ihr Name in Zukunft noch lange als Linux Kernel Developer aufgezeichnet! !! Du hast es geschafft! !! !!
Recommended Posts