package Ġme . hen ne ke . we ar auth n . f ido . u 2 f Ċ Ċ import Ġme . hen ne ke . we ar auth n . f ido . Ap du Exception Ċ import Ġme . hen ne ke . we ar auth n . f ido . Command Ap du Ċ import Ġme . hen ne ke . we ar auth n . f ido . Status Word Ċ Ċ @ Experimental Unsigned Types Ċ enum Ġclass ĠAuth enticate Control Byte ( val Ġvalue : ĠU Byte ) Ġ{ ĊĠĠĠ ĠEN FORCE _ USER _ PRES ENCE _ AND _ SIGN ( 0 x 0 3 u ), ĊĠĠĠ ĠCHECK _ ONLY ( 0 x 0 7 u ), ĊĠĠĠ ĠD ONT _ EN FORCE _ USER _ PRES ENCE _ AND _ SIGN ( 0 x 0 8 u ), Ċ } Ċ Ċ @ Experimental Unsigned Types Ċ enum Ġclass ĠRequest Command ( val Ġvalue : ĠU Byte ) Ġ{ ĊĠĠĠ ĠREG ISTER ( 0 x 0 1 u ), ĊĠĠĠ ĠAUTH ENT ICATE ( 0 x 0 2 u ), ĊĠĠĠ ĠVERSION ( 0 x 0 3 u ), Ċ } ĊĊ Ċ @ Experimental Unsigned Types Ċ sealed Ġclass ĠRequest Ġ{ ĊĠĠĠ Ġdata Ġclass ĠRegistration Request ( val Ġchallenge : ĠByteArray , Ġval Ġapplication : ĠByteArray ) Ġ: ĠRequest () ĊĠĠĠ Ġdata Ġclass ĠAuthentication Request ( ĊĠĠĠĠĠĠĠ Ġval Ġcontrol Byte : ĠAuth enticate Control Byte , ĊĠĠĠĠĠĠĠ Ġval Ġchallenge : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġapplication : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġkey Handle : ĠByteArray ĊĠĠĠ Ġ) Ġ: ĠRequest () ĊĊĠĠĠ Ġobject ĠVersion Request Ġ: ĠRequest () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( ap du : ĠCommand Ap du ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand : ĠRequest Command ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontrol Byte : ĠAuth enticate Control Byte ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ap du . ins ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . REGISTER . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġaccept Ġany Ġvalue Ġfor ĠP 1 Ġsince Ġvarious Ġreal - world Ġapplications Ġpopulate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġ( e . g . Ġwith Ġ 0 x 8 0 Ġif Ġenterprise Ġat testation Ġis Ġrequested Ġor Ġwith Ġa Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġm im ick ing Ġthe ĠAuth enticate Control Byte ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . p 2 Ġ!= Ġ 0 x 0 0 . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . IN CORRECT _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠRequest Command . REGISTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . AUTHENT ICATE . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Byte Ġ= Ġwhen Ġ( ap du . p 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . EN FORCE _ USER _ PRES ENCE _ AND _ SIGN . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . EN FORCE _ USER _ PRES ENCE _ AND _ SIGN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . CHECK _ ONLY . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . CHECK _ ONLY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . D ONT _ EN FORCE _ USER _ PRES ENCE _ AND _ SIGN . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticate Control Byte . D ONT _ EN FORCE _ USER _ PRES ENCE _ AND _ SIGN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . IN CORRECT _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . p 2 Ġ!= Ġ 0 x 0 0 . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . IN CORRECT _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠRequest Command . AUTHENT ICATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . VERSION . value Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . p 1 Ġ!= Ġ 0 x 0 0 . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . IN CORRECT _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . p 2 Ġ!= Ġ 0 x 0 0 . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . IN CORRECT _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠRequest Command . VERSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . INS _ NOT _ SUPPORTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . cla Ġ!= Ġ 0 x 0 0 . to U Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . CLA _ NOT _ SUPPORTED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . REGISTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . le Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . lc Ġ!= Ġ 3 2 Ġ+ Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchallenge Ġ= Ġap du . data . slice Array ( 0 Ġuntil Ġ 3 2 ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġap du . data . slice Array ( 3 2 Ġuntil Ġ 6 4 ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRegistration Request ( challenge , Ġapplication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . AUTHENT ICATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . le Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . lc Ġ< Ġ 3 2 Ġ+ Ġ 3 2 Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Handle Length Ġ= Ġap du . data [ 6 4 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . lc Ġ!= Ġ 3 2 Ġ+ Ġ 3 2 Ġ+ Ġ 1 Ġ+ Ġkey Handle Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchallenge Ġ= Ġap du . data . slice Array ( 0 Ġuntil Ġ 3 2 ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġap du . data . slice Array ( 3 2 Ġuntil Ġ 6 4 ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Handle Ġ= Ġap du . data . slice Array ( 6 5 Ġuntil Ġ 6 5 Ġ+ Ġkey Handle Length ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAuthentication Request ( control Byte !! , Ġchallenge , Ġapplication , Ġkey Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Command . VERSION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ap du . lc Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAp du Exception ( Status Word . WRONG _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġorder Ġto Ġpass Ġthe ĠF ID O Ġtests , Ġwe Ġmust Ġnot Ġmake Ġany Ġassumption Ġon Ġle Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVersion Request ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ @ Experimental Unsigned Types Ċ sealed Ġclass ĠResponse Ġ{ ĊĠĠĠ Ġabstract Ġval Ġdata : ĠU ByteArray ĊĠĠĠ Ġval Ġstatus Word Ġ= ĠStatus Word . NO _ ERROR ĊĊĠĠĠ Ġdata Ġclass ĠRegistration Response ( ĊĠĠĠĠĠĠĠ Ġval Ġuser PublicKey : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġkey Handle : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġat testation Cert : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġsignature : ĠByteArray ĊĠĠĠ Ġ) Ġ: ĠResponse () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdata Ġ= Ġ ubyte ArrayOf ( 0 x 0 5 u ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser PublicKey . to U ByteArray () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ubyte ArrayOf ( key Handle . size . to U Byte ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Handle . to U ByteArray () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat testation Cert . to U ByteArray () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature . to U ByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠAuthentication Response ( ĊĠĠĠĠĠĠĠ Ġval Ġassertion : ĠByteArray ĊĠĠĠ Ġ) Ġ: ĠResponse () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdata Ġ= Ġassertion . as U ByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠVersion Response Ġ: ĠResponse () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdata Ġ= Ġ" U 2 F _ V 2 ". toByteArray (). to U ByteArray () ĊĠĠĠ Ġ} Ċ }