[PATCH 6/7] cipher: fold AEAD byte-counter helper to 64-bit accumulator
Jussi Kivilinna
jussi.kivilinna at iki.fi
Fri Jul 24 20:48:05 CEST 2026
* cipher/cipher-internal.h (cipher_bytecounter_add): Rewrite using
64-bit accumulator.
--
cipher_bytecounter_add split size_t addend into high and low halves
with separate carry handling. Load 32-bit counter pair into 64-bit
accumulator, add in one step and split back.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
cipher/cipher-internal.h | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)
diff --git a/cipher/cipher-internal.h b/cipher/cipher-internal.h
index 8e6cbffc..bc023c76 100644
--- a/cipher/cipher-internal.h
+++ b/cipher/cipher-internal.h
@@ -812,23 +812,11 @@ static inline unsigned int _gcry_blocksize_shift(gcry_cipher_hd_t c)
static inline int
cipher_bytecounter_add (u32 ctr[2], size_t add)
{
- int overflow = 0;
- u32 low_add = add;
-
- if (sizeof(add) > sizeof(u32))
- {
- u32 high_add = ((add >> 31) >> 1) & 0xffffffff;
- ctr[1] += high_add;
- if (ctr[1] < high_add)
- overflow = 1;
- }
-
- ctr[0] += low_add;
- if (ctr[0] >= low_add)
- return overflow;
-
- ctr[1] += 1;
- return (ctr[1] < 1) || overflow;
+ u64 bytecounter = ((u64)ctr[1] << 32) + ctr[0];
+ bytecounter += add;
+ ctr[0] = bytecounter;
+ ctr[1] = bytecounter >> 32;
+ return bytecounter < add;
}
--
2.53.0
More information about the Gcrypt-devel
mailing list