Bis verschiedene Krypto-Implementierungen im Linux Kernel for ARM aufgerufen werden

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.

Hauptprämisse

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

_Init / _exit, wenn das Modul installiert ist

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>

Zusammenfassung

Das ist alles.

Bonus: Was wird derzeit von der Linux-Kernel-Krypta-Implementierung (30. Mai 2020) unterstützt?

Ausgehend vom Dateinamen werden die folgenden unterstützt.

Für ARM

(☆ = Nicht in x86, sondern in ARM)

Für ARM64

(☆ = nicht in x86, sondern in ARM64)

Für x86

(★ = nicht in ARM, sondern in x86)

Charakteristik: Wie erwartet wird es von allen verwendet, daher ist die Unterstützung heiß und dick ...

Für PowerPC

Features: Hmmm ... das sieht so aus, als hätte es keine Features.

Für Sparc

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

Bis verschiedene Krypto-Implementierungen im Linux Kernel for ARM aufgerufen werden
Linux Kernel Build für DE10nano
[Arbeitsnotiz] Bis matplotlib und numpy unter Amazon Linux installiert sind
Erwägen Sie, die Effizienz der Implementierung von crypt / xor.c im Linux-Kernel von risc-v zu verbessern (nur Diskussion).
[Linux] [Kernelmodul] Erstellen Sie kthread im Kernelmodul