a sUgf@stddlZddlZddlZddlmZddlZddlmZmZddl m Z ddl m Z m Z mZmZGddde ZdS)N)Optional) NoCardError ProtocolError)LinkBase)h2bb2hHexstrResTuplecseZdZdZdZejdddddfeedfd d Z d d Z d,e e edddZ ddZedddZddZddZddZddZddZd d!Zd"d#Zeed$d%d&Zedd'd(Zeejd)d*d+ZZS)- SerialSimLinkzM pySim: Transport Link for serial (RS232) based readers included with simcardSerial /dev/ttyUSB0%)devicebaudratez-rtsF)rstdebugc sjtjfi|tj|js.td|jtj|jtj tj tj ddd|j d|_ ||_||_d|_dS)Nz&device file %s does not exist -- abortr)portZparityZbytesizeZstopbitstimeoutZxonxoffZrtsctsr)super__init__ospathexistsr ValueErrorserialr Z PARITY_EVENZ EIGHTBITSZ STOPBITS_TWOr_sl_rst_pin_debug_atr)selfoptsrrkwargs __class__/home/jenkins/workspace/gerrit-pysim-build/JOB_TYPE/test/a1/default/a3/default/a4/default/label/simtester/pySim/transport/serial.pyr"s  zSerialSimLink.__init__cCst|dr|jdS)Nr)hasattrrcloser r%r%r&__del__5s zSerialSimLink.__del__N)r newcardonlycCsd}z||sWdSd}Wnty0Yn0|durFt|nd}d}|dusbt|krz td||sWdSWqNtyd}YqNty|rd}n|d7}|dkrYqN0qNtdS)NFTrg?r) reset_cardrtimesleepr)r rr+existingmtZper%r%r& wait_for_card9s2      zSerialSimLink.wait_for_cardcCs |dSN)r-r)r%r%r&connect^szSerialSimLink.connect)returncCs|jSr3)rr)r%r%r&get_atraszSerialSimLink.get_atrcCsdSr3r%r)r%r%r& disconnectdszSerialSimLink.disconnectcCs(|}|dkrt|dkr$t|S)Nr) _reset_cardrr)r rvr%r%r&r-gs zSerialSimLink.reset_cardc Csd|_|jj|jjd}ddd}z$||jdd}||jd}Wn4tyz}ztd|j|WYd}~n d}~00||td|j ||dA| }|sdSt |dkrdS| d t |t |dkr| }q|sdSt |}| d |dt |g|_t d D]N}|d |>@r | }|jt || d tt d|t |fq t d|d@D]0}| }|jt || dt |q~| } | sq|jt | | dt | qdS)N)ZrtsZdtrrr)+-zInvalid reset pin %sg?;zTS: 0x%x Direct conventionzT0: 0x%xz T%si = %xAzHistorical = %xz Extra: %x)rrZsetRTSZsetDTRr Exceptionrr.r/Z flushInput_rx_byteord _dbg_printrangeappendchr) r Z rst_meth_mapZ rst_val_mapZrst_methZrst_valexcbt0ixr%r%r&r8osT &       &zSerialSimLink._reset_cardcCs|jrt|dSr3)rprint)r sr%r%r&rEszSerialSimLink._dbg_printcCsF|j||j}||krBtdt||r8dt|ndfdS)Nz&Bad echo value. Expected %02x, got %s)z%02xz(nil))rwritereadrrD)r rJrr%r%r&_tx_bytes   zSerialSimLink._tx_bytecCs@|j||jt|}||krrr`r,)NN)rrUrCrDrrrTbytes) r rVZdata_lenrJsw1sw2nilZto_recvdataswr%r%r&_send_apdu_raws:      zSerialSimLink._send_apdu_rawcCs d|jjS)Nz serial:%s)rnamer)r%r%r&__str__szSerialSimLink.__str__) arg_parserc Cs<|dd}|jdddddd|jd d d td d dddS)Nz Serial ReaderzUse a simple/ultra-low-cost serial reader attached to a (physical or USB/virtual) RS232 port. This doesn't work with all RS232-attached smart card readers, only with the very primitive readers following the ancient `Phoenix` or `Smart Mouse` design.z-dz--deviceZDEVr zSerial Device for SIM access)metavardefaulthelpz-bz--baudrZBAUDr zBaud rate used for SIM access)desttypererfrg)add_argument_group add_argumentint)rdZ serial_groupr%r%r&argparse_add_reader_argss  z&SerialSimLink.argparse_add_reader_args)NF)__name__ __module__ __qualname____doc__rbargparse Namespacestrboolrr*rrlr2r4rr6r7r-r8rErSrUrCr rarc staticmethodArgumentParserrm __classcell__r%r%r#r&r s,%7 4r )r.rrrtypingrrpySim.exceptionsrrpySim.transportr pySim.utilsrrrr r r%r%r%r&s