You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
crypto: x86 - Add optimized MORUS implementations
This patch adds optimized implementations of MORUS-640 and MORUS-1280, utilizing the SSE2 and AVX2 x86 extensions. For MORUS-1280 (which operates on 256-bit blocks) we provide both AVX2 and SSE2 implementation. Although SSE2 MORUS-1280 is slower than AVX2 MORUS-1280, it is comparable in speed to the SSE2 MORUS-640. Signed-off-by: Ondrej Mosnacek <omosnacek@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
committed by
Herbert Xu
parent
56e8e57fc3
commit
6ecc9d9ff9
@@ -42,6 +42,9 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2) += aegis128-aesni.o
|
|||||||
obj-$(CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2) += aegis128l-aesni.o
|
obj-$(CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2) += aegis128l-aesni.o
|
||||||
obj-$(CONFIG_CRYPTO_AEGIS256_AESNI_SSE2) += aegis256-aesni.o
|
obj-$(CONFIG_CRYPTO_AEGIS256_AESNI_SSE2) += aegis256-aesni.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_CRYPTO_MORUS640_SSE2) += morus640-sse2.o
|
||||||
|
obj-$(CONFIG_CRYPTO_MORUS1280_SSE2) += morus1280-sse2.o
|
||||||
|
|
||||||
# These modules require assembler to support AVX.
|
# These modules require assembler to support AVX.
|
||||||
ifeq ($(avx_supported),yes)
|
ifeq ($(avx_supported),yes)
|
||||||
obj-$(CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64) += \
|
obj-$(CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64) += \
|
||||||
@@ -59,6 +62,8 @@ ifeq ($(avx2_supported),yes)
|
|||||||
obj-$(CONFIG_CRYPTO_SHA1_MB) += sha1-mb/
|
obj-$(CONFIG_CRYPTO_SHA1_MB) += sha1-mb/
|
||||||
obj-$(CONFIG_CRYPTO_SHA256_MB) += sha256-mb/
|
obj-$(CONFIG_CRYPTO_SHA256_MB) += sha256-mb/
|
||||||
obj-$(CONFIG_CRYPTO_SHA512_MB) += sha512-mb/
|
obj-$(CONFIG_CRYPTO_SHA512_MB) += sha512-mb/
|
||||||
|
|
||||||
|
obj-$(CONFIG_CRYPTO_MORUS1280_AVX2) += morus1280-avx2.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
aes-i586-y := aes-i586-asm_32.o aes_glue.o
|
aes-i586-y := aes-i586-asm_32.o aes_glue.o
|
||||||
@@ -80,6 +85,9 @@ aegis128-aesni-y := aegis128-aesni-asm.o aegis128-aesni-glue.o
|
|||||||
aegis128l-aesni-y := aegis128l-aesni-asm.o aegis128l-aesni-glue.o
|
aegis128l-aesni-y := aegis128l-aesni-asm.o aegis128l-aesni-glue.o
|
||||||
aegis256-aesni-y := aegis256-aesni-asm.o aegis256-aesni-glue.o
|
aegis256-aesni-y := aegis256-aesni-asm.o aegis256-aesni-glue.o
|
||||||
|
|
||||||
|
morus640-sse2-y := morus640-sse2-asm.o morus640-sse2-glue.o
|
||||||
|
morus1280-sse2-y := morus1280-sse2-asm.o morus1280-sse2-glue.o
|
||||||
|
|
||||||
ifeq ($(avx_supported),yes)
|
ifeq ($(avx_supported),yes)
|
||||||
camellia-aesni-avx-x86_64-y := camellia-aesni-avx-asm_64.o \
|
camellia-aesni-avx-x86_64-y := camellia-aesni-avx-asm_64.o \
|
||||||
camellia_aesni_avx_glue.o
|
camellia_aesni_avx_glue.o
|
||||||
@@ -95,6 +103,8 @@ ifeq ($(avx2_supported),yes)
|
|||||||
camellia-aesni-avx2-y := camellia-aesni-avx2-asm_64.o camellia_aesni_avx2_glue.o
|
camellia-aesni-avx2-y := camellia-aesni-avx2-asm_64.o camellia_aesni_avx2_glue.o
|
||||||
chacha20-x86_64-y += chacha20-avx2-x86_64.o
|
chacha20-x86_64-y += chacha20-avx2-x86_64.o
|
||||||
serpent-avx2-y := serpent-avx2-asm_64.o serpent_avx2_glue.o
|
serpent-avx2-y := serpent-avx2-asm_64.o serpent_avx2_glue.o
|
||||||
|
|
||||||
|
morus1280-avx2-y := morus1280-avx2-asm.o morus1280-avx2-glue.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o fpu.o
|
aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o fpu.o
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* The MORUS-1280 Authenticated-Encryption Algorithm
|
||||||
|
* Glue for AVX2 implementation
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Ondrej Mosnacek <omosnacek@gmail.com>
|
||||||
|
* Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <crypto/internal/aead.h>
|
||||||
|
#include <crypto/morus1280_glue.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <asm/fpu/api.h>
|
||||||
|
#include <asm/cpu_device_id.h>
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_avx2_init(void *state, const void *key,
|
||||||
|
const void *iv);
|
||||||
|
asmlinkage void crypto_morus1280_avx2_ad(void *state, const void *data,
|
||||||
|
unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_avx2_enc(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus1280_avx2_dec(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_avx2_enc_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus1280_avx2_dec_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_avx2_final(void *state, void *tag_xor,
|
||||||
|
u64 assoclen, u64 cryptlen);
|
||||||
|
|
||||||
|
MORUS1280_DECLARE_ALGS(avx2, "morus1280-avx2", 400);
|
||||||
|
|
||||||
|
static const struct x86_cpu_id avx2_cpu_id[] = {
|
||||||
|
X86_FEATURE_MATCH(X86_FEATURE_AVX2),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(x86cpu, avx2_cpu_id);
|
||||||
|
|
||||||
|
static int __init crypto_morus1280_avx2_module_init(void)
|
||||||
|
{
|
||||||
|
if (!x86_match_cpu(avx2_cpu_id))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return crypto_register_aeads(crypto_morus1280_avx2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus1280_avx2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit crypto_morus1280_avx2_module_exit(void)
|
||||||
|
{
|
||||||
|
crypto_unregister_aeads(crypto_morus1280_avx2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus1280_avx2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(crypto_morus1280_avx2_module_init);
|
||||||
|
module_exit(crypto_morus1280_avx2_module_exit);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Ondrej Mosnacek <omosnacek@gmail.com>");
|
||||||
|
MODULE_DESCRIPTION("MORUS-1280 AEAD algorithm -- AVX2 implementation");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus1280");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus1280-avx2");
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* The MORUS-1280 Authenticated-Encryption Algorithm
|
||||||
|
* Glue for SSE2 implementation
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Ondrej Mosnacek <omosnacek@gmail.com>
|
||||||
|
* Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <crypto/internal/aead.h>
|
||||||
|
#include <crypto/morus1280_glue.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <asm/fpu/api.h>
|
||||||
|
#include <asm/cpu_device_id.h>
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_sse2_init(void *state, const void *key,
|
||||||
|
const void *iv);
|
||||||
|
asmlinkage void crypto_morus1280_sse2_ad(void *state, const void *data,
|
||||||
|
unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_sse2_enc(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus1280_sse2_dec(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_sse2_enc_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus1280_sse2_dec_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus1280_sse2_final(void *state, void *tag_xor,
|
||||||
|
u64 assoclen, u64 cryptlen);
|
||||||
|
|
||||||
|
MORUS1280_DECLARE_ALGS(sse2, "morus1280-sse2", 350);
|
||||||
|
|
||||||
|
static const struct x86_cpu_id sse2_cpu_id[] = {
|
||||||
|
X86_FEATURE_MATCH(X86_FEATURE_XMM2),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(x86cpu, sse2_cpu_id);
|
||||||
|
|
||||||
|
static int __init crypto_morus1280_sse2_module_init(void)
|
||||||
|
{
|
||||||
|
if (!x86_match_cpu(sse2_cpu_id))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return crypto_register_aeads(crypto_morus1280_sse2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus1280_sse2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit crypto_morus1280_sse2_module_exit(void)
|
||||||
|
{
|
||||||
|
crypto_unregister_aeads(crypto_morus1280_sse2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus1280_sse2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(crypto_morus1280_sse2_module_init);
|
||||||
|
module_exit(crypto_morus1280_sse2_module_exit);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Ondrej Mosnacek <omosnacek@gmail.com>");
|
||||||
|
MODULE_DESCRIPTION("MORUS-1280 AEAD algorithm -- SSE2 implementation");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus1280");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus1280-sse2");
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* The MORUS-640 Authenticated-Encryption Algorithm
|
||||||
|
* Glue for SSE2 implementation
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Ondrej Mosnacek <omosnacek@gmail.com>
|
||||||
|
* Copyright (C) 2017-2018 Red Hat, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <crypto/internal/aead.h>
|
||||||
|
#include <crypto/morus640_glue.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <asm/fpu/api.h>
|
||||||
|
#include <asm/cpu_device_id.h>
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus640_sse2_init(void *state, const void *key,
|
||||||
|
const void *iv);
|
||||||
|
asmlinkage void crypto_morus640_sse2_ad(void *state, const void *data,
|
||||||
|
unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus640_sse2_enc(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus640_sse2_dec(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus640_sse2_enc_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
asmlinkage void crypto_morus640_sse2_dec_tail(void *state, const void *src,
|
||||||
|
void *dst, unsigned int length);
|
||||||
|
|
||||||
|
asmlinkage void crypto_morus640_sse2_final(void *state, void *tag_xor,
|
||||||
|
u64 assoclen, u64 cryptlen);
|
||||||
|
|
||||||
|
MORUS640_DECLARE_ALGS(sse2, "morus640-sse2", 400);
|
||||||
|
|
||||||
|
static const struct x86_cpu_id sse2_cpu_id[] = {
|
||||||
|
X86_FEATURE_MATCH(X86_FEATURE_XMM2),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(x86cpu, sse2_cpu_id);
|
||||||
|
|
||||||
|
static int __init crypto_morus640_sse2_module_init(void)
|
||||||
|
{
|
||||||
|
if (!x86_match_cpu(sse2_cpu_id))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return crypto_register_aeads(crypto_morus640_sse2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus640_sse2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit crypto_morus640_sse2_module_exit(void)
|
||||||
|
{
|
||||||
|
crypto_unregister_aeads(crypto_morus640_sse2_algs,
|
||||||
|
ARRAY_SIZE(crypto_morus640_sse2_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(crypto_morus640_sse2_module_init);
|
||||||
|
module_exit(crypto_morus640_sse2_module_exit);
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Ondrej Mosnacek <omosnacek@gmail.com>");
|
||||||
|
MODULE_DESCRIPTION("MORUS-640 AEAD algorithm -- SSE2 implementation");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus640");
|
||||||
|
MODULE_ALIAS_CRYPTO("morus640-sse2");
|
||||||
@@ -348,6 +348,14 @@ config CRYPTO_MORUS640_GLUE
|
|||||||
Common glue for SIMD optimizations of the MORUS-640 dedicated AEAD
|
Common glue for SIMD optimizations of the MORUS-640 dedicated AEAD
|
||||||
algorithm.
|
algorithm.
|
||||||
|
|
||||||
|
config CRYPTO_MORUS640_SSE2
|
||||||
|
tristate "MORUS-640 AEAD algorithm (x86_64 SSE2 implementation)"
|
||||||
|
depends on X86 && 64BIT
|
||||||
|
select CRYPTO_AEAD
|
||||||
|
select CRYPTO_MORUS640_GLUE
|
||||||
|
help
|
||||||
|
SSE2 implementation of the MORUS-640 dedicated AEAD algorithm.
|
||||||
|
|
||||||
config CRYPTO_MORUS1280
|
config CRYPTO_MORUS1280
|
||||||
tristate "MORUS-1280 AEAD algorithm"
|
tristate "MORUS-1280 AEAD algorithm"
|
||||||
select CRYPTO_AEAD
|
select CRYPTO_AEAD
|
||||||
@@ -362,6 +370,24 @@ config CRYPTO_MORUS1280_GLUE
|
|||||||
Common glue for SIMD optimizations of the MORUS-1280 dedicated AEAD
|
Common glue for SIMD optimizations of the MORUS-1280 dedicated AEAD
|
||||||
algorithm.
|
algorithm.
|
||||||
|
|
||||||
|
config CRYPTO_MORUS1280_SSE2
|
||||||
|
tristate "MORUS-1280 AEAD algorithm (x86_64 SSE2 implementation)"
|
||||||
|
depends on X86 && 64BIT
|
||||||
|
select CRYPTO_AEAD
|
||||||
|
select CRYPTO_MORUS1280_GLUE
|
||||||
|
help
|
||||||
|
SSE2 optimizedimplementation of the MORUS-1280 dedicated AEAD
|
||||||
|
algorithm.
|
||||||
|
|
||||||
|
config CRYPTO_MORUS1280_AVX2
|
||||||
|
tristate "MORUS-1280 AEAD algorithm (x86_64 AVX2 implementation)"
|
||||||
|
depends on X86 && 64BIT
|
||||||
|
select CRYPTO_AEAD
|
||||||
|
select CRYPTO_MORUS1280_GLUE
|
||||||
|
help
|
||||||
|
AVX2 optimized implementation of the MORUS-1280 dedicated AEAD
|
||||||
|
algorithm.
|
||||||
|
|
||||||
config CRYPTO_SEQIV
|
config CRYPTO_SEQIV
|
||||||
tristate "Sequence Number IV Generator"
|
tristate "Sequence Number IV Generator"
|
||||||
select CRYPTO_AEAD
|
select CRYPTO_AEAD
|
||||||
|
|||||||
Reference in New Issue
Block a user