diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2022-04-21 21:40:01 +0300 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2022-04-24 01:44:16 +0300 |
commit | 9388279803ff82ea0ccd12a83157b94c807e7a8f (patch) | |
tree | cf32224749fc8223a89557d723899b73af2fc0e9 /cipher/serpent.c | |
parent | e1c5f950838b2fa086a798f7194b618f581dca96 (diff) | |
download | libgcrypt-9388279803ff82ea0ccd12a83157b94c807e7a8f.tar.gz |
Move bulk OCB L pointer array setup code to common header
* cipher/bulkhelp.h: New.
* cipher/camellia-glue.c (_gcry_camellia_ocb_crypt)
(_gcry_camellia_ocb_crypt): Use new
`bulk_ocb_prepare_L_pointers_array_blkXX` function for OCB L pointer
array setup.
* cipher/serpent.c (_gcry_serpent_ocb_crypt)
(_gcry_serpent_ocb_auth): Likewise.
* cipher/sm4.c (_gcry_sm4_ocb_crypt, _gcry_sm4_ocb_auth): Likewise.
* cipher/twofish.c (_gcry_twofish_ocb_crypt)
(_gcry_twofish_ocb_auth): Likewise.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/serpent.c')
-rw-r--r-- | cipher/serpent.c | 99 |
1 files changed, 16 insertions, 83 deletions
diff --git a/cipher/serpent.c b/cipher/serpent.c index 159d889f..dfe5cc28 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -31,6 +31,7 @@ #include "bufhelp.h" #include "cipher-internal.h" #include "cipher-selftest.h" +#include "bulkhelp.h" /* USE_SSE2 indicates whether to compile with AMD64 SSE2 code. */ @@ -1272,27 +1273,11 @@ _gcry_serpent_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, { int did_use_avx2 = 0; u64 Ls[16]; - unsigned int n = 16 - (blkn % 16); u64 *l; - int i; if (nblocks >= 16) { - for (i = 0; i < 16; i += 8) - { - /* Use u64 to store pointers for x32 support (assembly function - * assumes 64-bit pointers). */ - Ls[(i + 0 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 1 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(i + 2 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 3 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; - Ls[(i + 4 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 5 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(i + 6 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - } - - Ls[(7 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; - l = &Ls[(15 + n) % 16]; + l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) @@ -1329,21 +1314,11 @@ _gcry_serpent_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, { int did_use_sse2 = 0; u64 Ls[8]; - unsigned int n = 8 - (blkn % 8); u64 *l; if (nblocks >= 8) { - /* Use u64 to store pointers for x32 support (assembly function - * assumes 64-bit pointers). */ - Ls[(0 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(1 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(2 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(3 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; - Ls[(4 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(5 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(6 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - l = &Ls[(7 + n) % 8]; + l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) @@ -1380,33 +1355,25 @@ _gcry_serpent_ocb_crypt (gcry_cipher_hd_t c, void *outbuf_arg, if (ctx->use_neon) { int did_use_neon = 0; - const void *Ls[8]; - unsigned int n = 8 - (blkn % 8); - const void **l; + uintptr_t Ls[8]; + uintptr_t *l; if (nblocks >= 8) { - Ls[(0 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(1 + n) % 8] = c->u_mode.ocb.L[1]; - Ls[(2 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(3 + n) % 8] = c->u_mode.ocb.L[2]; - Ls[(4 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(5 + n) % 8] = c->u_mode.ocb.L[1]; - Ls[(6 + n) % 8] = c->u_mode.ocb.L[0]; - l = &Ls[(7 + n) % 8]; + l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; - *l = ocb_get_l(c, blkn - blkn % 8); + *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); if (encrypt) _gcry_serpent_neon_ocb_enc(ctx, outbuf, inbuf, c->u_iv.iv, - c->u_ctr.ctr, Ls); + c->u_ctr.ctr, (void **)Ls); else _gcry_serpent_neon_ocb_dec(ctx, outbuf, inbuf, c->u_iv.iv, - c->u_ctr.ctr, Ls); + c->u_ctr.ctr, (void **)Ls); nblocks -= 8; outbuf += 8 * sizeof(serpent_block_t); @@ -1456,27 +1423,11 @@ _gcry_serpent_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, { int did_use_avx2 = 0; u64 Ls[16]; - unsigned int n = 16 - (blkn % 16); u64 *l; - int i; if (nblocks >= 16) { - for (i = 0; i < 16; i += 8) - { - /* Use u64 to store pointers for x32 support (assembly function - * assumes 64-bit pointers). */ - Ls[(i + 0 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 1 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(i + 2 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 3 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; - Ls[(i + 4 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(i + 5 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(i + 6 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - } - - Ls[(7 + n) % 16] = (uintptr_t)(void *)c->u_mode.ocb.L[3]; - l = &Ls[(15 + n) % 16]; + l = bulk_ocb_prepare_L_pointers_array_blk16 (c, Ls, blkn); /* Process data in 16 block chunks. */ while (nblocks >= 16) @@ -1508,21 +1459,11 @@ _gcry_serpent_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, { int did_use_sse2 = 0; u64 Ls[8]; - unsigned int n = 8 - (blkn % 8); u64 *l; if (nblocks >= 8) { - /* Use u64 to store pointers for x32 support (assembly function - * assumes 64-bit pointers). */ - Ls[(0 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(1 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(2 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(3 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[2]; - Ls[(4 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - Ls[(5 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[1]; - Ls[(6 + n) % 8] = (uintptr_t)(void *)c->u_mode.ocb.L[0]; - l = &Ls[(7 + n) % 8]; + l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) @@ -1554,29 +1495,21 @@ _gcry_serpent_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg, if (ctx->use_neon) { int did_use_neon = 0; - const void *Ls[8]; - unsigned int n = 8 - (blkn % 8); - const void **l; + uintptr_t Ls[8]; + uintptr_t *l; if (nblocks >= 8) { - Ls[(0 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(1 + n) % 8] = c->u_mode.ocb.L[1]; - Ls[(2 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(3 + n) % 8] = c->u_mode.ocb.L[2]; - Ls[(4 + n) % 8] = c->u_mode.ocb.L[0]; - Ls[(5 + n) % 8] = c->u_mode.ocb.L[1]; - Ls[(6 + n) % 8] = c->u_mode.ocb.L[0]; - l = &Ls[(7 + n) % 8]; + l = bulk_ocb_prepare_L_pointers_array_blk8 (c, Ls, blkn); /* Process data in 8 block chunks. */ while (nblocks >= 8) { blkn += 8; - *l = ocb_get_l(c, blkn - blkn % 8); + *l = (uintptr_t)(void *)ocb_get_l(c, blkn - blkn % 8); _gcry_serpent_neon_ocb_auth(ctx, abuf, c->u_mode.ocb.aad_offset, - c->u_mode.ocb.aad_sum, Ls); + c->u_mode.ocb.aad_sum, (void **)Ls); nblocks -= 8; abuf += 8 * sizeof(serpent_block_t); |