diff options
author | Richard van der Hoff <richard@matrix.org> | 2016-05-24 17:33:41 +0100 |
---|---|---|
committer | Richard van der Hoff <richard@matrix.org> | 2016-05-24 17:33:41 +0100 |
commit | ef8d24f4839352963f8d0b53919016c35f492a22 (patch) | |
tree | 6fecb0f166aefa53edd5ec7e44b024bd2d506aa4 /src | |
parent | f3c0dd76d73368a872d7acb2ffa293330f875089 (diff) |
megolm.c: rewrite counter update
We no longer need to keep track of intermediate values of the counter, which
means we can update it much more easily.
Diffstat (limited to 'src')
-rw-r--r-- | src/megolm.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/src/megolm.c b/src/megolm.c index efefc11..9e28f8d 100644 --- a/src/megolm.c +++ b/src/megolm.c @@ -105,26 +105,21 @@ void megolm_advance_to(Megolm *megolm, uint32_t advance_to) { /* starting with R0, see if we need to update each part of the hash */ for (j = 0; j < (int)MEGOLM_RATCHET_PARTS; j++) { int shift = (MEGOLM_RATCHET_PARTS-j-1) * 8; - uint32_t increment = 1 << shift; - uint32_t next_counter; + uint32_t mask = (~(uint32_t)0) << shift; /* how many times to we need to rehash this part? */ int steps = (advance_to >> shift) - (megolm->counter >> shift); + if (steps == 0) { continue; } - megolm->counter = megolm->counter & ~(increment - 1); - next_counter = megolm->counter + increment; - /* for all but the last step, we can just bump R(j) without regard * to R(j+1)...R(3). */ while (steps > 1) { rehash_part(megolm->data, j, j); - megolm->counter = next_counter; steps --; - next_counter = megolm->counter + increment; } /* on the last step (except for j=3), we need to bump at least R(j+1); @@ -152,6 +147,6 @@ void megolm_advance_to(Megolm *megolm, uint32_t advance_to) { rehash_part(megolm->data, j, k); k--; } - megolm->counter = next_counter; + megolm->counter = advance_to & mask; } } |