/* main.c - Application main entry point */ /* * Copyright (c) 2020 Olaf Landsiedel * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include "record_storage.h" #include "tek_storage.h" #include "sync_service.h" #include "tracing.h" #include "bloom.h" /** * Fill the bloom filter with all stored records. */ void fill_bloom_with_stored_records(bloom_filter_t* bloom) { // init iterator for filling bloom filter record_iterator_t iterator; int rc = ens_records_iterator_init_timerange(&iterator, NULL, NULL); if (rc) { printk("init iterator failed0 (err %d)\n", rc); return; } // fill bloom filter with records record_t* current; while ((current = ens_records_iterator_next(&iterator))) { bloom_add_record(bloom, &(current->rolling_proximity_identifier)); } } void main(void) { int err = 0; printk("Starting Contact-Tracing Wristband...\n"); // Use custom randomization as the mbdet_tls context initialization messes with the Zeyhr BLE stack. err = en_init(sys_csrand_get); if (err) { printk("Crypto init failed (err %d)\n", err); return; } err = record_storage_init(true); if (err) { printk("init record storage failed (err %d)\n", err); return; } err = tek_storage_init(false); if (err) { printk("init key storage failed (err %d)\n", err); return; } k_msleep(10000); printk("Filling record storage...\n"); reset_record_storage(); tek_t tek; ENPeriodIdentifierKey pik; tek_storage_get_latest_at_ts(&tek, 0); en_derive_period_identifier_key(&pik, &tek.tek); bloom_filter_t* bf = bloom_init(0); // size not used atm /// we now fill the whole flash memory with stupid data for (int i = 0; i < CONFIG_ENS_MAX_CONTACTS; ++i) { record_t dummy_record; en_derive_interval_identifier((ENIntervalIdentifier*)&dummy_record.rolling_proximity_identifier, &pik, i); dummy_record.timestamp = i; // very clever! ;) bloom_add_record(bf, &dummy_record.rolling_proximity_identifier); if (!bloom_probably_has_record(bf, &dummy_record.rolling_proximity_identifier)) { printk("error! bloom_probably_has_record\n"); } } printk("Done...\n"); k_msleep(2000); printk("Creating bloom filter...\n"); fill_bloom_with_stored_records(bf); printk("Done...\n"); k_msleep(3000); do { printk("Checking keys...\n"); for(int k = 0; k < 144; k++) { ENIntervalIdentifier rpi; en_derive_period_identifier_key(&pik, &tek.tek); // derive all RPIs for (int j = 0; j < 144; j++) { // we assume that at least one out of 144 RPIs was met (this is still a lot actually!) uint32_t interval = j == 0 ? (CONFIG_ENS_MAX_CONTACTS / 144)*k : (CONFIG_ENS_MAX_CONTACTS+1); en_derive_interval_identifier(&rpi, &pik, interval); //one of each is actually uint32_t num_met = 0; if (bloom_probably_has_record(bf, &rpi)) { num_met++; /* record_iterator_t iterator; time_t start = interval == 0 ? 0 : (interval+(CONFIG_ENS_MAX_CONTACTS-1)) % CONFIG_ENS_MAX_CONTACTS; time_t end = (interval+(CONFIG_ENS_MAX_CONTACTS+1)) % CONFIG_ENS_MAX_CONTACTS; int rc = ens_records_iterator_init_timerange(&iterator, &start, &end); if (rc) { // on error, skip this rpi printk("iterator error! %d\n", rc); continue; } record_t* current; while ((current = ens_records_iterator_next(&iterator))) { if (memcmp(&(current->rolling_proximity_identifier), rpi.b, sizeof(current->rolling_proximity_identifier)) == 0) { num_met++; } } ens_record_iterator_clear(&iterator);*/ } if(j == 0 && num_met == 0) { printk("Met mismatch! %u\n", num_met); } } } k_sleep(K_MSEC(2000)); } while (1); }