laforge submitted this change.

View Change


Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved
global_platform: add delete_key and delete_card_content

This GlobalPlatform command is used to delete applications/load-files
or keys.

Change-Id: Ib5d18e983d0e918633d7c090c54fb9a3384a22e5
---
M docs/shell.rst
M pySim/global_platform/__init__.py
2 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/docs/shell.rst b/docs/shell.rst
index aed9565..4d6839b 100644
--- a/docs/shell.rst
+++ b/docs/shell.rst
@@ -965,12 +965,24 @@
:module: pySim.global_platform
:func: ADF_SD.AddlShellCommands.put_key_parser

+delete_key
+~~~~~~~~~~
+.. argparse::
+ :module: pySim.global_platform
+ :func: ADF_SD.AddlShellCommands.del_key_parser
+
install_for_personalization
~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. argparse::
:module: pySim.global_platform
:func: ADF_SD.AddlShellCommands.inst_perso_parser

+delete_card_content
+~~~~~~~~~~~~~~~~~~~
+.. argparse::
+ :module: pySim.global_platform
+ :func: ADF_SD.AddlShellCommands.del_cc_parser
+
establish_scp02
~~~~~~~~~~~~~~~
.. argparse::
diff --git a/pySim/global_platform/__init__.py b/pySim/global_platform/__init__.py
index 17be946..e32b47e 100644
--- a/pySim/global_platform/__init__.py
+++ b/pySim/global_platform/__init__.py
@@ -626,6 +626,45 @@
cmd_hex = "80E6%02x%02x%02x%s" % (p1, p2, len(data)//2, data)
return self._cmd.lchan.scc.send_apdu_checksw(cmd_hex)

+ del_cc_parser = argparse.ArgumentParser()
+ del_cc_parser.add_argument('aid', type=is_hexstr,
+ help='Executable Load File or Application AID')
+ del_cc_parser.add_argument('--delete-related-objects', action='store_true',
+ help='Delete not only the object but also its related objects')
+
+ @cmd2.with_argparser(del_cc_parser)
+ def do_delete_card_content(self, opts):
+ """Perform a GlobalPlatform DELETE [card content] command in order to delete an Executable Load
+ File, an Application or an Executable Load File and its related Applications."""
+ p2 = 0x80 if opts.delete_related_objects else 0x00
+ aid = ApplicationAID(decoded=opts.aid)
+ self.delete(0x00, p2, b2h(aid.to_tlv()))
+
+ del_key_parser = argparse.ArgumentParser()
+ del_key_parser.add_argument('--key-id', type=auto_uint7, help='Key Identifier (KID)')
+ del_key_parser.add_argument('--key-ver', type=auto_uint8, help='Key Version Number (KVN)')
+ del_key_parser.add_argument('--delete-related-objects', action='store_true',
+ help='Delete not only the object but also its related objects')
+
+ @cmd2.with_argparser(del_key_parser)
+ def do_delete_key(self, opts):
+ """Perform GlobalPlaform DELETE (Key) command.
+ If both KID and KVN are specified, exactly one key is deleted. If only either of the two is
+ specified, multiple matching keys may be deleted."""
+ if opts.key_id == None and opts.key_ver == None:
+ raise ValueError('At least one of KID or KVN must be specified')
+ p2 = 0x80 if opts.delete_related_objects else 0x00
+ cmd = ""
+ if opts.key_id != None:
+ cmd += "d001%02x" % opts.key_id
+ if opts.key_ver != None:
+ cmd += "d201%02x" % opts.key_ver
+ self.delete(0x00, p2, cmd)
+
+ def delete(self, p1:int, p2:int, data:Hexstr) -> ResTuple:
+ cmd_hex = "80E4%02x%02x%02x%s" % (p1, p2, len(data)//2, data)
+ return self._cmd.lchan.scc.send_apdu_checksw(cmd_hex)
+
est_scp02_parser = argparse.ArgumentParser()
est_scp02_parser.add_argument('--key-ver', type=auto_uint8, required=True,
help='Key Version Number (KVN)')

To view, visit change 35798. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ib5d18e983d0e918633d7c090c54fb9a3384a22e5
Gerrit-Change-Number: 35798
Gerrit-PatchSet: 5
Gerrit-Owner: laforge <laforge@osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier@sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: laforge <laforge@osmocom.org>
Gerrit-MessageType: merged