diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-10-27 21:04:01 +0300 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-11-15 19:24:21 +0200 |
commit | 5e0187d84fc16d9ff0fbb0ccd4348657fea90d36 (patch) | |
tree | 377bda09db1dacb352f4927e57cd0ad3fac296ad /cipher/cipher-gcm.c | |
parent | ec671cfa239888b67fcafda40b19006b61d9bbf2 (diff) | |
download | libgcrypt-5e0187d84fc16d9ff0fbb0ccd4348657fea90d36.tar.gz |
Add intel-pclmul accelerated POLYVAL for GCM-SIV
* cipher/cipher-gcm-intel-pclmul.c (gfmul_pclmul_aggr4)
(gfmul_pclmul_aggr8): Move assembly to new GFMUL_AGGRx_ASM* macros.
(GFMUL_AGGR4_ASM_1, GFMUL_AGGR4_ASM_2, gfmul_pclmul_aggr4_le)
(GFMUL_AGGR8_ASM, gfmul_pclmul_aggr8_le)
(_gcry_polyval_intel_pclmul): New.
* cipher/cipher-gcm-siv.c (do_polyval_buf): Use polyval function
if available.
* cipher/cipher-gcm.c (_gcry_polyval_intel_pclmul): New.
(setupM): Setup 'c->u_mode.gcm.polyval_fn' with accelerated polyval
function if available.
* cipher/cipher-internal.h (gcry_cipher_handle): Add member
'u_mode.gcm.polyval_fn'.
--
Benchmark on AMD Ryzen 7 5800X:
Before:
AES | nanosecs/byte mebibytes/sec cycles/byte auto Mhz
GCM-SIV enc | 0.150 ns/B 6337 MiB/s 0.730 c/B 4849
GCM-SIV dec | 0.163 ns/B 5862 MiB/s 0.789 c/B 4850
GCM-SIV auth | 0.119 ns/B 8022 MiB/s 0.577 c/B 4850
After (enc/dec ~26% faster, auth ~43% faster):
AES | nanosecs/byte mebibytes/sec cycles/byte auto Mhz
GCM-SIV enc | 0.117 ns/B 8138 MiB/s 0.568 c/B 4850
GCM-SIV dec | 0.128 ns/B 7429 MiB/s 0.623 c/B 4850
GCM-SIV auth | 0.083 ns/B 11507 MiB/s 0.402 c/B 4851
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/cipher-gcm.c')
-rw-r--r-- | cipher/cipher-gcm.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/cipher/cipher-gcm.c b/cipher/cipher-gcm.c index 6b14cce7..d3ed9cf6 100644 --- a/cipher/cipher-gcm.c +++ b/cipher/cipher-gcm.c @@ -43,6 +43,11 @@ extern void _gcry_ghash_setup_intel_pclmul (gcry_cipher_hd_t c); extern unsigned int _gcry_ghash_intel_pclmul (gcry_cipher_hd_t c, byte *result, const byte *buf, size_t nblocks); + +extern unsigned int _gcry_polyval_intel_pclmul (gcry_cipher_hd_t c, + byte *result, + const byte *buf, + size_t nblocks); #endif #ifdef GCM_USE_ARM_PMULL @@ -570,6 +575,7 @@ setupM (gcry_cipher_hd_t c) #endif c->u_mode.gcm.ghash_fn = NULL; + c->u_mode.gcm.polyval_fn = NULL; if (0) { } @@ -577,6 +583,7 @@ setupM (gcry_cipher_hd_t c) else if (features & HWF_INTEL_PCLMUL) { c->u_mode.gcm.ghash_fn = _gcry_ghash_intel_pclmul; + c->u_mode.gcm.polyval_fn = _gcry_polyval_intel_pclmul; _gcry_ghash_setup_intel_pclmul (c); } #endif |