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
This commit is contained in:
@@ -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_rspro import PysharkRsproPcap, PysharkRsproLive
|
||||||
from pySim.apdu_source.pyshark_gsmtap import PysharkGsmtapPcap
|
from pySim.apdu_source.pyshark_gsmtap import PysharkGsmtapPcap
|
||||||
from pySim.apdu_source.tca_loader_log import TcaLoaderLogApduSource
|
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
|
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,
|
parser_tcaloader_log.add_argument('-f', '--log-file', required=True,
|
||||||
help='Name of the log file to be read')
|
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__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
opts = option_parser.parse_args()
|
opts = option_parser.parse_args()
|
||||||
@@ -205,6 +210,8 @@ if __name__ == '__main__':
|
|||||||
s = PysharkGsmtapPcap(opts.pcap_file)
|
s = PysharkGsmtapPcap(opts.pcap_file)
|
||||||
elif opts.source == 'tca-loader-log':
|
elif opts.source == 'tca-loader-log':
|
||||||
s = TcaLoaderLogApduSource(opts.log_file)
|
s = TcaLoaderLogApduSource(opts.log_file)
|
||||||
|
elif opts.source == 'stdin-hex':
|
||||||
|
s = StdinHexApduSource()
|
||||||
else:
|
else:
|
||||||
raise ValueError("unsupported source %s", opts.source)
|
raise ValueError("unsupported source %s", opts.source)
|
||||||
|
|
||||||
|
|||||||
39
pySim/apdu_source/stdin_hex.py
Normal file
39
pySim/apdu_source/stdin_hex.py
Normal file
@@ -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))
|
||||||
Reference in New Issue
Block a user