diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2013-11-15 16:23:00 +0200 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2013-11-15 16:23:00 +0200 |
commit | ef9f52cbb39e46918c96200b09c21e931eff174f (patch) | |
tree | cb44bb767d8bdfd45c5376373f6ab6f32f351ab9 /cipher/camellia-glue.c | |
parent | c8ad83fb605fdbf6dc0b0dbcc8aedfbd477640da (diff) | |
download | libgcrypt-ef9f52cbb39e46918c96200b09c21e931eff174f.tar.gz |
Camellia: Add AVX/AES-NI key setup
* cipher/camellia-aesni-avx-amd64.S (key_bitlength, key_table): New
order of fields in ctx.
(camellia_f, vec_rol128, vec_ror128): New macros.
(__camellia_avx_setup128, __camellia_avx_setup256)
(_gcry_camellia_aesni_avx_keygen): New functions.
* cipher/camellia-aesni-avx2-amd64.S (key_bitlength, key_table): New
order of fields in ctx.
* cipher/camellia-arm.S (CAMELLIA_TABLE_BYTE_LEN, key_length): Remove
unused macros.
* cipher/camellia-glue.c (CAMELLIA_context): Move keytable to head for
better alignment; Make 'use_aesni_avx' and 'use_aesni_avx2' bitfield
members.
[USE_AESNI_AVX] (_gcry_camellia_aesni_avx_keygen): New prototype.
(camellia_setkey) [USE_AESNI_AVX || USE_AESNI_AVX2]: Read hw features
to variable 'hwf' and match features from it.
(camellia_setkey) [USE_AESNI_AVX]: Use AES-NI/AVX key setup if
available.
--
Use AVX/AES-NI for key-setup for small speed-up.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/camellia-glue.c')
-rw-r--r-- | cipher/camellia-glue.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index b7ae0fc2..24936ce9 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -90,13 +90,13 @@ typedef struct { - int keybitlength; KEY_TABLE_TYPE keytable; + int keybitlength; #ifdef USE_AESNI_AVX - int use_aesni_avx; /* AES-NI/AVX implementation shall be used. */ + unsigned int use_aesni_avx:1; /* AES-NI/AVX implementation shall be used. */ #endif /*USE_AESNI_AVX*/ #ifdef USE_AESNI_AVX2 - int use_aesni_avx2; /* AES-NI/AVX2 implementation shall be used. */ + unsigned int use_aesni_avx2:1;/* AES-NI/AVX2 implementation shall be used. */ #endif /*USE_AESNI_AVX2*/ } CAMELLIA_context; @@ -118,6 +118,10 @@ extern void _gcry_camellia_aesni_avx_cfb_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); + +extern void _gcry_camellia_aesni_avx_keygen(CAMELLIA_context *ctx, + const unsigned char *key, + unsigned int keylen); #endif #ifdef USE_AESNI_AVX2 @@ -148,6 +152,9 @@ camellia_setkey(void *c, const byte *key, unsigned keylen) CAMELLIA_context *ctx=c; static int initialized=0; static const char *selftest_failed=NULL; +#if defined(USE_AESNI_AVX) || defined(USE_AESNI_AVX2) + unsigned int hwf = _gcry_get_hw_features (); +#endif if(keylen!=16 && keylen!=24 && keylen!=32) return GPG_ERR_INV_KEYLEN; @@ -163,39 +170,38 @@ camellia_setkey(void *c, const byte *key, unsigned keylen) if(selftest_failed) return GPG_ERR_SELFTEST_FAILED; +#ifdef USE_AESNI_AVX + ctx->use_aesni_avx = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX); +#endif +#ifdef USE_AESNI_AVX2 + ctx->use_aesni_avx2 = (hwf & HWF_INTEL_AESNI) && (hwf & HWF_INTEL_AVX2); +#endif + ctx->keybitlength=keylen*8; - Camellia_Ekeygen(ctx->keybitlength,key,ctx->keytable); - _gcry_burn_stack - ((19+34+34)*sizeof(u32)+2*sizeof(void*) /* camellia_setup256 */ - +(4+32)*sizeof(u32)+2*sizeof(void*) /* camellia_setup192 */ - +0+sizeof(int)+2*sizeof(void*) /* Camellia_Ekeygen */ - +3*2*sizeof(void*) /* Function calls. */ - ); + if (0) + ; #ifdef USE_AESNI_AVX - ctx->use_aesni_avx = 0; - if ((_gcry_get_hw_features () & HWF_INTEL_AESNI) && - (_gcry_get_hw_features () & HWF_INTEL_AVX)) - { - ctx->use_aesni_avx = 1; - } + else if (ctx->use_aesni_avx) + _gcry_camellia_aesni_avx_keygen(ctx, key, keylen); + else #endif - -#ifdef USE_AESNI_AVX2 - ctx->use_aesni_avx2 = 0; - if ((_gcry_get_hw_features () & HWF_INTEL_AESNI) && - (_gcry_get_hw_features () & HWF_INTEL_AVX2)) { - ctx->use_aesni_avx2 = 1; + Camellia_Ekeygen(ctx->keybitlength,key,ctx->keytable); + _gcry_burn_stack + ((19+34+34)*sizeof(u32)+2*sizeof(void*) /* camellia_setup256 */ + +(4+32)*sizeof(u32)+2*sizeof(void*) /* camellia_setup192 */ + +0+sizeof(int)+2*sizeof(void*) /* Camellia_Ekeygen */ + +3*2*sizeof(void*) /* Function calls. */ + ); } -#endif return 0; } #ifdef USE_ARM_ASM -/* Assembly implementations of CAST5. */ +/* Assembly implementations of Camellia. */ extern void _gcry_camellia_arm_encrypt_block(const KEY_TABLE_TYPE keyTable, byte *outbuf, const byte *inbuf, const int keybits); |