summaryrefslogtreecommitdiff
path: root/cipher/rijndael.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2019-08-20 22:58:07 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2019-08-26 19:39:20 +0300
commit821602c60c7d144c978c335f91ae1641cf668df5 (patch)
tree09a7cd59af618490b307edc87cec4f8bf8c16654 /cipher/rijndael.c
parent9dca65ef71b4bdbd89a087f41f4dbba71e6d2822 (diff)
downloadlibgcrypt-821602c60c7d144c978c335f91ae1641cf668df5.tar.gz
rijndael-ppc: enable PowerPC AES-OCB implemention
* cipher/rijndael-ppc.c (ROUND_KEY_VARIABLES, PRELOAD_ROUND_KEYS) (AES_ENCRYPT, AES_DECRYPT): New. (_gcry_aes_ppc8_prepare_decryption): Rename to... (aes_ppc8_prepare_decryption): ... this. (_gcry_aes_ppc8_prepare_decryption): New. (aes_ppc8_encrypt_altivec, aes_ppc8_decrypt_altivec): Remove. (_gcry_aes_ppc8_encrypt): Use AES_ENCRYPT macro. (_gcry_aes_ppc8_decrypt): Use AES_DECRYPT macro. (_gcry_aes_ppc8_ocb_crypt): Uncomment; Optimizations for OCB offset calculations, etc; Use new load/store and encryption/decryption macros. * cipher/rijndaelc [USE_PPC_CRYPTO] (_gcry_aes_ppc8_ocb_crypt): New prototype. (do_setkey, _gcry_aes_ocb_crypt) [USE_PPC_CRYPTO]: Add PowerPC AES OCB encryption/decryption. -- Benchmark on POWER8 ~3.8Ghz: Before: AES | nanosecs/byte mebibytes/sec cycles/byte OCB enc | 2.33 ns/B 410.1 MiB/s 8.84 c/B OCB dec | 2.34 ns/B 407.2 MiB/s 8.90 c/B OCB auth | 2.32 ns/B 411.1 MiB/s 8.82 c/B After: OCB enc | 0.250 ns/B 3818 MiB/s 0.949 c/B OCB dec | 0.250 ns/B 3820 MiB/s 0.949 c/B OCB auth | 2.31 ns/B 412.5 MiB/s 8.79 c/B GnuPG-bug-id: 4529 Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/rijndael.c')
-rw-r--r--cipher/rijndael.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/cipher/rijndael.c b/cipher/rijndael.c
index 8a27dfe0..c7bc467c 100644
--- a/cipher/rijndael.c
+++ b/cipher/rijndael.c
@@ -210,6 +210,9 @@ extern unsigned int _gcry_aes_ppc8_encrypt(const RIJNDAEL_context *ctx,
extern unsigned int _gcry_aes_ppc8_decrypt(const RIJNDAEL_context *ctx,
unsigned char *dst,
const unsigned char *src);
+extern size_t _gcry_aes_ppc8_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg,
+ const void *inbuf_arg, size_t nblocks,
+ int encrypt);
#endif /*USE_PPC_CRYPTO*/
static unsigned int do_encrypt (const RIJNDAEL_context *ctx, unsigned char *bx,
@@ -447,6 +450,7 @@ do_setkey (RIJNDAEL_context *ctx, const byte *key, const unsigned keylen,
ctx->use_ppc_crypto = 1;
if (hd)
{
+ hd->bulk.ocb_crypt = _gcry_aes_ppc8_ocb_crypt;
}
}
#endif
@@ -1380,6 +1384,12 @@ _gcry_aes_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg,
return _gcry_aes_armv8_ce_ocb_crypt (c, outbuf, inbuf, nblocks, encrypt);
}
#endif /*USE_ARM_CE*/
+#ifdef USE_PPC_CRYPTO
+ else if (ctx->use_ppc_crypto)
+ {
+ return _gcry_aes_ppc8_ocb_crypt (c, outbuf, inbuf, nblocks, encrypt);
+ }
+#endif /*USE_PPC_CRYPTO*/
else if (encrypt)
{
union { unsigned char x1[16] ATTR_ALIGNED_16; u32 x32[4]; } l_tmp;