
    diB                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ  G d de          ZdS )    N)Optional)CardConnection)CardRequest)NoCardExceptionCardRequestTimeoutExceptionCardConnectionException)readers)ExclusiveConnectCardConnection)h2ii2hHexstr)NoCardErrorProtocolErrorReaderError)LinkBaseTpdu)ResTuplec                        e Zd ZdZdZ ej        d          fdej        f fdZd Zdd
e	e
         defdZd ZdefdZd Zd ZdedefdZdefdZedej        fd            Z xZS )PcscSimLinkz# pySim: PCSC reader transport link.zPC/SCr   )pcsc_devoptsc                 8    t                      j        di | d | _        t                      }|j        :|j        }|t          |          k    rt          d|z            ||         | _        n_t          j        |j	                  }|D ]%}|
                    |j                  r	|| _         n&| j        st          d|j	        z            | j                                        | _        t          |dd          st          | j                  | _        d S d S )NzNo reader found for number %dz%No matching reader found for regex %spcsc_sharedF )super__init___readerr	   r   lenr   recompile
pcsc_regexsearchnamecreateConnection_congetattrr
   )selfr   kwargsrreader_numbercrereader	__class__s          B/home/jenkins/workspace/simtester-sanitize/pySim/transport/pcsc.pyr   zPcscSimLink.__init__)   s)   ""6"""II=$ MMA&&!"AM"QRRR]+DLL *T_--C  ::fk** #)DLE < ]!"IDO"[\\\L1133	t]E22 	B6tyAADIII	B 	B    c                 J    	 | j                                          d S #  Y d S xY wNr$   
disconnectr&   s    r-   __del__zPcscSimLink.__del__A   s1    	I  """""	DDs    "NFtimeoutnewcardonlyc                     t          | j        g||          }	 |                                 n!# t          $ r}t	                      |d }~ww xY w|                                  d S )N)r	   r5   r6   )r   r   waitforcardr   r   connect)r&   r5   r6   crexcs        r-   wait_for_cardzPcscSimLink.wait_for_cardH   sx    $,!(kC C C	)NN* 	) 	) 	)--S(	)s   / 
AAAc                 L   	 |                                   | j                                         | j                                        }|                                   |t          j        z  r"t          j        }|                     d           n@|t          j        z  r"t          j        }|                     d           nt          d          | j                            |           d S # t          $ r}t                      |d }~wt          $ r}t                      |d }~ww xY w)Nr      zUnsupported card protocol)r2   r$   r9   getProtocolr   T0_protocolset_tpdu_formatT1_protocolr   r   r   r   r   )r&   supported_protocolsprotocolr;   s       r-   r9   zPcscSimLink.connectQ   s)   	) OO I"&)"7"7"9"9OO#n&@@ ?*6$$Q''''%(BB ?)5$$Q''''!"=>>>Ih'''''& 	+ 	+ 	+//s* 	) 	) 	)--S(	)s$   C%C) )
D#3DD#DD#returnc                 N    t          | j                                                  S r0   )r   r$   getATRr3   s    r-   get_atrzPcscSimLink.get_atri   s    49##%%&&&r.   c                 8    | j                                          d S r0   r1   r3   s    r-   r2   zPcscSimLink.disconnectl   s    	r.   c                 V    |                                   |                                  dS )Nr>   )r2   r9   r3   s    r-   _reset_cardzPcscSimLink._reset_cardo   s$    qr.   tpduc                     | j                             t          |                    \  }}}||g}t          |          t          |          fS r0   )r$   transmitr   r   )r&   rL   datasw1sw2sws         r-   	send_tpduzPcscSimLink.send_tpdut   sE    ++CII66c33Z 4yy#b''!!r.   c                     d| j         z  S )NzPCSC[%s])r   r3   s    r-   __str__zPcscSimLink.__str__{   s    T\**r.   
arg_parserc           	         |                      dd          }|                    ddd           |                                }|                    ddt          d	d
d d           |                    dt          ddd d           d S )NzPC/SC Readera  Use 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))actionhelpz-pz--pcsc-devicer   PCSCz,Number of PC/SC reader to use for SIM access)typedestmetavardefaultrZ   z--pcsc-regexr    REGEXz1Regex matching PC/SC reader to use for SIM access)add_argument_groupadd_argumentadd_mutually_exclusive_groupintstr)rV   
pcsc_group	dev_groups      r-   argparse_add_reader_argsz$PcscSimLink.argparse_add_reader_args~   s    22>	:; ;
 	%] 	  	_ 	_ 	_;;==	t_3ZY_im$R 	 	T 	T 	T~ClT[ei$W 	 	Y 	Y 	Y 	Y 	Yr.   )NF)__name__
__module____qualname____doc__r"   argparse	Namespacer   r4   r   rd   boolr<   r9   r   rH   r2   rK   r   rS   re   rU   staticmethodArgumentParserrh   __classcell__)r,   s   @r-   r   r   %   sd       --D2D(2Da2P2P2P B BX/ B B B B B B0   Xc]     ) ) )0' ' ' ' '    
"f " " " " "+ + + + + YX-D Y Y Y \Y Y Y Y Yr.   r   )rm   r   typingr   smartcard.CardConnectionr   smartcard.CardRequestr   smartcard.Exceptionsr   r   r   smartcard.Systemr	   (smartcard.ExclusiveConnectCardConnectionr
   osmocom.utilsr   r   r   pySim.exceptionsr   r   r   pySim.transportr   pySim.utilsr   r   r   r.   r-   <module>r}      s9  (  				       3 3 3 3 3 3 - - - - - - f f f f f f f f f f $ $ $ $ $ $ S S S S S S * * * * * * * * * * D D D D D D D D D D ( ( ( ( ( (            gY gY gY gY gY, gY gY gY gY gYr.   