summaryrefslogtreecommitdiff
path: root/cipher/rijndael.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2015-07-05 20:58:56 +0300
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2015-07-26 17:03:04 +0300
commit620e1e0300c79943a1846a49563b04386dc60546 (patch)
tree060eff4b28e589222ab18b2fc73912ba94b4931c /cipher/rijndael.c
parent46c072669eb81ed610cc5b3c0dc0c75a143afbb4 (diff)
downloadlibgcrypt-620e1e0300c79943a1846a49563b04386dc60546.tar.gz
Add OCB bulk mode for AES SSSE3 implementation
* cipher/rijndael-ssse3-amd64.c (SSSE3_STATE_SIZE): New. [HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS] (vpaes_ssse3_prepare): Use 'ssse3_state' for storing current SSSE3 state. [HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS] (vpaes_ssse3_cleanup): Restore SSSE3 state from 'ssse3_state'. (_gcry_aes_ssse3_do_setkey, _gcry_aes_ssse3_prepare_decryption) (_gcry_aes_ssse3_encrypt, _gcry_aes_ssse3_cfb_enc) (_gcry_aes_ssse3_cbc_enc, _gcry_aes_ssse3_ctr_enc) (_gcry_aes_ssse3_decrypt, _gcry_aes_ssse3_cfb_dec) (_gcry_aes_ssse3_cbc_dec, _gcry_aes_ssse3_cbc_dec): Add 'ssse3_state' array. (get_l, ssse3_ocb_enc, ssse3_ocb_dec, _gcry_aes_ssse3_ocb_crypt) (_gcry_aes_ssse3_ocb_auth): New. * cipher/rijndael.c (_gcry_aes_ssse3_ocb_crypt) (_gcry_aes_ssse3_ocb_auth): New. (_gcry_aes_ocb_crypt, _gcry_aes_ocb_auth) [USE_SSSE3]: Use SSSE3 implementation for OCB. -- Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/rijndael.c')
-rw-r--r--cipher/rijndael.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/cipher/rijndael.c b/cipher/rijndael.c
index 4f063c46..1fe16d60 100644
--- a/cipher/rijndael.c
+++ b/cipher/rijndael.c
@@ -137,6 +137,11 @@ extern void _gcry_aes_ssse3_cbc_dec (RIJNDAEL_context *ctx,
unsigned char *outbuf,
const unsigned char *inbuf,
unsigned char *iv, size_t nblocks);
+extern void _gcry_aes_ssse3_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg,
+ const void *inbuf_arg, size_t nblocks,
+ int encrypt);
+extern void _gcry_aes_ssse3_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg,
+ size_t nblocks);
#endif
#ifdef USE_PADLOCK
@@ -1226,6 +1231,13 @@ _gcry_aes_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg,
burn_depth = 0;
}
#endif /*USE_AESNI*/
+#ifdef USE_SSSE3
+ else if (ctx->use_ssse3)
+ {
+ _gcry_aes_ssse3_ocb_crypt (c, outbuf, inbuf, nblocks, encrypt);
+ burn_depth = 0;
+ }
+#endif /*USE_SSSE3*/
else if (encrypt)
{
union { unsigned char x1[16] ATTR_ALIGNED_16; u32 x32[4]; } l_tmp;
@@ -1314,6 +1326,13 @@ _gcry_aes_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, size_t nblocks)
burn_depth = 0;
}
#endif /*USE_AESNI*/
+#ifdef USE_SSSE3
+ else if (ctx->use_ssse3)
+ {
+ _gcry_aes_ssse3_ocb_auth (c, abuf, nblocks);
+ burn_depth = 0;
+ }
+#endif /*USE_SSSE3*/
else
{
union { unsigned char x1[16] ATTR_ALIGNED_16; u32 x32[4]; } l_tmp;