package Ġfr . cop per nic . lib . inter actors . ic lass Ċ Ċ import Ġfr . cop per nic . sdk . utils . core . C pc Bytes Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . experimental . and Ċ Ċ private Ġconst Ġval ĠP ADDING _ CO POR ATE _ 1 0 0 0 _ 3 5 _ BIT Ġ= Ġ 5 Ċ private Ġconst Ġval ĠP ADDING _ W IE G AND _ 3 7 Ġ= Ġ 3 Ċ private Ġconst Ġval ĠHEADER _ LENGTH Ġ= Ġ 8 Ċ private Ġconst Ġval ĠC ARD _ NUMBER _ W IE G AND _ 2 6 BIT _ LENGTH Ġ= Ġ 1 6 Ċ private Ġconst Ġval ĠC ARD _ NUMBER _ 3 7 _ BIT _ WITH _ FC _ LENGTH Ġ= Ġ 1 9 Ċ private Ġconst Ġval ĠC ARD _ NUMBER _ COR P _ 1 0 0 0 _ 4 8 _ BIT _ LENGTH Ġ= Ġ 2 3 Ċ private Ġconst Ġval ĠC ARD _ NUMBER _ COR P _ 1 0 0 0 _ 3 5 _ BIT _ LENGTH Ġ= Ġ 2 0 Ċ Ċ private Ġconst Ġval ĠMASK _ 8 _ BIT Ġ= Ġ 0 xFF Ċ private Ġconst Ġval ĠMASK _ 1 2 _ BIT Ġ= Ġ 0 xFF FL Ċ private Ġconst Ġval ĠMASK _ 1 6 _ BIT Ġ= Ġ 0 xFFFF Ċ private Ġconst Ġval ĠMASK _ 1 9 _ BIT Ġ= Ġ 0 x 7 FFFF L Ċ private Ġconst Ġval ĠMASK _ 2 0 _ BIT Ġ= Ġ 0 xFFFF FL Ċ private Ġconst Ġval ĠMASK _ 2 2 _ BIT Ġ= Ġ 0 x 3 FFFF FL Ċ private Ġconst Ġval ĠMASK _ 2 3 _ BIT Ġ= Ġ 0 x 7 FFFF FL Ċ private Ġconst Ġval ĠMASK _ 3 5 _ BIT Ġ= Ġ 0 x 6 FFFFFFFF L Ċ Ċ private Ġconst Ġval ĠFRAME _ LENGTH _ INDEX Ġ= Ġ 1 Ċ private Ġconst Ġval ĠTYPE _ INDEX Ġ= ĠHEADER _ LENGTH Ġ+ Ġ 4 Ċ private Ġconst Ġval ĠP ACS _ LENGTH _ INDEX Ġ= ĠHEADER _ LENGTH Ġ+ Ġ 5 Ċ private Ġconst Ġval ĠP ADDING _ INDEX Ġ= ĠHEADER _ LENGTH Ġ+ Ġ 6 Ċ private Ġconst Ġval ĠRESP ONSE _ OK Ġ= Ġ 0 x BD . to Byte () Ċ private Ġconst Ġval ĠCRC 1 6 _ LENGTH Ġ= Ġ 2 Ċ private Ġconst Ġval ĠLEN GTH _ VALUE _ LENGTH Ġ= Ġ 2 Ċ Ċ class ĠI Class Frame ( val Ġframe : ĠByteArray , Ġvar Ġwith Facility Code : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġvar Ġtype Ġ= ĠType . Unknown ĊĠĠĠ Ġvar Ġcard Number Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġfacility Code Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġcompany Code Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġp acs Ġ= Ġget P ACS Data ( frame ) ĊĠĠĠ Ġval Ġp acs Binary String Ġ= Ġp acs . to Binary String () ĊĠĠĠ Ġvar Ġbit Length : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġget P ACS Data ( frame : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( frame . size Ġ> ĠLEN GTH _ VALUE _ LENGTH Ġ&& Ġframe [ FRAME _ LENGTH _ INDEX ]. toInt () Ġ== Ġframe . size Ġ- ĠCRC 1 6 _ LENGTH Ġ- ĠLEN GTH _ VALUE _ LENGTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġframe [ HEADER _ LENGTH ] Ġ== ĠRESP ONSE _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( frame [ TYPE _ INDEX ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . HF . value Ġ-> Ġtype Ġ= ĠType . HF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . LF . value Ġ-> Ġtype Ġ= ĠType . LF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠType . Unknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp acs Length Ġ= Ġframe [ P ACS _ LENGTH _ INDEX ]. toInt () Ġ- Ġ 1 Ġ// without Ġpadding Ġbyte ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Ġ= Ġframe [ P ADDING _ INDEX ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit Length Ġ= Ġ( p acs Length Ġ* Ġ 8 ) Ġ- Ġpadding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Remove ĠHeader , ĠCRC 1 6 Ġand Ġpadding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ed Without Padding Ġ= Ġframe . copyOf Range ( P ADDING _ INDEX Ġ+ Ġ 1 , Ġframe . size Ġ- ĠCRC 1 6 _ LENGTH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ced Without Padding . size Ġ<= Ġ 4 ) Ġ{ Ġ// Int ĠW ie g and Ġ 2 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshift Ġright Ġto Ġget Ġp acs Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Value Ġ= ĠByteBuffer . wrap ( ced Without Padding ). int Ġ ush r Ġpadding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Ġ= Ġ( i Value Ġ ush r Ġ 1 Ġand ĠMASK _ 1 6 _ BIT ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfacility Code Ġ= Ġ( i Value Ġ ush r Ġ 1 Ġ+ ĠC ARD _ NUMBER _ W IE G AND _ 2 6 BIT _ LENGTH Ġand ĠMASK _ 8 _ BIT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC pc Bytes . int To ByteArray ( i Value , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ced Without Padding . size Ġin Ġ 5 .. 8 ) Ġ{ Ġ// ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshift Ġright Ġ Ġto Ġget Ġp acs Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Val Ġ= ĠC pc Bytes . byteArray To Long ( ced Without Padding , Ġtrue ) Ġshr Ġpadding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ced Without Padding . size Ġ== Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( padding Ġ== ĠP ADDING _ W IE G AND _ 3 7 ) Ġ{// ĠW ie g and Ġ 3 7 Ġbit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( with Facility Code ) Ġ{// with Ġfacility Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Ġ= Ġl Val Ġ ush r Ġ 1 Ġand ĠMASK _ 1 9 _ BIT Ġ// card Ġnumber Ġis Ġ 1 9 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfacility Code Ġ= Ġ( l Val Ġ ush r Ġ 1 Ġ+ ĠC ARD _ NUMBER _ 3 7 _ BIT _ WITH _ FC _ LENGTH Ġand ĠMASK _ 1 6 _ BIT . to Long ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Ġ= Ġl Val Ġ ush r Ġ 1 Ġand ĠMASK _ 3 5 _ BIT Ġ// card Ġnumber Ġis Ġ 3 5 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( padding Ġ== ĠP ADDING _ CO POR ATE _ 1 0 0 0 _ 3 5 _ BIT ) Ġ{ Ġ// corpor ate Ġ 1 0 0 0 Ġ 3 5 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Ġ= Ġl Val Ġ ush r Ġ 1 Ġand ĠMASK _ 2 0 _ BIT Ġ// card Ġnumber Ġis Ġ 2 0 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Code Ġ= Ġ( l Val Ġ ush r Ġ 1 Ġ+ ĠC ARD _ NUMBER _ COR P _ 1 0 0 0 _ 3 5 _ BIT _ LENGTH Ġand ĠMASK _ 1 2 _ BIT ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ced Without Padding . size Ġ== Ġ 6 ) Ġ{ Ġ// Cor por ate Ġ 1 0 0 0 Ġ 4 8 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Number Ġ= Ġl Val Ġ ush r Ġ 1 Ġand ĠMASK _ 2 3 _ BIT Ġ// card Ġnumber Ġis Ġ 2 3 bit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompany Code Ġ= Ġ( l Val Ġ ush r Ġ 1 Ġ+ ĠC ARD _ NUMBER _ COR P _ 1 0 0 0 _ 4 8 _ BIT _ LENGTH Ġand ĠMASK _ 2 2 _ BIT ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC pc Bytes . long To ByteArray ( l Val , Ġtrue )?. drop ( 8 Ġ- Ġp acs Length )?. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf () ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠType ( val Ġvalue : ĠByte ) Ġ{ ĊĠĠĠ ĠH F ( 0 x 8 1 . to Byte ()), ĊĠĠĠ ĠL F ( 0 x 8 0 . to Byte ()), ĊĠĠĠ ĠUnknown ( 0 x 0 0 ) Ċ } Ċ Ċ fun ĠByteArray . to Binary String (): ĠString { ĊĠĠĠ Ġvar Ġs Ġ= Ġ"" ĊĠĠĠ Ġthis . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= ĠString . format ("% 8 s ", ĠInteger . to Binary String (( it Ġand Ġ 0 xFF . to Byte ()). toInt ())). replace (' Ġ', Ġ' 0 ') ĊĠĠĠĠĠĠĠ Ġs Ġ+= Ġtemp . substring ( temp . length Ġ- Ġ 8 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġs Ċ } Ċ