Fix Key Domain deletion.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -853,7 +853,7 @@ uint8_t get_key_domain(file_t *fkey) {
|
|||||||
const uint8_t *meta_tag = get_meta_tag(fkey, 0x92, &tag_len);
|
const uint8_t *meta_tag = get_meta_tag(fkey, 0x92, &tag_len);
|
||||||
if (meta_tag)
|
if (meta_tag)
|
||||||
return *meta_tag;
|
return *meta_tag;
|
||||||
return 0;
|
return 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_key_counter(file_t *fkey) {
|
uint32_t get_key_counter(file_t *fkey) {
|
||||||
@@ -911,6 +911,16 @@ uint32_t decrement_key_counter(file_t *fkey) {
|
|||||||
return 0xffffffff;
|
return 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int delete_file(file_t *ef) {
|
||||||
|
meta_delete(ef->fid);
|
||||||
|
if (flash_clear_file(ef) != CCID_OK)
|
||||||
|
return CCID_EXEC_ERROR;
|
||||||
|
if (delete_dynamic_file(ef) != CCID_OK)
|
||||||
|
return CCID_EXEC_ERROR;
|
||||||
|
low_flash_available();
|
||||||
|
return CCID_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int cmd_key_domain() {
|
static int cmd_key_domain() {
|
||||||
//if (dkeks == 0)
|
//if (dkeks == 0)
|
||||||
// return SW_COMMAND_NOT_ALLOWED();
|
// return SW_COMMAND_NOT_ALLOWED();
|
||||||
@@ -977,14 +987,18 @@ static int cmd_key_domain() {
|
|||||||
}
|
}
|
||||||
if (flash_write_data_to_file(tf_kd, t, tf_kd_size) != CCID_OK)
|
if (flash_write_data_to_file(tf_kd, t, tf_kd_size) != CCID_OK)
|
||||||
return SW_EXEC_ERROR();
|
return SW_EXEC_ERROR();
|
||||||
uint8_t dk[DKEK_KEY_SIZE];
|
file_t *tf = NULL;
|
||||||
memset(dk, 0, sizeof(dk));
|
if ((tf = search_dynamic_file(EF_DKEK+p2))) {
|
||||||
if (store_dkek_key(p2, dk) != CCID_OK)
|
if (delete_file(tf) != CCID_OK)
|
||||||
return SW_EXEC_ERROR();
|
return SW_EXEC_ERROR();
|
||||||
low_flash_available();
|
}
|
||||||
|
if ((tf = search_dynamic_file(EF_XKEK+p2))) {
|
||||||
|
if (delete_file(tf) != CCID_OK)
|
||||||
|
return SW_EXEC_ERROR();
|
||||||
|
}
|
||||||
return SW_OK();
|
return SW_OK();
|
||||||
}
|
}
|
||||||
else if (p1 == 0x2) {
|
else if (p1 == 0x2) { //XKEK Key Domain creation
|
||||||
if (apdu.nc > 0) {
|
if (apdu.nc > 0) {
|
||||||
size_t pub_len = 0;
|
size_t pub_len = 0;
|
||||||
const uint8_t *pub = cvc_get_pub(termca+2, (termca[1] << 8 | termca[0]), &pub_len);
|
const uint8_t *pub = cvc_get_pub(termca+2, (termca[1] << 8 | termca[0]), &pub_len);
|
||||||
@@ -1294,12 +1308,8 @@ static int cmd_delete_file() {
|
|||||||
}
|
}
|
||||||
if (!authenticate_action(ef, ACL_OP_DELETE_SELF))
|
if (!authenticate_action(ef, ACL_OP_DELETE_SELF))
|
||||||
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
return SW_SECURITY_STATUS_NOT_SATISFIED();
|
||||||
meta_delete(ef->fid);
|
if (delete_file(ef) != CCID_OK)
|
||||||
if (flash_clear_file(ef) != CCID_OK)
|
|
||||||
return SW_EXEC_ERROR();
|
return SW_EXEC_ERROR();
|
||||||
if (delete_dynamic_file(ef) != CCID_OK)
|
|
||||||
return SW_EXEC_ERROR();
|
|
||||||
low_flash_available();
|
|
||||||
return SW_OK();
|
return SW_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user