package Ġcom . t ange m . common . core Ċ Ċ import Ġcom . t ange m .* Ċ import Ġcom . t ange m . common . Completion Result Ċ import Ġcom . t ange m . common . User Code Ċ import Ġcom . t ange m . common . User Code Type Ċ import Ġcom . t ange m . common . ap du . Command Ap du Ċ import Ġcom . t ange m . common . ap du . Response Ap du Ċ import Ġcom . t ange m . common . card . Encryption Mode Ċ import Ġcom . t ange m . common . core .* Ċ import Ġcom . t ange m . common . extensions . Void Callback Ċ import Ġcom . t ange m . common . extensions . calculate Sha 2 5 6 Ċ import Ġcom . t ange m . common . json .* Ċ import Ġcom . t ange m . common . n fc . Card Reader Ċ import Ġcom . t ange m . crypto . Encryption Helper Ċ import Ġcom . t ange m . crypto . pb k df 2 Hash Ċ import Ġcom . t ange m . operations .* Ċ import Ġcom . t ange m . operations . read . Read Command Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ Ċ /** Ċ Ġ* ĠAllows Ġinteraction Ġwith ĠT ange m Ġcards . ĠShould Ġbe Ġopened Ġbefore Ġsending Ġcommands . Ċ Ġ* Ċ Ġ* Ġ@ property Ġenvironment Ċ Ġ* Ġ@ property Ġreader Ġ Ġis Ġan Ġinterface Ġthat Ġis Ġresponsible Ġfor ĠN FC Ġconnection Ġand Ċ Ġ* Ġtransfer Ġof Ġdata Ġto Ġand Ġfrom Ġthe ĠT ange m ĠCard . Ċ Ġ* Ġ@ property Ġview Delegate Ġis Ġan Ġ Ġinterface Ġthat Ġallows Ġinteraction Ġwith Ġusers Ġand Ġshows Ġrelevant ĠUI . Ċ Ġ* Ġ@ property Ġcard Id ĠID , ĠUnique ĠT ange m Ġcard ĠID Ġnumber . ĠIf Ġnot Ġnull , Ġthe ĠSDK Ġwill Ġcheck Ġthat Ġyou Ġthe Ġcard Ċ Ġ* Ġwith Ġwhich Ġyou Ġt apped Ġa Ġphone Ġhas Ġthis Ġ[ card Id ] Ġand ĠSDK Ġwill Ġreturn Ċ Ġ* Ġthe Ġ[ T ange m Sdk Error . Wrong Card Number ] Ġotherwise . Ċ Ġ* Ġ@ property Ġinitial Message ĠA Ġcustom Ġdescription Ġthat Ġwill Ġbe Ġshown Ġat Ġthe Ġbeginning Ġof Ġthe ĠN FC Ġsession . Ċ Ġ* ĠIf Ġnull , Ġa Ġdefault Ġheader Ġand Ġtext Ġbody Ġwill Ġbe Ġused . Ċ Ġ*/ Ċ class ĠCard Session ( ĊĠĠĠ Ġval Ġview Delegate : ĠSession View Delegate , ĊĠĠĠ Ġval Ġenvironment : ĠSession Environment , ĊĠĠĠ Ġprivate Ġval Ġreader : ĠCard Reader , ĊĠĠĠ Ġprivate Ġval Ġjson Rpc Converter : ĠJSON RPC Converter , ĊĠĠĠ Ġcard Id : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġvar Ġinitial Message : ĠMessage ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġvar Ġcard Id : ĠString ? Ġ= Ġcard Id ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġconnected Tag : ĠTag Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġstate Ġ= ĠCard Session State . Inactive ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . IO ) Ġ+ ĠCor outine ExceptionHandler Ġ{ Ġ_, Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsw Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠ Ġthrowable . printStackTrace ( PrintWriter ( sw )) ĊĠĠĠĠĠĠĠ Ġval Ġexception AsString : ĠString Ġ= Ġsw . toString () ĊĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġexception AsString Ġ} ĊĠĠĠĠĠĠĠ Ġthrow Ġthrowable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpref light Read Mode : ĠPref light Read Mode Ġ= ĠPref light Read Mode . Full Card Read ĊĊĠĠĠ Ġfun Ġset Initial Message ( message : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Message Ġ= Ġmessage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Message ( message : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Delegate . setMessage ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġstarts Ġa Ġcard Ġsession , Ġperforms Ġpref light Ġ[ Read Command ], ĊĠĠĠĠ Ġ* Ġinvokes Ġ[ Card Session Runnable . run ] Ġand Ġcloses Ġthe Ġsession . ĊĠĠĠĠ Ġ* Ġ@ param Ġrunnable Ġ[ Card Session Runnable ] Ġthat Ġwill Ġbe Ġperformed Ġin Ġthe Ġsession . ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġwill Ġbe Ġtriggered Ġwith Ġa Ġ[ Completion Result ] Ġof Ġa Ġsession . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠCard Session Runnable < R >, ĠR > Ġstart With Runnable ( run nable : ĠT , Ġcallback : ĠCompletion Callback < R >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠCard Session State . Inactive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠT ange m Sdk Error . Busy () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"$ error " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Failure ( error )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Start Ġcard Ġsession Ġwith Ġrunnable " Ġ} ĊĠĠĠĠĠĠĠ Ġprepare Session ( run nable ) Ġ{ Ġprepare Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( prepare Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ{ Ġsession , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"$ error " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Failure ( error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Start Ġrunnable " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable . run ( this ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Runnable Ġcompleted " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġstop WithError ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"${ prepare Result . error }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Failure ( prepare Result . error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġa Ġcard Ġsession Ġand Ġperforms Ġpref light Ġ[ Read Command ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġon Session Started : Ġcallback Ġwith Ġthe Ġcard Ġsession . ĠCan Ġcontain Ġ[ T ange m Sdk Error ] Ġif Ġsomething Ġgoes Ġwrong . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart ( on Session Started : ĠSession Started Callback ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Start Ġcard Ġsession Ġwith Ġdelegate " Ġ} ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠCard Session State . Active ĊĠĠĠĠĠĠĠ Ġview Delegate . on Session Started ( card Id , Ġinitial Message , Ġenvironment . config . how To IsEnabled ) ĊĊĠĠĠĠĠĠĠ Ġreader . scope Ġ= Ġscope ĊĠĠĠĠĠĠĠ Ġreader . start Session () ĊĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . tag . as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġtag Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tag Type Ġ== ĠTag Type . N fc Ġ&& Ġpref light Read Mode Ġ!= ĠPref light Read Mode . None ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref light Check ( on Session Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Started ( this @ Card Session , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . tag . as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . on Tag Lost () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . on Tag Connected () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Tag Connected After Resume ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Tag Connected After Resume Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . tag . as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠC ancellation Exception Ġ&& Ġit . message Ġ== ĠT ange m Sdk Error . User Cancelled (). custom Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop WithError ( T ange m Sdk Error . User Cancelled ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Started ( this @ Card Session , ĠT ange m Sdk Error . User Cancelled ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull Ġ&& Ġconnected Tag Ġ!= Ġnull Ġ&& Ġstate Ġ== ĠCard Session State . Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . encryption Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Tag Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnected Tag Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( json Request : ĠString , Ġcallback : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson rpc Link er Ġ= ĠJSON RP CL inker ( json Request ). apply Ġ{ Ġinit Runnable ( json Rpc Converter ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( jsonrpc Link er . has Error ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( jsonrpc Link er . response . toJson ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjson rpc Link er . run nable !!. run ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson rpc Link er . link Result ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( jsonrpc Link er . response . toJson ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠCard Session Runnable <* >> Ġprepare Session ( run nable : ĠT , Ġcallback : ĠCompletion Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Prepare Ġcard Ġsession " Ġ} ĊĠĠĠĠĠĠĠ Ġpref light Read Mode Ġ= Ġrunnable . pref light Read Mode () ĊĠĠĠĠĠĠĠ Ġrunnable . prepare ( this , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpref light Check ( on Session Started : ĠSession Started Callback ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Start Ġpref light Ġcheck " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpref light Task Ġ= ĠPref light Read Task ( pref light Read Mode , Ġcard Id ) ĊĠĠĠĠĠĠĠ Ġpref light Task . run ( this ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Started ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrong Type Ġ= Ġwhen Ġ( result . error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT ange m Sdk Error . Wrong Card Type Ġ-> ĠWrong ValueType . Card Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT ange m Sdk Error . Wrong Card Number Ġ-> ĠWrong ValueType . Card Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wrong Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"${ result . error }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . on Wrong Card ( wrong Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch ( scope . coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 3 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connected Tag Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Started ( this @ Card Session , Ġresult . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop WithError ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . on Tag Connected () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref light Check ( on Session Started ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Session Started ( this , Ġresult . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop WithError ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġcurrent Ġsession Ġwith Ġthe Ġtext Ġmessage . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage ĠIf Ġnull , Ġthe Ġdefault Ġmessage Ġwill Ġbe Ġshown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop ( message : ĠMessage ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Session () ĊĠĠĠĠĠĠĠ Ġview Delegate . on Session Stopped ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġcurrent Ġsession Ġon Ġerror . ĊĠĠĠĠ Ġ* Ġ@ param Ġerror ĠAn Ġerror Ġthat Ġwill Ġbe Ġshown . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop WithError ( error : ĠT ange m Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Session () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ! is ĠT ange m Sdk Error . User Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ" Finish ing Ġwith Ġerror : Ġ${ error . code }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Delegate . onError ( error ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . debug Ġ{ Ġ" User Ġcancelled ĠN FC Ġsession " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Session () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Stop Ġsession " Ġ} ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠCard Session State . Inactive ĊĠĠĠĠĠĠĠ Ġpref light Read Mode Ġ= ĠPref light Read Mode . Full Card Read Ċ // ĠĠĠĠĠĠĠ Ġenvironment Service . save Environment Values ( environment , Ġcard Id ) ĊĠĠĠĠĠĠĠ Ġreader . stop Session () ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ( ap du : ĠCommand Ap du , Ġcallback : ĠCompletion Callback < Response Ap du >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Send " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsubscription Ġ= Ġreader . tag . open Subscription () ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . consume As Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġestablish Encryption IfNeeded () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġap du . encrypt ( environment . encryption Mode , Ġenvironment . encryption Key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġencrypted Ap du Ġ-> Ġreader . trans ceive Ap du ( encrypted Ap du ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ap du Ġ-> Ġdecrypt ( response Ap du ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠT ange m Sdk Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Failure ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT ange m Sdk Error . Tag Lost Ġ-> ĠLog . session Ġ{ Ġ" Tag Ġlost . ĠWaiting Ġfor Ġtag ..." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . error Ġ{ Ġ"${ result . error }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause ( error : ĠT ange m Error ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreader . pause Session () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġon Tag Connected After Resume : ĠVoid Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġresume ( on Tag Connected : ĠVoid Callback ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Tag Connected After Resume Ġ= Ġon Tag Connected ĊĠĠĠĠĠĠĠ Ġreader . resume Session () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġestablish Encryption IfNeeded (): ĠCompletion Result < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Try Ġestablish Ġencryption " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( environment . encryption Mode Ġ== ĠEncryption Mode . None Ġ|| Ġenvironment . encryption Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompletion Result . Success ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġencryption Helper Ġ= ĠEncryption Helper . create ( environment . encryption Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠCompletion Result . Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ange m Sdk Error . Crypto Utils Error (" Failed Ġto Ġestablish Ġencryption ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġopen Session Command Ġ= ĠOpen Session Command ( encryption Helper . key A ) ĊĠĠĠĠĠĠĠ Ġval Ġap du Ġ= Ġopen Session Command . serialize ( environment ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresponse Ġ= Ġreader . trans ceive Ap du ( ap du )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Session Command . deserialize ( environment , Ġresponse . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠT ange m Sdk Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompletion Result . Failure ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġresult . uid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Key Ġ= Ġenvironment . access Code . value ?. pb k df 2 Hash ( uid , Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠCompletion Result . Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ange m Sdk Error . Crypto Utils Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġestablish Ġencryption " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= Ġencryption Helper . generate Secret ( result . session Key B ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Key Ġ= Ġ( secret Ġ+ Ġprotocol Key ). calculate Sha 2 5 6 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . encryption Key Ġ= Ġsession Key ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompletion Result . Success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġreturn ĠCompletion Result . Failure ( response . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt ( result : ĠCompletion Result < Response Ap du >): ĠCompletion Result < Response Ap du > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletion Result . Success ( result . data . decrypt ( environment . encryption Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠT ange m Sdk Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCompletion Result . Failure ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCompletion Result . Failure Ġ-> Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest User Code IfNeeded ( type : ĠUser Code Type , Ġis First Attempt : ĠBoolean , Ġcallback : ĠCompletion Callback < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Code Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Code Type . Access Code Ġ-> Ġenvironment . access Code . value ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Code Type . Pass code Ġ-> Ġenvironment . pass code . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( user Code Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Success ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . session Ġ{ Ġ" Request Ġuser Ġcode Ġof Ġtype : Ġ$ type " Ġ} ĊĠĠĠĠĠĠĠ Ġview Delegate . request User Code ( type , Ġis First Attempt ) Ġ{ Ġstring Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠUser Code ( type , Ġstring Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Code Type . Access Code Ġ-> Ġenvironment . access Code Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Code Type . Pass code Ġ-> Ġenvironment . pass code Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( Completion Result . Success ( Unit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġenum Ġclass ĠCard Session State Ġ{ ĊĠĠĠĠĠĠĠ ĠIn active , ĊĠĠĠĠĠĠĠ ĠActive ĊĠĠĠ Ġ} Ċ } Ċ Ċ type alias ĠSession Started Callback Ġ= Ġ( session : ĠCard Session , Ġerror : ĠT ange m Error ?) Ġ-> ĠUnit Ċ Ċ enum Ġclass ĠTag Type Ġ{ ĊĠĠĠ ĠN fc , ĊĠĠĠ ĠS lix Ċ } ĊĊ