Skip to content
Snippets Groups Projects
Commit 01ea3d4b authored by Richard van der Hoff's avatar Richard van der Hoff
Browse files

Fix handling of integer wraparound in megolm.c

parent 1f314271
No related branches found
No related tags found
No related merge requests found
......@@ -108,8 +108,12 @@ void megolm_advance_to(Megolm *megolm, uint32_t advance_to) {
uint32_t mask = (~(uint32_t)0) << shift;
int k;
/* how many times to we need to rehash this part? */
int steps = (advance_to >> shift) - (megolm->counter >> shift);
/* how many times do we need to rehash this part?
*
* '& 0xff' ensures we handle integer wraparound correctly
*/
unsigned int steps =
((advance_to >> shift) - (megolm->counter >> shift)) & 0xff;
if (steps == 0) {
continue;
......
......@@ -82,4 +82,20 @@ std::uint8_t random_bytes[] =
assert_equals(expected3, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
}
{
TestCase test_case("Megolm::advance wraparound");
Megolm mr1, mr2;
megolm_init(&mr1, random_bytes, 0xffffffffUL);
megolm_advance_to(&mr1, 0x1000000);
assert_equals(0x1000000U, mr1.counter);
megolm_init(&mr2, random_bytes, 0);
megolm_advance_to(&mr2, 0x2000000);
assert_equals(0x2000000U, mr2.counter);
assert_equals(megolm_get_data(&mr2), megolm_get_data(&mr1), MEGOLM_RATCHET_LENGTH);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment