From 429b12c8b5064f3abc7ca4c1d748cd5544d15b29 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 19 Jul 2024 18:22:44 +0200 Subject: [PATCH] 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 --- pySim-trace.py | 7 ++++++ pySim/apdu_source/stdin_hex.py | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 pySim/apdu_source/stdin_hex.py diff --git a/pySim-trace.py b/pySim-trace.py index 09e95847..0aa1e9c0 100755 --- a/pySim-trace.py +++ b/pySim-trace.py @@ -23,6 +23,7 @@ from pySim.apdu_source.gsmtap import GsmtapApduSource 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 = subparsers.add_parser('tca-loader-log', help=""" 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 @@ if __name__ == '__main__': 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 00000000..67eeb7dd --- /dev/null +++ b/pySim/apdu_source/stdin_hex.py @@ -0,0 +1,39 @@ +# coding=utf-8 + +# (C) 2024 by Harald Welte +# +# 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 . + + +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))