Jusqu'à ce que diverses implémentations de cryptage dans Linux Kernel for ARM soient appelées

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/arm/crypto

Sur cette base, je résumerai brièvement jusqu'à ce que diverses implémentations de cryptage soient appelées.

Prémisse majeure

Dans ARM arch, nous résumerons jusqu'à ce que l'implémentation NEON de SHA1 soit activée et prête à être appelée.

De plus, ** je ne discuterai pas du contenu de l'implémentation NEON / SIMD **.

KConfig

Il existe différentes configurations de noyau dans 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

<Omis>

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

C'est la description habituelle de l'importation des fichiers nécessaires selon les paramètres activés dans KConfig.

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

<Omis>
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

Ceci est une combinaison des deux fichiers de la description sha1-arm-neon-y: = sha1-armv7-neon.o sha1_neon_glue.o.

sha1_neon_glue.c

_Init / _exit lorsque le module est installé

Lorsque le module est installé, sha1_neon_mode_ [init | fini] est enregistré.

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()

Dans sha1_neon_mod_init (), l'implémentation de neon est enregistrée. Notez que .init devient sha1_base_init et utilise l'implémentation commune, et les autres sont implémentées de manière unique en tant quesha1_neon_ *.

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);

ici,

--crypt_simd_usable () est une fonction qui détermine si une implémentation SIMD est disponible dans crypt. Il existe une implémentation autour de https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/crypto/internal/simd.h#n64. --Si l'implémentation SIMD ne peut pas être utilisée avec crypt, et si elle n'est pas disponible, un processus de secours est exécuté qui appelle sha1_base_do_update () à partir du sha1_update_arm () normal. --kernel_neon_begin () etkernel_neon_end ()sont des fonctions utilisées pour protéger le registre NEON. --La substance du processus est effectuée par sha1_transform_neon () passé dans l'argument de sha1_base_do_update ().

sha1_neon_finup() / sha1_neon_final()

Le traitement final sera décrit collectivement.

--Si simd ne peut pas être utilisé avec crypt, revenez au traitement normal. --Activer néon avec kernel_neon_begin () --Appeler le corps de traitement avec sha1_base_do_update (sha1_trasnfrom_neon) --Retourner l'utilisation du néon avec kernel_neon_end ()

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;

<Omis>

Résumé

--Ajoutez un fichier appelé XXXX-glue.c et enregistrez la fonction de transformation dans module_init ().

C'est tout.

Bonus: Qu'est-ce qui est actuellement pris en charge par l'implémentation de cryptage du noyau Linux (30 mai 2020)?

En gros à partir du nom du fichier, les éléments suivants sont pris en charge.

Pour ARM

(☆ = Pas dans x86, mais dans ARM)

Pour ARM64

(☆ = pas dans x86, mais dans ARM64)

Pour x86

(★ = pas dans ARM, mais dans x86)

Caractéristique: Comme prévu, tout le monde l'utilise, donc le support est chaud et épais ...

Pour powerpc

Caractéristiques: Hmmm ... cela semble ne pas avoir de fonctionnalités.

Pour sparc

Caractéristiques: MD5, AES, DES, CAMELLIA, SHA1, SHA256, SHA512, etc. Il semble qu'il y ait des instructions spéciales!

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/sparc/crypto/opcodes.h

MIPS

S390

RISC-V

Non mis en œuvre! !! Si vous vous engagez ici, votre nom sera enregistré en tant que développeur du noyau Linux pendant longtemps dans le futur! !! Tu l'as fait! !! !!

Recommended Posts

Jusqu'à ce que diverses implémentations de cryptage dans Linux Kernel for ARM soient appelées
Compilation du noyau Linux pour DE10nano
[Note de travail] Jusqu'à ce que matplotlib et numpy soient installés dans Amazon Linux
Envisagez d'améliorer l'efficacité de l'implémentation de crypt / xor.c dans le noyau Linux risc-v (discussion uniquement)
[Linux] [module du noyau] Créer kthread dans le module du noyau