Skip to content

Commit d8f1308

Browse files
zx2c4herbertx
authored andcommittedNov 17, 2019
crypto: arm/curve25519 - wire up NEON implementation
This ports the SUPERCOP implementation for usage in kernel space. In addition to the usual header, macro, and style changes required for kernel space, it makes a few small changes to the code: - The stack alignment is relaxed to 16 bytes. - Superfluous mov statements have been removed. - ldr for constants has been replaced with movw. - ldreq has been replaced with moveq. - The str epilogue has been made more idiomatic. - SIMD registers are not pushed and popped at the beginning and end. - The prologue and epilogue have been made idiomatic. - A hole has been removed from the stack, saving 32 bytes. - We write-back the base register whenever possible for vld1.8. - Some multiplications have been reordered for better A7 performance. There are more opportunities for cleanup, since this code is from qhasm, which doesn't always do the most opportune thing. But even prior to extensive hand optimizations, this code delivers significant performance improvements (given in get_cycles() per call): ----------- ------------- | generic C | this commit | ------------ ----------- ------------- | Cortex-A7 | 49136 | 22395 | ------------ ----------- ------------- | Cortex-A17 | 17326 | 4983 | ------------ ----------- ------------- Signed-off-by: Jason A. Donenfeld <[email protected]> [ardb: - move to arch/arm/crypto - wire into lib/crypto framework - implement crypto API KPP hooks ] Signed-off-by: Ard Biesheuvel <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent f0fb006 commit d8f1308

File tree

4 files changed

+287
-195
lines changed

4 files changed

+287
-195
lines changed
 

‎arch/arm/crypto/Kconfig

+6
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,10 @@ config CRYPTO_NHPOLY1305_NEON
142142
depends on KERNEL_MODE_NEON
143143
select CRYPTO_NHPOLY1305
144144

145+
config CRYPTO_CURVE25519_NEON
146+
tristate "NEON accelerated Curve25519 scalar multiplication library"
147+
depends on KERNEL_MODE_NEON
148+
select CRYPTO_LIB_CURVE25519_GENERIC
149+
select CRYPTO_ARCH_HAVE_LIB_CURVE25519
150+
145151
endif

‎arch/arm/crypto/Makefile

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
1212
obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
1313
obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
1414
obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
15+
obj-$(CONFIG_CRYPTO_CURVE25519_NEON) += curve25519-neon.o
1516

1617
obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
1718
obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o
@@ -38,6 +39,7 @@ chacha-neon-y := chacha-scalar-core.o chacha-glue.o
3839
chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o
3940
poly1305-arm-y := poly1305-core.o poly1305-glue.o
4041
nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
42+
curve25519-neon-y := curve25519-core.o curve25519-glue.o
4143

4244
ifdef REGENERATE_ARM_CRYPTO
4345
quiet_cmd_perl = PERL $@

0 commit comments

Comments
 (0)