laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37925?usp=email )
Change subject: pySim-trace: pySim.apdu_source.stdin_hex ......................................................................
pySim-trace: pySim.apdu_source.stdin_hex
This introduces an "APDU source" for pySim-trace which enables the decoding of APDUs that are copy+pasted from elsewhere, for example APDU logs in text form created by proprietary tools, or to decode personalization scripts or the like.
Change-Id: I5aacf13b7c27cea9efd42f01dacca61068c3aa33 --- M pySim-trace.py A pySim/apdu_source/stdin_hex.py 2 files changed, 46 insertions(+), 0 deletions(-)
Approvals: dexter: Looks good to me, approved; Verified laforge: Looks good to me, approved Jenkins Builder: Verified
diff --git a/pySim-trace.py b/pySim-trace.py index 09e9584..0aa1e9c 100755 --- a/pySim-trace.py +++ b/pySim-trace.py @@ -23,6 +23,7 @@ from pySim.apdu_source.pyshark_rspro import PysharkRsproPcap, PysharkRsproLive from pySim.apdu_source.pyshark_gsmtap import PysharkGsmtapPcap from pySim.apdu_source.tca_loader_log import TcaLoaderLogApduSource +from pySim.apdu_source.stdin_hex import StdinHexApduSource
from pySim.apdu.ts_102_221 import UiccSelect, UiccStatus
@@ -190,6 +191,10 @@ parser_tcaloader_log.add_argument('-f', '--log-file', required=True, help='Name of the log file to be read')
+parser_stdin_hex = subparsers.add_parser('stdin-hex', help=""" + Read APDUs as hex-string from stdin.""") + + if __name__ == '__main__':
opts = option_parser.parse_args() @@ -205,6 +210,8 @@ s = PysharkGsmtapPcap(opts.pcap_file) elif opts.source == 'tca-loader-log': s = TcaLoaderLogApduSource(opts.log_file) + elif opts.source == 'stdin-hex': + s = StdinHexApduSource() else: raise ValueError("unsupported source %s", opts.source)
diff --git a/pySim/apdu_source/stdin_hex.py b/pySim/apdu_source/stdin_hex.py new file mode 100644 index 0000000..67eeb7d --- /dev/null +++ b/pySim/apdu_source/stdin_hex.py @@ -0,0 +1,39 @@ +# coding=utf-8 + +# (C) 2024 by Harald Welte laforge@osmocom.org +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. + + +from pySim.utils import h2b + +from pySim.apdu.ts_102_221 import ApduCommands as UiccApduCommands +from pySim.apdu.ts_102_222 import ApduCommands as UiccAdmApduCommands +from pySim.apdu.ts_31_102 import ApduCommands as UsimApduCommands +from pySim.apdu.global_platform import ApduCommands as GpApduCommands + +from . import ApduSource, PacketType, CardReset + +ApduCommands = UiccApduCommands + UiccAdmApduCommands + UsimApduCommands + GpApduCommands + +class StdinHexApduSource(ApduSource): + """ApduSource for reading apdu hex-strings from stdin.""" + + def read_packet(self) -> PacketType: + while True: + command = input("C-APDU >") + if len(command) == 0: + continue + response = '9000' + return ApduCommands.parse_cmd_bytes(h2b(command) + h2b(response))