Skip to content

Commit

Permalink
faces/totp: avoid displaying when key is invalid
Browse files Browse the repository at this point in the history
Fixes a division by zero bug caused by calling getCodeFromTimestamp
without having initialized the TOTP library with a secret first.
This was happening because the face calls totp_display on activation,
meaning the validity of the secret was not checked since this is
done in the generate function.

Now the validity of the key is determined solely by the size
of the current decoded key. A general display function checks it
and decides whether to display the code or just the error message.

The size of the current decoded key is initialized to zero
on watch face activation, ensuring fail safe operation.

Tested-by: Matheus Afonso Martins Moreira <[email protected]>
Signed-off-by: Matheus Afonso Martins Moreira <[email protected]>
GitHub-Pull-Request: joeycastillo#385
  • Loading branch information
matheusmoreira committed Mar 20, 2024
1 parent 0c204bb commit 85278b9
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions movement/watch_faces/complication/totp_face.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,20 +94,21 @@ static void totp_validate_key_lengths(void) {
}
}

static bool totp_generate(totp_state_t *totp_state) {
static void totp_generate(totp_state_t *totp_state) {
totp_t *totp = totp_current(totp_state);

if (totp->encoded_key_length <= 0) {
// Key exceeded static limits and was turned off
return false;
totp_state->current_decoded_key_length = 0;
return;
}

totp_state->current_decoded_key_length = base32_decode(totp->encoded_key, totp_state->current_decoded_key);

if (totp_state->current_decoded_key_length == 0) {
// Decoding failed for some reason
// Not a base 32 string?
return false;
return;
}

TOTP(
Expand All @@ -116,8 +117,6 @@ static bool totp_generate(totp_state_t *totp_state) {
totp->period,
totp->algorithm
);

return true;
}

static void totp_display_error(totp_state_t *totp_state) {
Expand All @@ -128,7 +127,7 @@ static void totp_display_error(totp_state_t *totp_state) {
watch_display_string(buf, 0);
}

static void totp_display(totp_state_t *totp_state) {
static void totp_display_code(totp_state_t *totp_state) {
char buf[14];
div_t result;
uint8_t valid_for;
Expand All @@ -145,14 +144,19 @@ static void totp_display(totp_state_t *totp_state) {
watch_display_string(buf, 0);
}

static void totp_generate_and_display(totp_state_t *totp_state) {
if (totp_generate(totp_state)) {
totp_display(totp_state);
static void totp_display(totp_state_t *totp_state) {
if (totp_state->current_decoded_key_length > 0) {
totp_display_code(totp_state);
} else {
totp_display_error(totp_state);
}
}

static void totp_generate_and_display(totp_state_t *totp_state) {
totp_generate(totp_state);
totp_display(totp_state);
}

static inline uint32_t totp_compute_base_timestamp(movement_settings_t *settings) {
return watch_utility_date_time_to_unix_time(watch_rtc_get_date_time(), movement_timezone_offsets[settings->bit.time_zone] * 60);
}
Expand Down

0 comments on commit 85278b9

Please sign in to comment.