h=DdZddlmZddlmZmZmZmZmZm Z m Z m Z ddlm Z m Z mZmZmZmZmZmZddlmZddlTddlTddlTddlmZddlZd d d d d ZdddZdddZGddeZ GddeZ!Gdde"Z#Gdde"Z$GddeZ%Gdde"Z&Gdd e"Z'Gd!d"eZ(Gd#d$e)Z*Gd%d&eZ+Gd'd(eZ,Gd)d*eZ-Gd+d,eZ.Gd-d.eZ/Gd/d0e"Z0Gd1d2e1Z2Gd3d4e1Z3dS)5aUtilities / Functions related to sysmocom SJA2/SJA5 cards (C) 2021-2023 by Harald Welte 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 . )unpack) FlagsEnumByteStructInt8ubMappingEnumPadding BitsInteger)BitthisInt32ubInt16ubNibble BytesInteger GreedyRangeConst)Optional)*) RuntimeStateNkickidkikany)rdesaes)rrc ~eZdZddddddddddddddd d fd ddddddddded d d fgZdfd ZxZS)EF_PIN*f1030331323334ffffffff0a0a3132333435363738TF)valid change_able unblock_able disable_ablenot_initializeddisabledrs1234 s12345678)attempts_remainingmaximum_attemptspuk)stater,r-pinr.f0030399999999999999999999999999999999N6f01EF.CHV1c t||d|zttdddddd }t d t z d t z d t td z }t d|z d t z d t z dt td z d t|z |_ dS)Nz %s PIN filenamedescrr @)r*r)r(r'r&r%r,r-r.r r/r0) super__init__rrrrRpadBytes COptional _construct)selffidr7 StateByte PukStruct __class__s A/home/jenkins/workspace/simtester-sanitize/pySim/sysmocom_sja2.pyr>zEF_PIN.__init__?s 4md.BCCCdQPTcg04DBBB /6-f4 eAhh/11 !!2!5f! __classcell__rGs@rHr#r#1s 6 $T4ae*/TDD!"'*,"[ZZ    # $T4ae*/UEE!"##FXBYBY    O = = = = = = = = = =rIr#c eZdZddddddedededed ed d fgZdfd ZxZS)EF_MILENAGE_CFGڪ40002040600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000020000000000000000000000000000000400000000000000000000000000000008r;rr:` 00000000000000000000000000000000 00000000000000000000000000000001 00000000000000000000000000000002 00000000000000000000000000000004 00000000000000000000000000000008) r1r2r3r4r5c1c2c3c4c56f21EF.MILENAGE_CFGMilenage connfigurationczt|||tdtz dtz dtz dtz dtz dt dz d t dz d t dz d t dz d t dz |_dS) Nr6r[r\r]r^r_r`r9rarbrcrdr=r>rrr@rBrCrDr7r8rGs rHr>zEF_MILENAGE_CFG.__init__Ws 4d333 fd6k4;V UYZ`U`!%eBii!%eBii!%eBii!%eBii!%eBii 11rI)rerfrgrJrQs@rHrSrSMs w1Bb788788788788788  : : <O1111111111rIrSc eZdZdfd ZxZS) EF_0348_KEY6f22 EF.0348_KEYTS 03.48 OTA Keysc t|||dtdttdddz dt tddz d t td d z d tdz d t tddddd z }tdtz dtz d|z dttj jz |_dS)N)#r7r8rec_len mac_lengthrr)r r! algorithm)rr key_lengthrr _rfukey_typer)rrrrsecurity_domainkey_set_versionkey_len_and_typekey)r=r> BitStructrr r MultiplyAdapterr BitsRFUrrr@r r|rwrB)rCrDr7r8 KeyLenAndTyperGs rHr>zEF_0348_KEY.__init__bs 4dHEEE!,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!NPPrI)rmrnrorKrLrMr>rPrQs@rHrlrlasG P P P P P P P P P PrIrlcDeZdZdddeddfgZd fd ZxZS) EF_0348_COUNTfe010000000000r 0000000000) sec_domainr{counter6f23 EF.0348_COUNTTS 03.48 OTA Countersct|||dtdtz dtz dt dz |_dS)N)rrsrr{rrirjs rHr>zEF_0348_COUNT.__init__ssV 4dFCCC f!4!26!9!*588!355rI)rrrrJrQs@rHrrosc 31QTQTUaQbQbcceO5555555555rIrc eZdZdfd ZxZS)EF_SIM_AUTH_COUNTERaf24EF.SIM_AUTH_COUNTERct||dtdtz |_dS)Nz0Number of remaining RUN GSM ALGORITHM executionsr6num_run_gsm_algo_remain)r=r>rrrBrCrDr7rGs rHr>zEF_SIM_AUTH_COUNTER.__init__{s< 4.`aaa !:7!BCCrI)rrrrQs@rHrrzsGDDDDDDDDDDrIrc4eZdZddddddfgZd fd ZxZS) EF_GP_COUNT 0070000000rp)rr{rrfu6f26 EF.GP_COUNTGP SCP02 Countersct|||dtdtz dtz dtz dtz |_dS)N)rrrsrr{rr)r=r>rrrrBrjs rHr>zEF_GP_COUNT.__init__sW 4dFCCC f!4!26!9!*7!2!&v//rI)rrrrKrLrMrOr>rPrQs@rHrrsY qSQWXYY[O//////////rIrc&eZdZdfd ZdZxZS)EF_GP_DIV_DATA6f27EF.GP_DIV_DATA!GP SCP02 key diversification datacRt|||ddS)N) rrs)r=r>rjs rHr>zEF_GP_DIV_DATA.__init__s* 4dHEEEEErIc vtd|}|d|d|ddS)Nz!BB8srrr)rr{ key_div_data)rhex)rC raw_bin_datakwargsus rH_decode_record_binz!EF_GP_DIV_DATA._decode_record_bins5 7L ) )dqtQqTXXZZXXXrI)rrr)rKrLrMr>rrPrQs@rHrrsYFFFFFFYYYYYYYrIrc^eZdZdddddededdfgZd fd ZxZS) EF_SIM_AUTH_KEYB14000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1frTmilenage)sres_deriv_funcuse_opc_instead_of_oprv 000102030405060708090a0b0c0d0e0f 101112131415161718191a1b1c1d1e1fcfgr}op_opc6f20EF.SIM_AUTH_KEYc vt||dttddt t dddz dt z d ttd ddd z }td |z dtdz dtdz |_ dS)NUSIM authentication keyr6rrrrrrrrvr!r)r comp128v1 comp128v2 comp128v3rr}r9r) r=r>r~r rr Flagr rrr@rBrCrDr7CfgByterGs rHr>zEF_SIM_AUTH_KEY.__init__s 4.GHHHGAJJ-gca1::.F.FF3D8'Va1XYef(g(g(ggii!w!&uRyy!)599!466rI)rrrJrQs@rHrrs N&'$U_``#899S;<< > > @O 6666666666rIrc$eZdZfdZdZxZS) DF_SYSTEMctdddtddtddtd d td d td dtddtt t t tttg }| |dS)Na515z DF.SYSTEMzCardOS specifics)rDr7r8r3r46f81zEF.CHV26f0azEF.ADM16f0bzEF.ADM26f0czEF.ADM36f0dzEF.ADM4) r=r>r#rSrlrrrrr add_files)rCfilesrGs rHr>zDF_SYSTEM.__init__s V+rrPrQs@rHrrsN&QQQQQQQrIrcPeZdZddddddddddddddgd d fgZdfd ZxZS) EF_USIM_SQNd503000200000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000TFr)skip_next_sqn_checkdelta_max_checkage_limit_check sqn_checkind_lenr)rdont_clear_amf_for_macs aus_concealedautn_concealedl) rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr)flag1flag2 delta_max age_limit freshnessaf30 EF.USIM_SQNc t||dtdtz dtz dtz dtz dt dz }td t d z d tz d tz d tz }t d|z d|z dtdz dtdz dttdz |_ dS)NzSQN parameters for AKAr6rrrrrr!rrrrrrrrrr) r=r>r~rr rrrrrB)rCrDr7Flag1Flag2rGs rHr>zEF_USIM_SQN.__init__s 4.FGGG/46G6L+D0+d2B#KNN244% *,Ed,J)$.0@0EGG  !,!-a"12=l1oo2M!,[a-I-I!IKKrI)rrrrQs@rHrrs i,0T^crv !##56SXko@D.F.FT^ %=%=%= > > @O K K K K K K K K K KrIrc eZdZddddddededd fd d d ddd d d d ddededdfgZdfd ZdedefdZdedefdZ xZ S)EF_USIM_AUTH_KEYB141898d827f70120d33b3e7462ee5fd6fe6ca53d7a0a804561646816d7b0c702fbFrTronly_4bytes_res_in_3gsres_deriv_func_in_2grrv 1898d827f70120d33b3e7462ee5fd6fe 6ca53d7a0a804561646816d7b0c702fbrf160a04101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f000102030405060708090a0b0c0d0e0ftuakr<)rvrwrr)ck_and_ik_sizemac_sizeres_sizer!r@101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f)rtuak_cfgnum_of_keccak_iterationskraf20EF.USIM_AUTH_KEYc4t||dttdddd}t t dd t z d ttd dd z d ttd ddz d|z }td|z dtdz dtdz |_ t t ddttd ddz d ttd dd z d ttd ddz d|z }t t ddttd ddz dttdd dddz dttdd ddddz }td|z d|z dtz dtdz d ttjjd!zz |_dS)"Nrr6r!rr)rsha1_akarxorrrrrrr)FTrvrr}r9rrw)r<rrrr)r;r<rr)r:r;r<rrrr:rr )r=r>r rr~r rrr rr@rBr rr rrw _constr_tuak)rCrDr7 Algorithmr CfgByteTuak TuakCfgByterGs rHr>zEF_USIM_AUTH_KEY.__init__s  4.GHHH!aaRHHH GAJJ(?(D3GCA4L4LL3GCPQARAR4S4SS' 133!w!&uRyy!)%))!355   ,WSqa..-I-I I 7QZZ8P8P P 7ATUEVEV8W8W W +I 5 77   01!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 FFrIrreturnct|ddzdkrt|j|St|j|S)Nrrr)parse_constructrrB)rCrs rH _decode_binzEF_USIM_AUTH_KEY._decode_bins; ?T !T ) )"4#4lCC C"4?LAA ArI abstract_datac z|dddkrt|j|St|j|S)Nrrvr)build_constructrrB)rCr rs rH _encode_binzEF_USIM_AUTH_KEY._encode_bins<   , 6 6"4#4mDD D"4?MBB BrI)rr) rKrLrMrNrOr> bytearraydictr rrPrQs@rHrrs< N.3ajn~HJJ39::ccJlFmFm p p r s#)#YZvz||-0sQTVV()788c\]]    OFFFFFF8B BdBBBB CCICCCCCCCCrIrc`eZdZddddddededd fgZd fd ZxZS)EF_USIM_AUTH_KEY_2GrFrTrrrrraf22EF.USIM_AUTH_KEY_2Gct||dttddtz dt t dddz dtz d ttd dd d d z }td|z dtdz dtdz |_ dS)Nz%USIM authentication key in 2G contextr6rrrrrrrvr!rr)rrrrrrr}r9r) r=r>r~r rrr r rrr@rBrs rHr>zEF_USIM_AUTH_KEY_2G.__init__s 4.UVVVGAJJ(?(D3GCA4L4LL3D8'Va1XYefln(o(o(ooqq!w!&uRyy!)%))!355rI)rrrJrQs@rHrr s N,1Ahl *,,#899S;<< > > @O5555555555rIrc eZdZdfd ZxZS) EF_GBA_SKaf31 EF.GBA_SKcht||dt|_dSN!Secret key for GBA key derivationr6r=r> GreedyBytesrBrs rHr>zEF_GBA_SK.__init__s. 4.QRRR%rI)rrrrQs@rHrrs=&&&&&&&&&&rIrc eZdZdfd ZxZS)EF_GBA_REC_LISTaf32EF.GBA_REC_LISTct||dtt|_dSr)r=r>rrrBrs rHr>zEF_GBA_REC_LIST.__init__$s6 4.QRRR%f--rI)r#r$rrQs@rHr"r"#s=..........rIr"c eZdZdfd ZxZS)EF_GBA_INT_KEYaf33EF.GBA_INT_KEYcjt||ddt|_dS)Nr)r:r:rsrrs rHr>zEF_GBA_INT_KEY.__init__+s; 4A8  U U U%rI)r(r)rrQs@rHr'r'*s=&&&&&&&&&&rIr'c2eZdZgdZedefdZdS) SysmocomSJA2),3b9f96801f878031e073fe211b674a4c753034054ba9,3b9f96801f878031e073fe211b674a4c7531330251b2,3b9f96801f878031e073fe211b674a4c5275310451d5rsc(|jtd|jjvrw|jjd}t t t tttg}| |d|jjvrX|jjd}t dt dtdg}| |dSdSz7Add sysmocom SJA2 specific files to given RuntimeState.a0000000871002a0000000871004zEF.ISIM_AUTH_KEY)r7zEF.ISIM_AUTH_KEY_2Gz EF.ISIM_SQNN mfadd_filer applicationsrrrr"r'rrclsr0usim_adffiles_adf_usimisim_adffiles_adf_isims rHrzSysmocomSJA2.add_files6 y{{### ru1 1 1u)*:;H ""#%% !!   N   ~ . . . ru1 1 1u)*:;H &8999#)>???///N   ~ . . . . . 2 1rINrKrLrM_atrs classmethodrrrIrHr,r,1L = = =E/<///[///rIr,c2eZdZgdZedefdZdS) SysmocomSJA5),3b9f96801f878031e073fe211b674a357530350251cc,3b9f96801f878031e073fe211b674a357530350265f8,3b9f96801f878031e073fe211b674a357530350259c4r0c(|jtd|jjvrw|jjd}t t t tttg}| |d|jjvrX|jjd}t dt dtdg}| |dSdSr2r5r9s rHrzSysmocomSJA5.add_filesUr?rINr@rCrIrHrFrFPrDrIrF)4__doc__structr constructrrrrrr r r r r rrrrrrrrA osmocom.utilsosmocom.constructpySim.filesystem pySim.runtimerr key_type2str key_algo2strru TransparentEFr#rS LinFixedEFrlrrrrrCardDFrrrrrr"r' CardModelr,rFrCrIrHrXs3$ZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[[[[[++++++&&&&&&           =====]===811111m111( P P P P P* P P P55555J555DDDDD-DDD / / / / /* / / /YYYYYZYYY66666m666$QQQQQQQQ0KKKKK-KKK,3C3C3C3C3C}3C3C3Cl55555-555&&&&&& &&& .....m...&&&&&Z&&&/////9///>/////9/////rI