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.
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
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>
--Ajoutez un fichier appelé XXXX-glue.c
et enregistrez la fonction de transformation dans module_init ().
C'est tout.
En gros à partir du nom du fichier, les éléments suivants sont pris en charge.
(☆ = Pas dans x86, mais dans ARM)
(☆ = pas dans x86, mais dans ARM64)
(★ = pas dans ARM, mais dans x86)
Caractéristique: Comme prévu, tout le monde l'utilise, donc le support est chaud et épais ...
Caractéristiques: Hmmm ... cela semble ne pas avoir de fonctionnalités.
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