diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py index 00c7bd9f..d720259f 100644 --- a/pySim/transport/__init__.py +++ b/pySim/transport/__init__.py @@ -4,6 +4,7 @@ """ from pySim.exceptions import * +from pySim.utils import sw_match # # Copyright (C) 2009-2010 Sylvain Munaut @@ -93,14 +94,6 @@ class LinkBase(object): """ rv = self.send_apdu(pdu) - # Create a masked version of the returned status word - sw_masked = "" - for i in range(0, 4): - if sw.lower()[i] == '?': - sw_masked = sw_masked + '?' - else: - sw_masked = sw_masked + rv[1][i].lower() - - if sw.lower() != sw_masked: + if not sw_match(rv[1], sw): raise SwMatchError(rv[1], sw.lower()) return rv diff --git a/pySim/utils.py b/pySim/utils.py index a733d876..bfa147b4 100644 --- a/pySim/utils.py +++ b/pySim/utils.py @@ -759,3 +759,17 @@ def get_addr_type(addr): return 0x00 return None + +def sw_match(sw, pattern): + """Match given SW against given pattern.""" + # Create a masked version of the returned status word + sw_lower = sw.lower() + sw_masked = "" + for i in range(0, 4): + if sw_lower[i] == '?': + sw_masked = sw_masked + '?' + elif sw_lower[i] == 'x': + sw_masked = sw_masked + 'x' + else: + sw_masked = sw_masked + sw_lower[i] + return sw_masked == pattern