#!/usr/bin/python3 from pySim.ota import * from pySim.sms import SMS_SUBMIT, SMS_DELIVER, AddressField from pySim.utils import h2b, h2b # pre-defined SPI values for use in test cases below SPI_CC_POR_CIPHERED_CC = { 'counter':'no_counter', 'ciphering':True, 'rc_cc_ds': 'cc', 'por_in_submit':False, 'por_shall_be_ciphered':True, 'por_rc_cc_ds': 'cc', 'por': 'por_required' } SPI_CC_POR_UNCIPHERED_CC = { 'counter':'no_counter', 'ciphering':True, 'rc_cc_ds': 'cc', 'por_in_submit':False, 'por_shall_be_ciphered':False, 'por_rc_cc_ds': 'cc', 'por': 'por_required' } SPI_CC_POR_UNCIPHERED_NOCC = { 'counter':'no_counter', 'ciphering':True, 'rc_cc_ds': 'cc', 'por_in_submit':False, 'por_shall_be_ciphered':False, 'por_rc_cc_ds': 'no_rc_cc_ds', 'por': 'por_required' } # SJA5 SAMPLE cards provisioned by execute_ipr.py OTA_KEYSET_SJA5_SAMPLES = OtaKeyset(algo_crypt='triple_des_cbc2', kic_idx=3, algo_auth='triple_des_cbc2', kid_idx=3, kic=h2b('300102030405060708090a0b0c0d0e0f'), kid=h2b('301102030405060708090a0b0c0d0e0f')) OTA_KEYSET_SJA5_AES128 = OtaKeyset(algo_crypt='aes_cbc', kic_idx=3, algo_auth='aes_cmac', kid_idx=3, kic=h2b('300102030405060708090a0b0c0d0e0f'), kid=h2b('301102030405060708090a0b0c0d0e0f')) # TODO: AES192 # TODO: AES256 testcases = [ { 'name': '3DES-SJA5-CIPHERED-CC', 'ota_keyset': OTA_KEYSET_SJA5_SAMPLES, 'spi': SPI_CC_POR_CIPHERED_CC, 'request': { 'apdu': b'\x00\xa4\x00\x04\x02\x3f\x00', 'encoded_cmd': '00201506193535b00011ae733256918d050b87c94fbfe12e4dc402f262c41cf67f2f', 'encoded_tpdu': '400881214365877ff6227052000000000302700000201506193535b00011ae733256918d050b87c94fbfe12e4dc402f262c41cf67f2f', }, 'response': { 'encoded_resp': '027100001c12b000118bb989492c632529326a2f4681feb37c825bc9021c9f6d0b', } }, { 'name': '3DES-SJA5-UNCIPHERED-CC', 'ota_keyset': OTA_KEYSET_SJA5_SAMPLES, 'spi': SPI_CC_POR_UNCIPHERED_CC, 'request': { 'apdu': b'\x00\xa4\x00\x04\x02\x3f\x00', 'encoded_cmd': '00201506093535b00011c49ac91ab8159ba5b83a54fb6385e0a5e31694f8b215fafc', 'encoded_tpdu': '400881214365877ff6227052000000000302700000201506093535b00011c49ac91ab8159ba5b83a54fb6385e0a5e31694f8b215fafc', }, 'response': { 'encoded_resp': '027100001612b0001100000000000000b5bcd6353a421fae016132', } }, { 'name': '3DES-SJA5-UNCIPHERED-NOCC', 'ota_keyset': OTA_KEYSET_SJA5_SAMPLES, 'spi': SPI_CC_POR_UNCIPHERED_NOCC, 'request': { 'apdu': b'\x00\xa4\x00\x04\x02\x3f\x00', 'encoded_cmd': '00201506013535b000113190be334900f52b025f3f7eddfe868e96ebf310023b7769', 'encoded_tpdu': '400881214365877ff6227052000000000302700000201506013535b000113190be334900f52b025f3f7eddfe868e96ebf310023b7769', }, 'response': { 'encoded_resp': '027100000e0ab0001100000000000000016132', } }, { 'name': 'AES128-SJA5-CIPHERED-CC', 'ota_keyset': OTA_KEYSET_SJA5_AES128, 'spi': SPI_CC_POR_CIPHERED_CC, 'request': { 'apdu': b'\x00\xa4\x00\x04\x02\x3f\x00', 'encoded_cmd': '00201506193535b00011ae733256918d050b87c94fbfe12e4dc402f262c41cf67f2f', 'encoded_tpdu': '400881214365877ff6227052000000000302700000201506193535b00011ae733256918d050b87c94fbfe12e4dc402f262c41cf67f2f', }, 'response': { 'encoded_resp': '027100001c12b000118bb989492c632529326a2f4681feb37c825bc9021c9f6d0b', } } ] for t in testcases: print() print("==== TESTCASE: %s" % t['name']) od = t['ota_keyset'] # RAM: B00000 # SIM RFM: B00010 # USIM RFM: B00011 tar = h2b('B00011') dialect = OtaDialectSms() outp = dialect.encode_cmd(od, tar, t['spi'], apdu=t['request']['apdu']) print("result: %s" % b2h(outp)) assert(b2h(outp) == t['request']['encoded_cmd']) with_udh = b'\x02\x70\x00' + outp print("with_udh: %s" % b2h(with_udh)) # processing of the response from the card da = AddressField('12345678', 'unknown', 'isdn_e164') #tpdu = SMS_SUBMIT(tp_udhi=True, tp_mr=0x23, tp_da=da, tp_pid=0x7F, tp_dcs=0xF6, tp_udl=3, tp_ud=with_udh) tpdu = SMS_DELIVER(tp_udhi=True, tp_oa=da, tp_pid=0x7F, tp_dcs=0xF6, tp_scts=h2b('22705200000000'), tp_udl=3, tp_ud=with_udh) print("TPDU: %s" % tpdu) print("tpdu: %s" % b2h(tpdu.toBytes())) assert(b2h(tpdu.toBytes()) == t['request']['encoded_tpdu']) r = dialect.decode_resp(od, t['spi'], t['response']['encoded_resp']) print("RESP: ", r)