Adding delete file command.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
12
file.c
12
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)))
|
||||
|
||||
1
file.h
1
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);
|
||||
|
||||
@@ -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
|
||||
22
sc_hsm.c
22
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}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user