[PATCH 1/4] Add helper function for adding value to cipher block
Jussi Kivilinna
jussi.kivilinna at iki.fi
Sun Mar 31 17:59:28 CEST 2019
* cipher/cipher-internal.h (cipher_block_add): New.
* cipher/blowfish.c (_gcry_blowfish_ctr_enc): Use new helper function
for CTR block increment.
* cipher/camellia-glue.c (_gcry_camellia_ctr_enc): Ditto.
* cipher/cast5.c (_gcry_cast5_ctr_enc): Ditto.
* cipher/cipher-ctr.c (_gcry_cipher_ctr_encrypt): Ditto.
* cipher/des.c (_gcry_3des_ctr_enc): Ditto.
* cipher/rijndael.c (_gcry_aes_ctr_enc): Ditto.
* cipher/serpent.c (_gcry_serpent_ctr_enc): Ditto.
* cipher/twofish.c (_gcry_twofish_ctr_enc): Ditto.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
cipher/blowfish.c | 8 +-------
cipher/camellia-glue.c | 8 +-------
cipher/cast5.c | 8 +-------
cipher/cipher-ctr.c | 7 +------
cipher/cipher-internal.h | 23 +++++++++++++++++++++++
cipher/des.c | 8 +-------
cipher/rijndael.c | 8 +-------
cipher/serpent.c | 8 +-------
cipher/twofish.c | 8 +-------
9 files changed, 31 insertions(+), 55 deletions(-)
diff --git a/cipher/blowfish.c b/cipher/blowfish.c
index f032c5c6f..e7e199afc 100644
--- a/cipher/blowfish.c
+++ b/cipher/blowfish.c
@@ -619,7 +619,6 @@ _gcry_blowfish_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
const unsigned char *inbuf = inbuf_arg;
unsigned char tmpbuf[BLOWFISH_BLOCKSIZE];
int burn_stack_depth = (64) + 2 * BLOWFISH_BLOCKSIZE;
- int i;
#ifdef USE_AMD64_ASM
{
@@ -665,12 +664,7 @@ _gcry_blowfish_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
outbuf += BLOWFISH_BLOCKSIZE;
inbuf += BLOWFISH_BLOCKSIZE;
/* Increment the counter. */
- for (i = BLOWFISH_BLOCKSIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add (ctr, 1, BLOWFISH_BLOCKSIZE);
}
wipememory(tmpbuf, sizeof(tmpbuf));
diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c
index 69b240b79..4b0989ea5 100644
--- a/cipher/camellia-glue.c
+++ b/cipher/camellia-glue.c
@@ -363,7 +363,6 @@ _gcry_camellia_ctr_enc(void *context, unsigned char *ctr,
const unsigned char *inbuf = inbuf_arg;
unsigned char tmpbuf[CAMELLIA_BLOCK_SIZE];
int burn_stack_depth = CAMELLIA_encrypt_stack_burn_size;
- int i;
#ifdef USE_AESNI_AVX2
if (ctx->use_aesni_avx2)
@@ -434,12 +433,7 @@ _gcry_camellia_ctr_enc(void *context, unsigned char *ctr,
outbuf += CAMELLIA_BLOCK_SIZE;
inbuf += CAMELLIA_BLOCK_SIZE;
/* Increment the counter. */
- for (i = CAMELLIA_BLOCK_SIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add(ctr, 1, CAMELLIA_BLOCK_SIZE);
}
wipememory(tmpbuf, sizeof(tmpbuf));
diff --git a/cipher/cast5.c b/cipher/cast5.c
index 49e8b781b..cc5bd9d66 100644
--- a/cipher/cast5.c
+++ b/cipher/cast5.c
@@ -593,7 +593,6 @@ _gcry_cast5_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
unsigned char tmpbuf[CAST5_BLOCKSIZE];
int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE;
- int i;
#ifdef USE_AMD64_ASM
{
@@ -639,12 +638,7 @@ _gcry_cast5_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
outbuf += CAST5_BLOCKSIZE;
inbuf += CAST5_BLOCKSIZE;
/* Increment the counter. */
- for (i = CAST5_BLOCKSIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add (ctr, 1, CAST5_BLOCKSIZE);
}
wipememory(tmpbuf, sizeof(tmpbuf));
diff --git a/cipher/cipher-ctr.c b/cipher/cipher-ctr.c
index 546d4f8e6..5f0afc2f8 100644
--- a/cipher/cipher-ctr.c
+++ b/cipher/cipher-ctr.c
@@ -83,12 +83,7 @@ _gcry_cipher_ctr_encrypt (gcry_cipher_hd_t c,
nburn = enc_fn (&c->context.c, tmp, c->u_ctr.ctr);
burn = nburn > burn ? nburn : burn;
- for (i = blocksize; i > 0; i--)
- {
- c->u_ctr.ctr[i-1]++;
- if (c->u_ctr.ctr[i-1] != 0)
- break;
- }
+ cipher_block_add(c->u_ctr.ctr, 1, blocksize);
if (inbuflen < blocksize)
break;
diff --git a/cipher/cipher-internal.h b/cipher/cipher-internal.h
index 2283bf319..970aa9860 100644
--- a/cipher/cipher-internal.h
+++ b/cipher/cipher-internal.h
@@ -628,6 +628,29 @@ static inline unsigned int _gcry_blocksize_shift(gcry_cipher_hd_t c)
}
+/* Optimized function for adding value to cipher block. */
+static inline void
+cipher_block_add(void *_dstsrc, unsigned int add, size_t blocksize)
+{
+ byte *dstsrc = _dstsrc;
+ u64 s[2];
+
+ if (blocksize == 8)
+ {
+ buf_put_be64(dstsrc + 0, buf_get_be64(dstsrc + 0) + add);
+ }
+ else /* blocksize == 16 */
+ {
+ s[0] = buf_get_be64(dstsrc + 8);
+ s[1] = buf_get_be64(dstsrc + 0);
+ s[0] += add;
+ s[1] += (s[0] < add);
+ buf_put_be64(dstsrc + 8, s[0]);
+ buf_put_be64(dstsrc + 0, s[1]);
+ }
+}
+
+
/* Optimized function for cipher block copying */
static inline void
cipher_block_cpy(void *_dst, const void *_src, size_t blocksize)
diff --git a/cipher/des.c b/cipher/des.c
index a008b93e5..e4d10caa2 100644
--- a/cipher/des.c
+++ b/cipher/des.c
@@ -881,7 +881,6 @@ _gcry_3des_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
const unsigned char *inbuf = inbuf_arg;
unsigned char tmpbuf[DES_BLOCKSIZE];
int burn_stack_depth = TRIPLEDES_ECB_BURN_STACK;
- int i;
#ifdef USE_AMD64_ASM
{
@@ -913,12 +912,7 @@ _gcry_3des_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
outbuf += DES_BLOCKSIZE;
inbuf += DES_BLOCKSIZE;
/* Increment the counter. */
- for (i = DES_BLOCKSIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add(ctr, 1, DES_BLOCKSIZE);
}
wipememory(tmpbuf, sizeof(tmpbuf));
diff --git a/cipher/rijndael.c b/cipher/rijndael.c
index 80945376b..1001b1d52 100644
--- a/cipher/rijndael.c
+++ b/cipher/rijndael.c
@@ -928,7 +928,6 @@ _gcry_aes_ctr_enc (void *context, unsigned char *ctr,
unsigned char *outbuf = outbuf_arg;
const unsigned char *inbuf = inbuf_arg;
unsigned int burn_depth = 0;
- int i;
if (0)
;
@@ -970,12 +969,7 @@ _gcry_aes_ctr_enc (void *context, unsigned char *ctr,
outbuf += BLOCKSIZE;
inbuf += BLOCKSIZE;
/* Increment the counter. */
- for (i = BLOCKSIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add(ctr, 1, BLOCKSIZE);
}
wipememory(&tmp, sizeof(tmp));
diff --git a/cipher/serpent.c b/cipher/serpent.c
index 8e3faa7c5..71d843d00 100644
--- a/cipher/serpent.c
+++ b/cipher/serpent.c
@@ -912,7 +912,6 @@ _gcry_serpent_ctr_enc(void *context, unsigned char *ctr,
const unsigned char *inbuf = inbuf_arg;
unsigned char tmpbuf[sizeof(serpent_block_t)];
int burn_stack_depth = 2 * sizeof (serpent_block_t);
- int i;
#ifdef USE_AVX2
if (ctx->use_avx2)
@@ -1006,12 +1005,7 @@ _gcry_serpent_ctr_enc(void *context, unsigned char *ctr,
outbuf += sizeof(serpent_block_t);
inbuf += sizeof(serpent_block_t);
/* Increment the counter. */
- for (i = sizeof(serpent_block_t); i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add(ctr, 1, sizeof(serpent_block_t));
}
wipememory(tmpbuf, sizeof(tmpbuf));
diff --git a/cipher/twofish.c b/cipher/twofish.c
index 51982c530..417d73781 100644
--- a/cipher/twofish.c
+++ b/cipher/twofish.c
@@ -1105,7 +1105,6 @@ _gcry_twofish_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
const unsigned char *inbuf = inbuf_arg;
unsigned char tmpbuf[TWOFISH_BLOCKSIZE];
unsigned int burn, burn_stack_depth = 0;
- int i;
#ifdef USE_AVX2
if (ctx->use_avx2)
@@ -1165,12 +1164,7 @@ _gcry_twofish_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg,
outbuf += TWOFISH_BLOCKSIZE;
inbuf += TWOFISH_BLOCKSIZE;
/* Increment the counter. */
- for (i = TWOFISH_BLOCKSIZE; i > 0; i--)
- {
- ctr[i-1]++;
- if (ctr[i-1])
- break;
- }
+ cipher_block_add(ctr, 1, TWOFISH_BLOCKSIZE);
}
wipememory(tmpbuf, sizeof(tmpbuf));
More information about the Gcrypt-devel
mailing list