From 0e1512a135a447e29d2fb2a5c5180488650fa50a Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Fri, 6 Mar 2026 18:55:30 +0100 Subject: [PATCH] Fix rename oath when old name starts with the newer. Signed-off-by: Pol Henarejos --- src/fido/oath.c | 2 +- tests/pico-fido/test_070_oath.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/fido/oath.c b/src/fido/oath.c index f8de9a7..46a9d5e 100644 --- a/src/fido/oath.c +++ b/src/fido/oath.c @@ -625,7 +625,7 @@ int cmd_rename() { if (asn1_find_tag(&ctxi, TAG_NAME, &new_name) == false) { return SW_WRONG_DATA(); } - if (memcmp(name.data, new_name.data, name.len) == 0) { + if (name.len == new_name.len && memcmp(name.data, new_name.data, name.len) == 0) { return SW_WRONG_DATA(); } file_t *ef = find_oath_cred(name.data, name.len); diff --git a/tests/pico-fido/test_070_oath.py b/tests/pico-fido/test_070_oath.py index 719e86b..0bc85fe 100644 --- a/tests/pico-fido/test_070_oath.py +++ b/tests/pico-fido/test_070_oath.py @@ -25,6 +25,7 @@ INS_PUT = 0x01 INS_DELETE = 0x02 INS_SET_CODE = 0x03 INS_RESET = 0x04 +INS_RENAME = 0x05 INS_LIST = 0xa1 INS_CALCULATE = 0xa2 INS_VALIDATE = 0xa3 @@ -89,6 +90,24 @@ def test_life(reset_oath): resp = list_apdu(reset_oath) assert(len(resp) == 0) + +def test_rename_prefix_extension(reset_oath): + old_name = b"30/test" + new_name = b"30/test2" + key = list(bytes(b"foo bar")) + + put_data = [TAG_NAME, len(old_name)] + list(old_name) + put_data += [TAG_KEY, len(key) + 2, TYPE_TOTP | ALG_SHA1, 6] + key + send_apdu(reset_oath, INS_PUT, p1=0, p2=0, data=put_data) + + rename_data = [TAG_NAME, len(old_name)] + list(old_name) + rename_data += [TAG_NAME, len(new_name)] + list(new_name) + send_apdu(reset_oath, INS_RENAME, p1=0, p2=0, data=rename_data) + + resp = list_apdu(reset_oath) + exp = [TAG_NAME_LIST, len(new_name) + 1, TYPE_TOTP | ALG_SHA1] + list(new_name) + assert resp == exp + def test_overwrite(reset_oath): data = data_name + data_key resp = send_apdu(reset_oath, INS_PUT, p1=0, p2=0, data=list(data))