
    di                         d Z ddlmZmZ ddlT ddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZ  G d d	          Z G d
 de          Z G d de          Zdedee         fdZdS )z! pySim: Card programmation logic
    )OptionalTuple)*)EF_DIRCardProfileUICC)DF_GSM)SwHexstr)PathSimCardCommandsc            
           e Zd ZdZdefdZdee         fdZdededdfd	Z	de
eef         fd
Zd ZdedefdZdee         fdZddedefdZddedee         de
ee         ee         f         fdZdS )CardBasez<General base class for some kind of telecommunications card.sccc                 "    || _         g | _        d S N)_scc_aids)selfr   s     9/home/jenkins/workspace/simtester-sanitize/pySim/cards.py__init__zCardBase.__init__#   s    	


    returnc                 v    | j                                         }|dk    r| j                                         S d S )N   )r   
reset_cardget_atr)r   rcs     r   resetzCardBase.reset'   s7    Y!!##779$$&&&tr   clasel_ctrlNc                 6    || j         _        || j         _        dS )z<Set apdu parameters (class byte and selection control bytes)Nr   cla_byter   )r   r   r   s      r   set_apdu_parameterzCardBase.set_apdu_parameter-   s     	%	r   c                 2    | j         j        | j         j        fS )z<Get apdu parameters (class byte and selection control bytes)r!   r   s    r   get_apdu_parameterzCardBase.get_apdu_parameter2   s    	"DI$677r   c                 $    t          d           d S )Nz:warning: erasing is not supported for specified card type!)printr%   s    r   erasezCardBase.erase6   s    JKKKKKr   fidc                     | j                             |          }|D ]}|d         dk    r dS 	 t          j        |d         d                   }|                    dd          dk    rdS n#  Y nxY wdS )	z6Determine if the file exists (and is not deactivated).r   9000Fr   life_cycle_status_integeroperational_activatedT)r   try_select_pathr   decode_select_responseget)r   r*   res_arrresds        r   file_existszCardBase.file_exists9   s    )++C00 	 	C1vuu  	6wr{1~FFAuu02IJJNeeeu f	Dts   :A- -A1c                     g S r    r%   s    r   	read_aidszCardBase.read_aidsG   s	     	r   usimadfc                     dS )NFr8   )r   r;   s     r   adf_presentzCardBase.adf_presentL   s	     ur   c                     dS )NNNr8   )r   r;   r   s      r   select_adf_by_aidzCardBase.select_adf_by_aidQ   s	     |r   r:   r:   N)__name__
__module____qualname____doc__r   r   r   Hexstrr   r#   r   r&   r)   r
   boolr6   Listr9   strr=   r	   r@   r8   r   r   r   r   !   sx       FFO    x'    &f & &4 & & & &
8E&&.$9 8 8 8 8L L Lt     4<    
 s     
 S 8Q ]bcklrcsu}  G  vH  dH  ^I      r   r   c                   8     e Zd ZdZdZdef fdZdefdZ xZ	S )SimCardBasezfHere we only add methods for commands specified in TS 51.011, without
    any higher-layer processing.SIMr   c                 z    t                                          |           d| j        _        d| j        _        d S )NA00000)superr   r   r"   r   r   r   	__class__s     r   r   zSimCardBase.__init__\   s5    !	#	r   r   c                 R    t                      }|                     |j                  S r   )r   r6   r*   )r   df_gsms     r   probezSimCardBase.probea   s!    
+++r   )
rC   rD   rE   rF   namer   r   rH   rV   __classcell__rS   s   @r   rL   rL   W   sn        $ $D$O $ $ $ $ $ $
,t , , , , , , , ,r   rL   c            
            e Zd ZdZdef fdZdefdZdee	         fdZ
eddee	         fd            Zd	e	dee	         fd
ZddedefdZddedee         deee	         ee         f         fdZ xZS )UiccCardBaseUICCr   c                     t                                          |           d| j        _        d| j        _        d| _        d S )N000004
   )rQ   r   r   r"   r   _adm_chv_numrR   s     r   r   zUiccCardBase.__init__i   s=    !	#	 r   r   c                 |    t                      }|                     d           |                     |j                  S )N3f00)r   r6   r*   )r   ef_dirs     r   rV   zUiccCardBase.probep   s5       
+++r   c                    g | _         	 t                      }| j                            |j                  }t          d|          D ]}| j                            |j        |dz             }|d         dd         |d         dd         fdk    rt          |d                   dk    r|d         ddt          |d         dd         d	          dz  z            | j         vrJ| j         	                    |d         ddt          |d         dd         d	          dz  z                       n=# t          $ r0}t          d
t          |                     g | _         Y d}~nd}~ww xY w| j         S )z"Fetch all the AIDs present on UICCr   r            )614f         zCan't read AIDs from SIM -- N)r   r   r   record_countr*   rangeread_recordlenintappend	Exceptionr(   rJ   )r   rd   rec_cntireces         r   r9   zUiccCardBase.read_aidsw   s   
	XXF i,,VZ88G1g&& N Ni++FJA>>F1Q3KQ!-==#c!f++PRBRBRF1QSVAaC[")=)=)A%A#AB$*TTJ%%c!fQq3s1vac{B3G3G!3K/K-K&LMMM	N
  	 	 	Ec!fff>???DJJJJJJ	 zs   D#D- -
E'7&E""E'r:   c                 ^    i }d|d<   d|d<   |                                  } | |v r||          S d S )Na0000000871002r:   a0000000871004isim)lower)r;   aid_maps     r   _get_aidzUiccCardBase._get_aid   s>    **iikk'>>3<tr   aidc                     t          |          rI| j        D ]A}t          |          t          |          k    r||dt          |                   k    r|c S BdS )z.find the complete version of an ADF.U/ISIM AIDr   N)is_hexr   rq   )r   r   	aid_knowns      r   _complete_aidzUiccCardBase._complete_aid   se     #;; 	%!Z % %	y>>SXX--#1SXX:9N2N2N$$$$tr   r;   c                 f    |                      |          }|r|                     |          }|rdS dS )zVCheck if the AID of the specified ADF is present in EF.DIR (call read_aids before use)TF)r   r   )r   r;   r   aid_fulls       r   r=   zUiccCardBase.adf_present   s@    mmC   	))#..H tur   Nc                     |p| j         }t          |          r|}n|                     |          }|rA|                     |          }|r|                    |          S |                    |          S dS )z0Select ADF.U/ISIM in the Card using its full AIDr?   )r   r   r   r   
select_adf)r   r;   r   r   r   s        r   r@   zUiccCardBase.select_adf_by_aid   s     TY#;; 	%CC--$$C 	'))#..H 0~~h///>>#&&&|r   rA   rB   )rC   rD   rE   rW   r   r   rH   rV   rI   rG   r9   staticmethodr   r   r   rJ   r=   r   r	   r@   rX   rY   s   @r   r[   r[   f   s^       D!O ! ! ! ! ! !,t , , , ,4<    $   0    \ HV,<     s      S 8Q ]bcklrcsu}  G  vH  dH  ^I        r   r[   r   r   c                     t          |           }|                                r|S t          |           }|                                r|S d S r   )r[   rV   rL   )r   uiccsims      r   card_detectr      sM    Dzz||  c

C
yy{{ 
4r   N)rF   typingr   r   osmocom.utilspySim.ts_102_221r   r   pySim.ts_51_011r   pySim.utilsr	   pySim.commandsr
   r   r   rL   r[   r   r8   r   r   <module>r      s@   , # " " " " " " "     4 4 4 4 4 4 4 4 " " " " " "             0 0 0 0 0 0 0 03 3 3 3 3 3 3 3l, , , , ,( , , ,N N N N N; N N N`_ ();      r   