
    di=D                        d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZ ddlmZ ddlT ddlT ddlT ddlmZ ddlZd	d
dddZdddZdddZ G d de          Z  G d de          Z! G d de"          Z# G d de"          Z$ G d de          Z% G d de"          Z& G d d e"          Z' G d! d"e          Z( G d# d$e)          Z* G d% d&e          Z+ G d' d(e          Z, G d) d*e          Z- G d+ d,e          Z. G d- d.e          Z/ G d/ d0e"          Z0 G d1 d2e1          Z2 G d3 d4e1          Z3dS )5a  Utilities / Functions related to sysmocom SJA2/SJA5 cards

(C) 2021-2023 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/>.
    )unpack)	FlagsEnumByteStructInt8ubMappingEnumPaddingBitsInteger)BitthisInt32ubInt16ubNibbleBytesIntegerGreedyRangeConst)Optional)*)RuntimeStateNkickidkikany)r            desaes)r   r         c            	       ~     e Zd Zddddddddddddddd	d
fdddddddddd ed          dd
fgZd fd	Z xZS )EF_PIN*f1030331323334ffffffff0a0a3132333435363738TF)validchange_ableunblock_abledisable_ablenot_initializeddisabledr   s   1234
   s   12345678)attempts_remainingmaximum_attemptspuk)stater,   r-   pinr.   f0030399999999999999999999999999999999N6f01EF.CHV1c                    t                                          ||d|z             t          t          dddddd	          }t	          d
t
          z  dt
          z  dt          t          d                    z            }t	          d|z  d
t
          z  dt
          z  dt          t          d                    z  dt          |          z            | _	        d S )Nz%s PIN filenamedescr   r          @      )r*   r)   r(   r'   r&   r%   r,   r-   r.   r    r/   r0   )
super__init__r   r   r   r   RpadBytes	COptional
_construct)selffidr7   	StateByte	PukStruct	__class__s        A/home/jenkins/workspace/simtester-sanitize/pySim/sysmocom_sja2.pyr>   zEF_PIN.__init__?   s    4md.BCCCdQPTcg04DB B B	/6-f4 eAhh/1 1	 !!2!5f!<!3F!:!&tE!HH~~!5!&y';';!;	= =    )r3   r4   __name__
__module____qualname__h2b_test_de_encoder>   __classcell__rG   s   @rH   r#   r#   1   s        
6 $T4ae*/TD D!"'*,"[ZZ 	 # $T4ae*/UE E!"##FXBYBY 	O= = = = = = = = = =rI   r#   c                        e Zd Zdddddd ed           ed           ed           ed	           ed
          d
fgZd fd	Z xZS )EF_MILENAGE_CFGڪ40002040600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000020000000000000000000000000000000400000000000000000000000000000008r;   r   r:   `    00000000000000000000000000000000 00000000000000000000000000000001 00000000000000000000000000000002 00000000000000000000000000000004 00000000000000000000000000000008)
r1r2r3r4r5c1c2c3c4c56f21EF.MILENAGE_CFGMilenage connfigurationc                 z   t                                          |||           t          dt          z  dt          z  dt          z  dt          z  dt          z  dt	          d          z  d	t	          d          z  d
t	          d          z  dt	          d          z  dt	          d          z  
  
        | _        d S )Nr6   r[   r\   r]   r^   r_   r`   r9   ra   rb   rc   rd   r=   r>   r   r   r@   rB   rC   rD   r7   r8   rG   s       rH   r>   zEF_MILENAGE_CFG.__init__W   s    4d333 fd6k4;VUYZ`U`!%eBii!%eBii!%eBii!%eBii!%eBii1 1rI   )re   rf   rg   rJ   rQ   s   @rH   rS   rS   M   s         w1Bb788788788788788: :	<O1 1 1 1 1 1 1 1 1 1rI   rS   c                         e Zd Zd fd	Z xZS )EF_0348_KEY6f22EF.0348_KEYTS 03.48 OTA Keysc                    t                                          |||d           t          dt          t          ddd          z  dt          t          dd          z  d	t          t          d
          d          z  dt          d          z  dt          t          d          dddd
          z            }t          dt          z  dt          z  d|z  dt          t          j        j                  z            | _        d S )N)   #   r7   r8   rec_len
mac_lengthr   r   )r    r!   	algorithm)r   r   
key_lengthr   r    _rfukey_typer   )r   r   r   r   security_domainkey_set_versionkey_len_and_typekey)r=   r>   	BitStructr   r   r	   MultiplyAdapterr   BitsRFUr   r   r@   r   r|   rw   rB   )rC   rD   r7   r8   KeyLenAndTyperG   s        rH   r>   zEF_0348_KEY.__init__b   s    4dHEEE!,wsqAJJ/G/G"G"-d3A1.E.E.E"E".{1~~q/Q/Q"Q"("3",T+a..aQTU[\-]-]-]"]	_ _
 !!26!9!26!9!3M!A!&uT-B-M'N'N!NP PrI   )rm   rn   ro   rK   rL   rM   r>   rP   rQ   s   @rH   rl   rl   a   sG        
P 
P 
P 
P 
P 
P 
P 
P 
P 
PrI   rl   c                   D     e Zd Zddd ed          dfgZd
 fd		Z xZS )EF_0348_COUNTfe010000000000   r   
0000000000)
sec_domainr{   counter6f23EF.0348_COUNTTS 03.48 OTA Countersc                     t                                          |||d           t          dt          z  dt          z  dt	          d          z            | _        d S )N)   r   rs   r   r{   r      ri   rj   s       rH   r>   zEF_0348_COUNT.__init__s   sV    4dFCCC f!4!26!9!*588!35 5rI   )r   r   r   rJ   rQ   s   @rH   r   r   o   sc        
31QTQTUaQbQbcceO5 5 5 5 5 5 5 5 5 5rI   r   c                         e Zd Zd fd	Z xZS )EF_SIM_AUTH_COUNTERaf24EF.SIM_AUTH_COUNTERc                     t                                          ||d           t          dt          z            | _        d S )Nz0Number of remaining RUN GSM ALGORITHM executionsr6   num_run_gsm_algo_remain)r=   r>   r   r   rB   rC   rD   r7   rG   s      rH   r>   zEF_SIM_AUTH_COUNTER.__init__{   s<    4.`aaa !:7!BCCrI   )r   r   r   rQ   s   @rH   r   r   z   sG        D D D D D D D D D DrI   r   c                   4     e Zd ZddddddfgZd	 fd	Z xZS )
EF_GP_COUNT
0070000000r   p   )r   r{   r   rfu6f26EF.GP_COUNTGP SCP02 Countersc                     t                                          |||d           t          dt          z  dt          z  dt          z  dt          z            | _        d S )N)r   r   rs   r   r{   r   r   )r=   r>   r   r   r   rB   rj   s       rH   r>   zEF_GP_COUNT.__init__   sW    4dFCCC f!4!26!9!*7!2!&v/ /rI   )r   r   r   rK   rL   rM   rO   r>   rP   rQ   s   @rH   r   r      sY        
qSQWXYY[O/ / / / / / / / / /rI   r   c                   &     e Zd Zd fd	Zd Z xZS )EF_GP_DIV_DATA6f27EF.GP_DIV_DATA!GP SCP02 key diversification datac                 R    t                                          |||d           d S )N)   r   rs   )r=   r>   rj   s       rH   r>   zEF_GP_DIV_DATA.__init__   s*    4dHEEEEErI   c                 v    t          d|          }|d         |d         |d                                         dS )Nz!BB8sr   r   r   )r   r{   key_div_data)r   hex)rC   raw_bin_datakwargsus       rH   _decode_record_binz!EF_GP_DIV_DATA._decode_record_bin   s5    7L))dqtQqTXXZZXXXrI   )r   r   r   )rK   rL   rM   r>   r   rP   rQ   s   @rH   r   r      sY        F F F F F FY Y Y Y Y Y YrI   r   c                   ^     e Zd Zddddd ed           ed          dfgZd fd	Z xZS )EF_SIM_AUTH_KEYB14000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fr   Tmilenage)sres_deriv_funcuse_opc_instead_of_oprv    000102030405060708090a0b0c0d0e0f 101112131415161718191a1b1c1d1e1fcfgr}   op_opc6f20EF.SIM_AUTH_KEYc                 v   t                                          ||d           t          t          d          dt	          t
          ddd          z  dt          z  d	t          t          d
ddd          z            }t          d|z  dt          d          z  dt          d          z            | _        d S )NUSIM authentication keyr6   r   r   r   r   r   r   r   rv   r!   r   )r   	comp128v1	comp128v2	comp128v3r   r}   r9   r   )r=   r>   r~   r
   r   r   Flagr	   r   r   r@   rB   rC   rD   r7   CfgByterG   s       rH   r>   zEF_SIM_AUTH_KEY.__init__   s    4.GHHHGAJJ-gca1::.F.FF3D8'Va1XYef(g(g(ggi i !w!&uRyy!)599!46 6rI   )r   r   rJ   rQ   s   @rH   r   r      s        
N&'$U_``#899S;<<> >	@O6 6 6 6 6 6 6 6 6 6rI   r   c                   $     e Zd Z fdZd Z xZS )	DF_SYSTEMc                    t                                          ddd           t          dd          t          dd          t          d	d
          t          dd          t          dd          t          dd          t                      t	                      t                      t                      t                      t                      t                      g}| 
                    |           d S )Na515z	DF.SYSTEMzCardOS specifics)rD   r7   r8   r3   r4   6f81zEF.CHV26f0azEF.ADM16f0bzEF.ADM26f0czEF.ADM36f0dzEF.ADM4)r=   r>   r#   rS   rl   r   r   r   r   r   	add_files)rC   filesrG   s     rH   r>   zDF_SYSTEM.__init__   s    V+<NOOO69%%69%%69%%69%%69%%69%%MM!!OOMM
 	urI   c                 J    t           j        j                            |          S )N)pySim
ts_102_221CardProfileUICCdecode_select_response)rC   resp_hexs     rH   r   z DF_SYSTEM.decode_select_response   s    /FFxPPPrI   )rK   rL   rM   r>   r   rP   rQ   s   @rH   r   r      sN            &Q Q Q Q Q Q QrI   r   c                   P     e Zd Zddddddddddddddg d	d
fgZd fd	Z xZS )EF_USIM_SQN  d503000200000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000TFr   )skip_next_sqn_checkdelta_max_checkage_limit_check	sqn_checkind_lenr   )r   dont_clear_amf_for_macsaus_concealedautn_concealedl        ) r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )flag1flag2	delta_max	age_limit	freshnessaf30EF.USIM_SQNc                     t                                          ||d           t          dt          z  dt          z  dt          z  dt          z  dt	          d          z            }t          d	t          d
          z  dt          z  dt          z  dt          z            }t          d|z  d|z  dt          d          z  dt          d          z  dt          t          d                    z            | _	        d S )NzSQN parameters for AKAr6   r   r   r   r   r   r!   r   r   r   r   r   r   r   r      r   r   )
r=   r>   r~   r   r   r   r   r   r   rB   )rC   rD   r7   Flag1Flag2rG   s        rH   r>   zEF_USIM_SQN.__init__   s    4.FGGG/46G6L+D0+d2B#KNN24 4 %

*,Ed,J)$.0@0EG G !,!-a"12=l1oo2M!,[a-I-I!IK KrI   )r   r   r   rQ   s   @rH   r   r      s         i,0T^crv !# #56SXko@D.F .FT^ %= %= %=> >	@O
K 
K 
K 
K 
K 
K 
K 
K 
K 
KrI   r   c            	            e Zd Zdddddd ed           ed          d	fd
dddddddddd ed           ed          dfgZd fd	ZdedefdZdedefdZ	 xZ
S )EF_USIM_AUTH_KEYB141898d827f70120d33b3e7462ee5fd6fe6ca53d7a0a804561646816d7b0c702fbFr   Tr   only_4bytes_res_in_3gsres_deriv_func_in_2gr   rv    1898d827f70120d33b3e7462ee5fd6fe 6ca53d7a0a804561646816d7b0c702fbr   f160a04101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f000102030405060708090a0b0c0d0e0ftuakr<   )rv   rw   r   r   )ck_and_ik_sizemac_sizeres_sizer!   r   @101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f)r   tuak_cfgnum_of_keccak_iterationskr   af20EF.USIM_AUTH_KEYc                 4   t                                          ||d           t          t          dddd          }t	          t          d          d	t          z  d
t          t          ddd          z  dt          t          ddd          z  d|z            }t          d|z  dt          d          z  dt          d          z            | _        t	          t          d          dt          t          ddd          z  d
t          t          ddd          z  dt          t          ddd          z  d|z            }t	          t          d          dt          t          ddd          z  dt          t          d          dddd          z  dt          t          d          ddddd          z            }t          d|z  d|z  dt          z  dt          d          z  d t          t          j        j        d!z            z            | _        d S )"Nr   r6   r!   r   r      )r   sha1_akar   xorr   r   r   r   r   r   )FTrv   r   r}   r9   r   rw   )r<      r   r   r   r   )r;   r<   r  r   )r:   r;   r<   r  r   r   r:   r   r    )r=   r>   r	   r   r~   r
   r   r   r   r   r@   rB   r   r   r   r   rw   _constr_tuak)rC   rD   r7   	Algorithmr   CfgByteTuakTuakCfgByterG   s          rH   r>   zEF_USIM_AUTH_KEY.__init__   s   4.GHHH!aaRHHH	GAJJ(?(D3GCA4L4LL3GCPQARAR4S4SS'	13 3 !w!&uRyy!)%))!35 5  

 ,WSqa..-I-I I 7QZZ8P8P P 7ATUEVEV8W8W W +I 5	7 7
  

 01!nn1M1M M *7;q>>qaUVCWCW+X+X X *7;q>>qQTU[\C]C]+^+^ ^` ` #5#4#-k#9#=f#D#+E"II#5#&uTX-@!-C'D'D#D	F FrI   r   returnc                 t    |d         dz  dk    rt          | j        |          S t          | j        |          S )Nr   r   r   )parse_constructr  rB   )rC   r   s     rH   _decode_binzEF_USIM_AUTH_KEY._decode_bin   s;    ?T!T))"4#4lCCC"4?LAAArI   abstract_datac                 z    |d         d         dk    rt          | j        |          S t          | j        |          S )Nr   rv   r   )build_constructr  rB   )rC   r  r   s      rH   _encode_binzEF_USIM_AUTH_KEY._encode_bin  s<    ,66"4#4mDDD"4?MBBBrI   )r   r   )rK   rL   rM   rN   rO   r>   	bytearraydictr  r  rP   rQ   s   @rH   r   r      s<       
N.3ajn  ~H  J  J39::ccJlFmFmp p	r s#)#YZvz||-0sQTVV()788c\]]	
 
		OF F F F F F8B	 Bd B B B BC CI C C C C C C C CrI   r   c                   `     e Zd Zdddddd ed           ed          d	fgZd fd	Z xZS )EF_USIM_AUTH_KEY_2Gr   Fr   Tr   r   r   r   r   af22EF.USIM_AUTH_KEY_2Gc                    t                                          ||d           t          t          d          dt          z  dt          t          ddd          z  dt          z  d	t          t          d
dddd          z            }t          d|z  dt          d          z  dt          d          z            | _        d S )Nz%USIM authentication key in 2G contextr6   r   r   r   r   r   r   rv   r!   r   r      )r   r   r   r   r  r   r}   r9   r   )r=   r>   r~   r
   r   r   r   r	   r   r   r@   rB   r   s       rH   r>   zEF_USIM_AUTH_KEY_2G.__init__  s    4.UVVVGAJJ(?(D3GCA4L4LL3D8'Va1XYefln(o(o(ooq q !w!&uRyy!)%))!35 5rI   )r  r  rJ   rQ   s   @rH   r  r  
  s        
N,1Ahl *, ,#899S;<<> >	@O5 5 5 5 5 5 5 5 5 5rI   r  c                         e Zd Zd fd	Z xZS )	EF_GBA_SKaf31	EF.GBA_SKc                 h    t                                          ||d           t          | _        d S N!Secret key for GBA key derivationr6   r=   r>   GreedyBytesrB   r   s      rH   r>   zEF_GBA_SK.__init__  s.    4.QRRR%rI   )r  r  r   rQ   s   @rH   r  r    s=        & & & & & & & & & &rI   r  c                         e Zd Zd fd	Z xZS )EF_GBA_REC_LISTaf32EF.GBA_REC_LISTc                     t                                          ||d           t          t                    | _        d S r  )r=   r>   r   r   rB   r   s      rH   r>   zEF_GBA_REC_LIST.__init__$  s6    4.QRRR%f--rI   )r#  r$  r   rQ   s   @rH   r"  r"  #  s=        . . . . . . . . . .rI   r"  c                         e Zd Zd fd	Z xZS )EF_GBA_INT_KEYaf33EF.GBA_INT_KEYc                 j    t                                          ||dd           t          | _        d S )Nr  )r:   r:   rs   r  r   s      rH   r>   zEF_GBA_INT_KEY.__init__+  s;    4A8 	 	U 	U 	U%rI   )r(  r)  r   rQ   s   @rH   r'  r'  *  s=        & & & & & & & & & &rI   r'  c                   2    e Zd Zg dZedefd            ZdS )SysmocomSJA2),3b9f96801f878031e073fe211b674a4c753034054ba9,3b9f96801f878031e073fe211b674a4c7531330251b2,3b9f96801f878031e073fe211b674a4c5275310451d5rsc                 (   |j                             t                                 d|j         j        v rw|j         j        d         }t	                      t                      t                      t                      t                      t                      g}|
                    |           d|j         j        v rX|j         j        d         }t	          d          t          d          t          d          g}|
                    |           dS dS z7Add sysmocom SJA2 specific files to given RuntimeState.a0000000871002a0000000871004zEF.ISIM_AUTH_KEY)r7   zEF.ISIM_AUTH_KEY_2GzEF.ISIM_SQNNmfadd_filer   applicationsr   r  r  r"  r'  r   r   clsr0  usim_adffiles_adf_usimisim_adffiles_adf_isims         rH   r   zSysmocomSJA2.add_files6      	y{{###ru111u)*:;H ""#%%!!  N ~...ru111u)*:;H &8999#)>???///N
 ~..... 21rI   NrK   rL   rM   _atrsclassmethodr   r    rI   rH   r,  r,  1  L        = = =E /< / / / [/ / /rI   r,  c                   2    e Zd Zg dZedefd            ZdS )SysmocomSJA5),3b9f96801f878031e073fe211b674a357530350251cc,3b9f96801f878031e073fe211b674a357530350265f8,3b9f96801f878031e073fe211b674a357530350259c4r0  c                 (   |j                             t                                 d|j         j        v rw|j         j        d         }t	                      t                      t                      t                      t                      t                      g}|
                    |           d|j         j        v rX|j         j        d         }t	          d          t          d          t          d          g}|
                    |           dS dS r2  r5  r9  s         rH   r   zSysmocomSJA5.add_filesU  r?  rI   Nr@  rC  rI   rH   rF  rF  P  rD  rI   rF  )4__doc__structr   	constructr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   rA   osmocom.utilsosmocom.constructpySim.filesystempySim.runtimer   r   key_type2strkey_algo2strru   TransparentEFr#   rS   
LinFixedEFrl   r   r   r   r   r   CardDFr   r   r   r  r  r"  r'  	CardModelr,  rF  rC  rI   rH   <module>rX     s3   $       Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ + + + + + +             & & & & & &  	    	 
= = = = =] = = =81 1 1 1 1m 1 1 1(P P P P P* P P P5 5 5 5 5J 5 5 5D D D D D- D D D	/ 	/ 	/ 	/ 	/* 	/ 	/ 	/Y Y Y Y YZ Y Y Y6 6 6 6 6m 6 6 6$Q Q Q Q Q Q Q Q0K K K K K- K K K,3C 3C 3C 3C 3C} 3C 3C 3Cl5 5 5 5 5- 5 5 5&& & & & & & & &. . . . .m . . .& & & & &Z & & &/ / / / /9 / / />/ / / / /9 / / / / /rI   