vigddlZddlZddlmZddlmZddlmZddlm Z m Z m Z ddl m Z ddlmZddlmZdd lmZmZmZdd lmZmZmZdd lmZdd lmZGd deZdS)N)Optional)CardConnection) CardRequest)NoCardExceptionCardRequestTimeoutExceptionCardConnectionException)readers)ExclusiveConnectCardConnection)ATR)h2ii2hHexstr) NoCardError ProtocolError ReaderError) LinkBaseTpdu)ResTupleceZdZdZdZejdfdejffd ZdZdd e e d e fd Z d Z defdZdZdZdedefdZdefdZedejfdZxZS) PcscSimLinkz# pySim: PCSC reader transport link.zPC/SCr)pcsc_devoptsc 8tjdi|d|_t}|j:|j}|t |krt d|z|||_n_tj|j }|D]%}| |j r ||_n&|jst d|j z|j |_ t|ddst|j |_ dSdS)NzNo reader found for number %dz%No matching reader found for regex %s pcsc_sharedF)super__init___readerr rlenrrecompile pcsc_regexsearchnamecreateConnection_congetattrr )selfrkwargsr reader_numbercrereader __class__s B/home/jenkins/workspace/simtester-sanitize/pySim/transport/pcsc.pyrzPcscSimLink.__init__*s)""6""" II = $ MMA&&!"AM"QRRR]+DLL*T_--C  ::fk**#)DLE< ]!"IDO"[\\\L1133 t]E22 B6tyAADIII B BcJ |jdS#YdSxYwNr% disconnectr's r.__del__zPcscSimLink.__del__Bs1  I " " " " "  DDs"NFtimeout newcardonlyct|jg||} |n!#t$r}t |d}~wwxYw|dS)N)r r6r7)rr waitforcardrrconnect)r'r6r7crexcs r. wait_for_cardzPcscSimLink.wait_for_cardIsx $,!(kCCC ) NN    * ) ) )--S ( ) s/ A AA c~ ||jt|j}|r;|jtj| ddS| r;|jtj | ddStd#t$r}t|d}~wt$r}t!|d}~wwxYw)NrzUnsupported card protocol)r3r%r:r getATR isT0Supported setProtocolr T0_protocolset_tpdu_format isT1Supported T1_protocolrrrrr)r'atrr<s r.r:zPcscSimLink.connectRs2 ) OO    I     di&&(())C  "" ? %%n&@AAA$$Q'''''""$$ ? %%n&@AAA$$Q'''''!"=>>>& + + +//s * ) ) )--S ( )s1B D$A D3D D< D D<(D77D<returncNt|jSr1)r r%r@r4s r.get_atrzPcscSimLink.get_atrls49##%%&&&r/c8|jdSr1r2r4s r.r3zPcscSimLink.disconnectos r/cV||dS)Nr?)r3r:r4s r. _reset_cardzPcscSimLink._reset_cardrs$  qr/tpduc|jt|\}}}||g}t|t|fSr1)r%transmitr r )r'rNdatasw1sw2sws r. send_tpduzPcscSimLink.send_tpduwsE++CII66c33Z4yy#b''!!r/cd|jzS)NzPCSC[%s])rr4s r.__str__zPcscSimLink.__str__~sT\**r/ arg_parserc  |dd}|ddd|}|ddtd d dd |d tdddd dS)Nz PC/SC ReaderaUse a PC/SC card reader to talk to the SIM card. PC/SC is a standard API for how applications access smart card readers, and is available on a variety of operating systems, such as Microsoft Windows, MacOS X and Linux. Most vendors of smart card readers provide drivers that offer a PC/SC interface, if not even a generic USB CCID driver is used. You can use a tool like ``pcsc_scan -r`` to obtain a list of readers available on your system. z --pcsc-shared store_truez6Open PC/SC reaer in SHARED access (default: EXCLUSIVE))actionhelpz-pz --pcsc-devicerPCSCz,Number of PC/SC reader to use for SIM access)typedestmetavardefaultr\z --pcsc-regexr!REGEXz1Regex matching PC/SC reader to use for SIM access)add_argument_group add_argumentadd_mutually_exclusive_groupintstr)rX pcsc_group dev_groups r.argparse_add_reader_argsz$PcscSimLink.argparse_add_reader_argss22> :;;  %]  _ _ _;;== t_3ZY_im$R  T T T~ClT[ei$W  Y Y Y Y Yr/)NF)__name__ __module__ __qualname____doc__r#argparse Namespacerr5rrfboolr=r:rrJr3rMrrUrgrW staticmethodArgumentParserrj __classcell__)r-s@r.rr&sd-- D2D(2Da2P2P2PBBX/BBBBBB0Xc])))4''''' "f"""""+++++ YX-D Y Y Y\ Y Y Y Y Yr/r)rortypingrsmartcard.CardConnectionrsmartcard.CardRequestrsmartcard.Exceptionsrrrsmartcard.Systemr (smartcard.ExclusiveConnectCardConnectionr smartcard.ATRr osmocom.utilsr r rpySim.exceptionsrrrpySim.transportr pySim.utilsrrrr/r.rsK( 333333------ffffffffff$$$$$$SSSSSS**********DDDDDDDDDD(((((( iYiYiYiYiY,iYiYiYiYiYr/