ctr_add: replace dead with working code.
authorAndrey Rys <rys@lynxlynx.ru>
Wed, 27 Feb 2019 08:54:12 +0000 (15:54 +0700)
committerAndrey Rys <rys@lynxlynx.ru>
Wed, 27 Feb 2019 08:55:59 +0000 (15:55 +0700)
ctr_add came directly from 2012, and it was always broken.
The original purpose is to add two very large integers.
Still, there is no much to worry about: Threefish 64 bit integers
make it very hard to trigger the old buggy code, and it was only
used to rewind the counter. But it is time to finally fix it.

VERSION
tfctrapi.c
tfdef.h

diff --git a/VERSION b/VERSION
index b4de3947675361a7770d29b8982c407b0ec6b2a0..48082f72f087ce7e6fa75b9c41d7387daecd447b 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-11
+12
index fcd14eef4f0bd2dd2598daa2cb5651489f1a4939..2845b2dba0b820a7a87222810111a6944180d9ba 100644 (file)
@@ -8,7 +8,7 @@ void tf_ctr_set(void *ctr, const void *sctr, size_t sctrsz)
 
        memset(usctr, 0, TF_BLOCK_SIZE);
        memcpy(usctr, sctr, sctrsz > TF_BLOCK_SIZE ? TF_BLOCK_SIZE : sctrsz);
-       ctr_add(uctr, usctr, TF_NR_BLOCK_UNITS);
+       ctr_add(uctr, TF_NR_BLOCK_UNITS, usctr, TF_NR_BLOCK_UNITS);
        data_to_words(uctr, TF_BLOCK_SIZE);
        memset(usctr, 0, TF_BLOCK_SIZE);
 }
diff --git a/tfdef.h b/tfdef.h
index 5450271f12dc9f83989d5e87ecedd0e52d34b656..463e5fb7c0f4d83be1549ef8bdaa7b0666c8658c 100644 (file)
--- a/tfdef.h
+++ b/tfdef.h
@@ -87,31 +87,26 @@ static inline void data_to_words(void *p, size_t l)
 #endif
 }
 
-static inline void ctr_inc(TF_UNIT_TYPE *x, size_t l)
+static inline void ctr_inc(TF_UNIT_TYPE *x, size_t xl)
 {
-       size_t i;
+       size_t z;
 
-       for (i = 0; i < l; i++) {
-               x[i] = ((x[i] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0));
-               if (x[i]) break;
+       for (z = 0; z < xl; z++) {
+               x[z] = ((x[z] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0));
+               if (x[z]) break;
        }
 }
 
-static inline void ctr_add(TF_UNIT_TYPE *x, const TF_UNIT_TYPE *y, size_t l)
+static inline void ctr_add(TF_UNIT_TYPE *x, size_t xl, const TF_UNIT_TYPE *y, size_t yl)
 {
-       size_t i, f = 0;
+       size_t z, cf;
        TF_UNIT_TYPE t;
 
-       for (i = 0; i < l; i++) {
-               t = x[i];
-               x[i] += y[i]; x[i] &= ((TF_UNIT_TYPE)~0);
-               if (x[i] < t) {
-_again:                        f++;
-                       t = x[f-i];
-                       x[f-i]++;
-                       if (x[f-i] < t) goto _again;
-                       else f = 0;
-               }
+       for (z = 0, cf = 0; z < xl; z++) {
+               t = x[z] + (z >= yl ? (TF_UNIT_TYPE)0 : y[z]) + cf;
+               if (cf) cf = (x[z] >= t ? 1 : 0);
+               else cf = (x[z] > t ? 1 : 0);
+               x[z] = t;
        }
 }