From d74caff4b1585d03efb6ce4ed6d52d7642be85e7 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 15 Jul 2026 22:50:44 +0200 Subject: [PATCH] Rolls back generated AES keys if metadata storage fails. Signed-off-by: Pol Henarejos --- src/hsm/cmd_key_gen.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/hsm/cmd_key_gen.c b/src/hsm/cmd_key_gen.c index 9bdeeae..053d323 100644 --- a/src/hsm/cmd_key_gen.c +++ b/src/hsm/cmd_key_gen.c @@ -19,6 +19,22 @@ #include "sc_hsm.h" #include "random.h" +static void rollback_generated_key(uint8_t key_id) { + file_t *fkey = file_search((KEY_PREFIX << 8) | key_id); + file_t *fprkd = file_search((PRKD_PREFIX << 8) | key_id); + bool changed = false; + + if (fkey && file_delete_no_commit(fkey) == PICOKEYS_OK) { + changed = true; + } + if (fprkd && file_delete_no_commit(fprkd) == PICOKEYS_OK) { + changed = true; + } + if (changed) { + flash_commit(); + } +} + int cmd_key_gen(void) { uint8_t key_id = P1(apdu); uint8_t p2 = P2(apdu); @@ -57,9 +73,11 @@ int cmd_key_gen(void) { } r = store_keys(aes_key, aes_type, key_id); if (r != PICOKEYS_OK) { + rollback_generated_key(key_id); return SW_MEMORY_FAILURE(); } if (find_and_store_meta_key(key_id) != PICOKEYS_OK) { + rollback_generated_key(key_id); return SW_EXEC_ERROR(); } flash_commit();