Fix handling of integer wraparound in megolm.c
This commit is contained in:
parent
1f31427139
commit
01ea3d4b9a
2 changed files with 22 additions and 2 deletions
|
@ -108,8 +108,12 @@ void megolm_advance_to(Megolm *megolm, uint32_t advance_to) {
|
||||||
uint32_t mask = (~(uint32_t)0) << shift;
|
uint32_t mask = (~(uint32_t)0) << shift;
|
||||||
int k;
|
int k;
|
||||||
|
|
||||||
/* how many times to we need to rehash this part? */
|
/* how many times do we need to rehash this part?
|
||||||
int steps = (advance_to >> shift) - (megolm->counter >> shift);
|
*
|
||||||
|
* '& 0xff' ensures we handle integer wraparound correctly
|
||||||
|
*/
|
||||||
|
unsigned int steps =
|
||||||
|
((advance_to >> shift) - (megolm->counter >> shift)) & 0xff;
|
||||||
|
|
||||||
if (steps == 0) {
|
if (steps == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -82,4 +82,20 @@ std::uint8_t random_bytes[] =
|
||||||
assert_equals(expected3, megolm_get_data(&mr), MEGOLM_RATCHET_LENGTH);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue