diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2014-12-01 21:10:19 +0200 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2014-12-01 21:10:19 +0200 |
commit | 3d5b51786e2050c461e9791b59142a731462b66d (patch) | |
tree | 62798f1198918320ace3aafcf23febd65636f06b /cipher/rijndael-internal.h | |
parent | dbf9e95dd3891f6e6ad370e8ab78fec03595687b (diff) | |
download | libgcrypt-3d5b51786e2050c461e9791b59142a731462b66d.tar.gz |
rijndael: refactor to reduce number of #ifdefs and branches
* cipher/rijndael-aesni.c (_gcry_aes_aesni_encrypt)
(_gcry_aes_aesni_decrypt): Make return stack burn depth.
* cipher/rijndael-amd64.S (_gcry_aes_amd64_encrypt_block)
(_gcry_aes_amd64_decrypt_block): Ditto.
* cipher/rijndael-arm.S (_gcry_aes_arm_encrypt_block)
(_gcry_aes_arm_decrypt_block): Ditto.
* cipher/rijndael-internal.h (RIJNDAEL_context_s)
(rijndael_cryptfn_t): New.
(RIJNDAEL_context): New members 'encrypt_fn' and 'decrypt_fn'.
* cipher/rijndael.c (_gcry_aes_amd64_encrypt_block)
(_gcry_aes_amd64_decrypt_block, _gcry_aes_aesni_encrypt)
(_gcry_aes_aesni_decrypt, _gcry_aes_arm_encrypt_block)
(_gcry_aes_arm_decrypt_block): Change prototypes.
(do_padlock_encrypt, do_padlock_decrypt): New.
(do_setkey): Separate key-length to rounds conversion from
HW features check; Add selection for ctx->encrypt_fn and
ctx->decrypt_fn.
(do_encrypt_aligned, do_decrypt_aligned): Move inside
'[!USE_AMD64_ASM && !USE_ARM_ASM]'; Move USE_AMD64_ASM and
USE_ARM_ASM to...
(do_encrypt, do_decrypt): ...here; Return stack depth; Remove second
temporary buffer from non-aligned input/output case.
(do_padlock): Move decrypt_flag to last argument; Return stack depth.
(rijndael_encrypt): Remove #ifdefs, just call ctx->encrypt_fn.
(_gcry_aes_cfb_enc, _gcry_aes_cbc_enc): Remove USE_PADLOCK; Call
ctx->encrypt_fn in place of do_encrypt/do_encrypt_aligned.
(_gcry_aes_ctr_enc): Call ctx->encrypt_fn in place of
do_encrypt_aligned; Make tmp buffer 16-byte aligned and wipe buffer
after use.
(rijndael_encrypt): Remove #ifdefs, just call ctx->decrypt_fn.
(_gcry_aes_cfb_dec): Remove USE_PADLOCK; Call ctx->decrypt_fn in place
of do_decrypt/do_decrypt_aligned.
(_gcry_aes_cbc_dec): Ditto; Make savebuf buffer 16-byte aligned.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/rijndael-internal.h')
-rw-r--r-- | cipher/rijndael-internal.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/cipher/rijndael-internal.h b/cipher/rijndael-internal.h index 762ea767..9898f0ca 100644 --- a/cipher/rijndael-internal.h +++ b/cipher/rijndael-internal.h @@ -74,9 +74,14 @@ # endif #endif /* ENABLE_AESNI_SUPPORT */ +struct RIJNDAEL_context_s; + +typedef unsigned int (*rijndael_cryptfn_t)(const struct RIJNDAEL_context_s *ctx, + unsigned char *bx, + const unsigned char *ax); /* Our context object. */ -typedef struct +typedef struct RIJNDAEL_context_s { /* The first fields are the keyschedule arrays. This is so that they are aligned on a 16 byte boundary if using gcc. This @@ -100,7 +105,7 @@ typedef struct PROPERLY_ALIGNED_TYPE dummy; byte keyschedule[MAXROUNDS+1][4][4]; } u2; - int rounds; /* Key-length-dependent number of rounds. */ + int rounds; /* Key-length-dependent number of rounds. */ unsigned int decryption_prepared:1; /* The decryption key schedule is available. */ #ifdef USE_PADLOCK unsigned int use_padlock:1; /* Padlock shall be used. */ @@ -108,6 +113,8 @@ typedef struct #ifdef USE_AESNI unsigned int use_aesni:1; /* AES-NI shall be used. */ #endif /*USE_AESNI*/ + rijndael_cryptfn_t encrypt_fn; + rijndael_cryptfn_t decrypt_fn; } RIJNDAEL_context ATTR_ALIGNED_16; /* Macros defining alias for the keyschedules. */ |