summaryrefslogtreecommitdiff
path: root/cipher/sha256.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2016-07-14 17:55:28 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2016-07-14 17:55:28 +0300
commit34c64eb03178fbfd34190148fec5a189df2b8f83 (patch)
treef491501cbfba84c11db0d59f9e794933000ce381 /cipher/sha256.c
parent3d6334f8d94c2a4df10eed203ae928298a4332ef (diff)
downloadlibgcrypt-34c64eb03178fbfd34190148fec5a189df2b8f83.tar.gz
Add ARMv8/AArch32 Crypto Extension implemenation of SHA-256
* cipher/Makefile.am: Add 'sha256-armv8-aarch32-ce.S'. * cipher/sha256-armv8-aarch32-ce.S: New. * cipher/sha256.c (USE_ARM_CE): New. (sha256_init, sha224_init): Check features for HWF_ARM_SHA1. [USE_ARM_CE] (_gcry_sha256_transform_armv8_ce): New. (transform) [USE_ARM_CE]: Use ARMv8 CE implementation if HW supports. (SHA256_CONTEXT): Add 'use_arm_ce'. * configure.ac: Add 'sha256-armv8-aarch32-ce.lo'. -- Benchmark on Cortex-A53 (1152 Mhz): Before: | nanosecs/byte mebibytes/sec cycles/byte SHA256 | 17.38 ns/B 54.88 MiB/s 20.02 c/B After (~9.3x faster): | nanosecs/byte mebibytes/sec cycles/byte SHA256 | 1.85 ns/B 515.7 MiB/s 2.13 c/B Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/sha256.c')
-rw-r--r--cipher/sha256.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/cipher/sha256.c b/cipher/sha256.c
index 1b82ee76..72818ceb 100644
--- a/cipher/sha256.c
+++ b/cipher/sha256.c
@@ -75,6 +75,17 @@
# define USE_AVX2 1
#endif
+/* USE_ARM_CE indicates whether to enable ARMv8 Crypto Extension assembly
+ * code. */
+#undef USE_ARM_CE
+#ifdef ENABLE_ARM_CRYPTO_SUPPORT
+# if defined(HAVE_ARM_ARCH_V6) && defined(__ARMEL__) \
+ && defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) \
+ && defined(HAVE_GCC_INLINE_ASM_AARCH32_CRYPTO)
+# define USE_ARM_CE 1
+# endif
+#endif
+
typedef struct {
gcry_md_block_ctx_t bctx;
@@ -88,6 +99,9 @@ typedef struct {
#ifdef USE_AVX2
unsigned int use_avx2:1;
#endif
+#ifdef USE_ARM_CE
+ unsigned int use_arm_ce:1;
+#endif
} SHA256_CONTEXT;
@@ -129,6 +143,9 @@ sha256_init (void *context, unsigned int flags)
#ifdef USE_AVX2
hd->use_avx2 = (features & HWF_INTEL_AVX2) && (features & HWF_INTEL_BMI2);
#endif
+#ifdef USE_ARM_CE
+ hd->use_arm_ce = (features & HWF_ARM_SHA2) != 0;
+#endif
(void)features;
}
@@ -167,6 +184,9 @@ sha224_init (void *context, unsigned int flags)
#ifdef USE_AVX2
hd->use_avx2 = (features & HWF_INTEL_AVX2) && (features & HWF_INTEL_BMI2);
#endif
+#ifdef USE_ARM_CE
+ hd->use_arm_ce = (features & HWF_ARM_SHA2) != 0;
+#endif
(void)features;
}
@@ -355,6 +375,11 @@ unsigned int _gcry_sha256_transform_amd64_avx2(const void *input_data,
size_t num_blks) ASM_FUNC_ABI;
#endif
+#ifdef USE_ARM_CE
+unsigned int _gcry_sha256_transform_armv8_ce(u32 state[8],
+ const void *input_data,
+ size_t num_blks);
+#endif
static unsigned int
transform (void *ctx, const unsigned char *data, size_t nblks)
@@ -380,6 +405,11 @@ transform (void *ctx, const unsigned char *data, size_t nblks)
+ 4 * sizeof(void*) + ASM_EXTRA_STACK;
#endif
+#ifdef USE_ARM_CE
+ if (hd->use_arm_ce)
+ return _gcry_sha256_transform_armv8_ce (&hd->h0, data, nblks);
+#endif
+
do
{
burn = transform_blk (hd, data);