From a4ef5e6d172eda105445dee50dd278f6ecc3622d Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Thu, 24 Feb 2022 16:22:05 +0100 Subject: [PATCH] Adding delete file command. Signed-off-by: Pol Henarejos --- file.c | 12 ++++++++++++ file.h | 1 + hsm2040.h | 1 + sc_hsm.c | 22 ++++++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/file.c b/file.c index dcc04f5..bb2dcb1 100644 --- a/file.c +++ b/file.c @@ -392,6 +392,18 @@ file_t *search_dynamic_file(uint16_t fid) { return NULL; } +int delete_dynamic_file(file_t *f) { + for (int i = 0; i < dynamic_files; i++) { + if (dynamic_file[i].fid == f->fid) { + for (int j = i+1; j < dynamic_files; j++) + memcpy(&dynamic_file[j-1], &dynamic_file[j], sizeof(file_t)); + dynamic_files--; + return HSM_OK; + } + } + return HSM_ERR_FILE_NOT_FOUND; +} + file_t *file_new(uint16_t fid) { file_t *f; if ((f = search_dynamic_file(fid))) diff --git a/file.h b/file.h index f5005b8..f153c9f 100644 --- a/file.h +++ b/file.h @@ -94,6 +94,7 @@ extern file_t *file_new(uint16_t); extern uint16_t dynamic_files; extern file_t dynamic_file[]; extern file_t *search_dynamic_file(uint16_t); +extern int delete_dynamic_file(file_t *f); 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); diff --git a/hsm2040.h b/hsm2040.h index 0caebcf..a59f4d9 100644 --- a/hsm2040.h +++ b/hsm2040.h @@ -112,6 +112,7 @@ void put_binary (const char *s, int len); extern int flash_write_data_to_file(file_t *file, const uint8_t *data, uint16_t len); extern void low_flash_available(); +extern int flash_clear_file(file_t *file); extern pico_unique_board_id_t unique_id; #endif \ No newline at end of file diff --git a/sc_hsm.c b/sc_hsm.c index 658c841..c367af5 100644 --- a/sc_hsm.c +++ b/sc_hsm.c @@ -1071,6 +1071,26 @@ int cmd_update_ef() { return SW_OK(); } +int cmd_delete_file() { + file_t *ef = NULL; + if (apdu.cmd_apdu_data_len == 0) { + ef = currentEF; + if (!(ef = search_dynamic_file(ef->fid))) + return SW_FILE_INVALID(); + } + else { + uint16_t fid = (apdu.cmd_apdu_data[0] << 8) | apdu.cmd_apdu_data[1]; + if (!(ef = search_dynamic_file(fid))) + return SW_FILE_NOT_FOUND(); + } + if (flash_clear_file(ef) != HSM_OK) + return SW_EXEC_ERROR(); + if (delete_dynamic_file(ef) != HSM_OK) + return SW_EXEC_ERROR(); + + return SW_OK(); +} + typedef struct cmd { uint8_t ins; @@ -1088,6 +1108,7 @@ typedef struct cmd #define INS_LIST_KEYS 0x58 #define INS_KEYPAIR_GEN 0x46 #define INS_UPDATE_EF 0xD7 +#define INS_DELETE_FILE 0xE4 static const cmd_t cmds[] = { { INS_SELECT_FILE, cmd_select }, @@ -1101,6 +1122,7 @@ static const cmd_t cmds[] = { { INS_IMPORT_DKEK, cmd_import_dkek }, { INS_KEYPAIR_GEN, cmd_keypair_gen }, { INS_UPDATE_EF, cmd_update_ef }, + { INS_DELETE_FILE, cmd_delete_file }, { 0x00, 0x0} };