Fix key rotation. Now also rotates cert & metadata.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -1031,9 +1031,85 @@ static int cmd_move_key() {
|
|||||||
if (!(efs = search_by_fid(from, NULL, SPECIFY_EF)) || (!(efd = search_by_fid(to, NULL, SPECIFY_EF)) && to != 0xFF)) {
|
if (!(efs = search_by_fid(from, NULL, SPECIFY_EF)) || (!(efd = search_by_fid(to, NULL, SPECIFY_EF)) && to != 0xFF)) {
|
||||||
return SW_FILE_NOT_FOUND();
|
return SW_FILE_NOT_FOUND();
|
||||||
}
|
}
|
||||||
|
uint16_t cert_from_fid = 0;
|
||||||
|
uint16_t cert_to_fid = 0;
|
||||||
|
if (from == EF_PIV_KEY_AUTHENTICATION) {
|
||||||
|
cert_from_fid = EF_PIV_AUTHENTICATION;
|
||||||
|
}
|
||||||
|
else if (from == EF_PIV_KEY_SIGNATURE) {
|
||||||
|
cert_from_fid = EF_PIV_SIGNATURE;
|
||||||
|
}
|
||||||
|
else if (from == EF_PIV_KEY_KEYMGM) {
|
||||||
|
cert_from_fid = EF_PIV_KEY_MANAGEMENT;
|
||||||
|
}
|
||||||
|
else if (from == EF_PIV_KEY_CARDAUTH) {
|
||||||
|
cert_from_fid = EF_PIV_CARD_AUTH;
|
||||||
|
}
|
||||||
|
else if (from == EF_PIV_KEY_RETIRED18) {
|
||||||
|
cert_from_fid = EF_PIV_RETIRED18;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cert_from_fid = from + 0xC08B;
|
||||||
|
}
|
||||||
|
if (to != 0xFF) {
|
||||||
|
if (to == EF_PIV_KEY_AUTHENTICATION) {
|
||||||
|
cert_to_fid = EF_PIV_AUTHENTICATION;
|
||||||
|
}
|
||||||
|
else if (to == EF_PIV_KEY_SIGNATURE) {
|
||||||
|
cert_to_fid = EF_PIV_SIGNATURE;
|
||||||
|
}
|
||||||
|
else if (to == EF_PIV_KEY_KEYMGM) {
|
||||||
|
cert_to_fid = EF_PIV_KEY_MANAGEMENT;
|
||||||
|
}
|
||||||
|
else if (to == EF_PIV_KEY_CARDAUTH) {
|
||||||
|
cert_to_fid = EF_PIV_CARD_AUTH;
|
||||||
|
}
|
||||||
|
else if (to == EF_PIV_KEY_RETIRED18) {
|
||||||
|
cert_to_fid = EF_PIV_RETIRED18;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cert_to_fid = to + 0xC08B;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (to != 0xFF) {
|
if (to != 0xFF) {
|
||||||
file_put_data(efd, file_get_data(efs), file_get_size(efs));
|
file_put_data(efd, file_get_data(efs), file_get_size(efs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file_t *ef_cert_from = search_by_fid(cert_from_fid, NULL, SPECIFY_EF);
|
||||||
|
if (to != 0xFF) {
|
||||||
|
file_t *ef_cert_to = search_by_fid(cert_to_fid, NULL, SPECIFY_EF);
|
||||||
|
if (!ef_cert_to) {
|
||||||
|
return SW_FILE_NOT_FOUND();
|
||||||
|
}
|
||||||
|
if (file_has_data(ef_cert_from)) {
|
||||||
|
file_put_data(ef_cert_to, file_get_data(ef_cert_from), file_get_size(ef_cert_from));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
flash_clear_file(ef_cert_to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ef_cert_from) {
|
||||||
|
flash_clear_file(ef_cert_from);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *meta_src = NULL;
|
||||||
|
int meta_len = meta_find(from, &meta_src);
|
||||||
|
if (to != 0xFF) {
|
||||||
|
if (meta_len > 0 && meta_src != NULL) {
|
||||||
|
uint8_t *meta_copy = (uint8_t *)calloc(1, (size_t)meta_len);
|
||||||
|
if (!meta_copy) {
|
||||||
|
return SW_MEMORY_FAILURE();
|
||||||
|
}
|
||||||
|
memcpy(meta_copy, meta_src, (size_t)meta_len);
|
||||||
|
meta_add(to, meta_copy, (uint16_t)meta_len);
|
||||||
|
free(meta_copy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
meta_delete(to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
meta_delete(from);
|
||||||
flash_clear_file(efs);
|
flash_clear_file(efs);
|
||||||
low_flash_available();
|
low_flash_available();
|
||||||
return SW_OK();
|
return SW_OK();
|
||||||
|
|||||||
Reference in New Issue
Block a user