Migrating to static memory to avoid malloc for new files. Let's see how it works.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos
2022-02-23 12:00:34 +01:00
parent 41b1467ab7
commit c29f8d6cc5
2 changed files with 42 additions and 32 deletions

65
file.c
View File

@@ -135,10 +135,9 @@ file_t *file_retries_pin1 = NULL;
file_t *file_sopin = NULL;
file_t *file_retries_sopin = NULL;
file_chain_t *ef_prkdf = NULL;
file_chain_t *ef_kf = NULL;
file_chain_t *ef_pukdf = NULL;
file_chain_t *ef_cdf = NULL;
#define MAX_DYNAMIC_FILES 64
uint16_t dynamic_files = 0;
file_t dynamic_file[MAX_DYNAMIC_FILES];
bool card_terminated = false;
@@ -234,27 +233,26 @@ void initialize_chain(file_chain_t **chain) {
file_chain_t *next;
for (file_chain_t *f = *chain; f; f = next) {
next = f->next;
free(f->file);
free(f);
}
*chain = NULL;
}
void initialize_flash() {
const uint8_t empty[8] = { 0 };
flash_program_block(end_data_pool, empty, sizeof(empty));
low_flash_available();
initialize_chain(&ef_prkdf);
initialize_chain(&ef_pukdf);
initialize_chain(&ef_kf);
initialize_chain(&ef_cdf);
void initialize_flash(bool hard) {
if (hard) {
const uint8_t empty[8] = { 0 };
flash_program_block(end_data_pool, empty, sizeof(empty));
low_flash_available();
}
for (file_t *f = file_entries; f != file_last; f++) {
if ((f->type & FILE_FLASH) == FILE_FLASH)
f->data = NULL;
}
dynamic_files = 0;
}
void scan_flash() {
initialize_flash(false); //soft initialization
if (*(uintptr_t *)end_data_pool == 0xffffffff && *(uintptr_t *)(end_data_pool+sizeof(uintptr_t)) == 0xffffffff)
{
printf("First initialization (or corrupted!)\r\n");
@@ -274,21 +272,18 @@ void scan_flash() {
printf("scan fid %x\r\n",fid);
file_t *file = (file_t *)search_by_fid(fid, NULL, SPECIFY_EF);
if (!file) {
file = file_new(fid);
if ((fid & 0xff00) == (KEY_PREFIX << 8)) {
file = file_new(fid);
add_file_to_chain(file, &ef_kf);
//add_file_to_chain(file, &ef_kf);
}
else if ((fid & 0xff00) == (PRKD_PREFIX << 8)) {
file = file_new(fid);
add_file_to_chain(file, &ef_prkdf);
//add_file_to_chain(file, &ef_prkdf);
}
else if ((fid & 0xff00) == (CD_PREFIX << 8)) {
file = file_new(fid);
add_file_to_chain(file, &ef_cdf);
//add_file_to_chain(file, &ef_cdf);
}
else if ((fid & 0xff00) == (EE_CERTIFICATE_PREFIX << 8)) {
file = file_new(fid);
add_file_to_chain(file, &ef_pukdf);
//add_file_to_chain(file, &ef_pukdf);
}
else {
TU_LOG1("SCAN FOUND ORPHAN FILE: %x\r\n",fid);
@@ -381,8 +376,22 @@ uint8_t file_read_uint8(const uint8_t *addr) {
return flash_read_uint8((uintptr_t)addr);
}
file_t *search_dynamic_file(uint16_t fid) {
for (int i = 0; i < dynamic_files; i++) {
if (dynamic_file[i].fid == fid)
return &dynamic_file[i];
}
return NULL;
}
file_t *file_new(uint16_t fid) {
file_t *f = (file_t *)malloc(sizeof(file_t));
file_t *f;
if ((f = search_dynamic_file(fid)))
return f;
if (dynamic_files == MAX_DYNAMIC_FILES)
return NULL;
f = &dynamic_file[dynamic_files];
dynamic_files++;
file_t file = {
.fid = fid,
.parent = 5,
@@ -398,11 +407,13 @@ file_t *file_new(uint16_t fid) {
}
file_chain_t *add_file_to_chain(file_t *file, file_chain_t **chain) {
file_chain_t *f_chain = (file_chain_t *)malloc(sizeof(file_chain_t));
f_chain->file = file;
f_chain->next = *chain;
*chain = f_chain;
return f_chain;
if (search_file_chain(file->fid, *chain))
return NULL;
file_chain_t *fc = (file_chain_t *)malloc(sizeof(file_chain_t));
fc->file = file;
fc->next = *chain;
*chain = fc;
return fc;
}
file_t *search_file_chain(uint16_t fid, file_chain_t *chain) {

9
file.h
View File

@@ -81,7 +81,7 @@ extern file_t *search_by_path(const uint8_t *pe_path, uint8_t pathlen, const fil
extern bool authenticate_action(const file_t *ef, uint8_t op);
extern void process_fci(const file_t *pe);
extern void scan_flash();
extern void initialize_flash();
extern void initialize_flash(bool);
extern file_t file_entries[];
@@ -90,10 +90,9 @@ extern uint16_t file_read_uint16(const uint8_t *addr);
extern uint8_t file_read_uint8(const uint8_t *addr);
extern file_t *file_new(uint16_t);
extern file_chain_t *ef_prkdf; //key description
extern file_chain_t *ef_kf; //key blob
extern file_chain_t *ef_pukdf; //cvc csr
extern file_chain_t *ef_cdf; //ce
extern uint16_t dynamic_files;
extern file_t dynamic_file[];
extern file_t *search_dynamic_file(uint16_t);
extern file_chain_t *add_file_to_chain(file_t *file, file_chain_t **chain);
extern file_t *search_file_chain(uint16_t fid, file_chain_t *chain);