#include <stdio.h>
#include <string.h>
#include <stddef.h>
+#include <time.h>
#include <openssl/crypto.h>
#include <openssl/rand.h>
// Rolling proximity identifier
Rpi * rpi;
- uint32_t day_number;
- uint8_t time_interval_number;
-
uint32_t status;
};
result = ((data->status & STATUS_TK) != 0);
if (result) {
- result = contrac_generate_daily_key(data->dtk, data, day_number);
+ result = dtk_generate_daily_key(data->dtk, data, day_number);
}
if (result) {
- data->day_number = day_number;
data->status |= STATUS_DTK;
}
}
if (result) {
- data->time_interval_number = time_interval_number;
data->status |= STATUS_RPI;
}
}
}
+bool contrac_update_current_time(Contrac * data) {
+ bool result;
+ time_t epoch;
+ uint32_t dn_stored;
+ uint32_t dn_now;
+ uint8_t tn_stored;
+ uint8_t tn_now;
+
+ result = true;
+
+ if ((data->status & STATUS_TK) == 0) {
+ // No Tracing Key has been set, so generate a random key
+ result = contrac_generate_tracing_key(data);
+ }
+
+ epoch = time(NULL);
+
+ if (result) {
+ dn_now = epoch_to_day_number(epoch);
+ dn_stored = dtk_get_day_number(data->dtk);
+
+ // Only set again if uninitialised or the time has changed
+ if ((dn_now != dn_stored) || ((data->status & STATUS_DTK) == 0)) {
+ result = contrac_set_day_number(data, dn_now);
+ }
+ }
+ if (result) {
+ tn_now = epoch_to_time_interval_number(epoch);
+ tn_stored= rpi_get_time_interval_number(data->rpi);
+ // Only set again if uninitialised or the time has changed
+ if ((tn_now != tn_stored) || (dn_now != dn_stored) || ((data->status & STATUS_RPI) == 0)) {
+ result = contrac_set_time_interval_number(data, tn_now);
+ }
+ }
+ return result;
+}