/** Ċ # ĠCopyright Ġ 2 0 1 8 Ġ- ĠTrans co di um ĠLtd . Ċ # Ġ ĠAll Ġrights Ġreserved . ĠThis Ġprogram Ġand Ġthe Ġaccompanying Ġmaterials Ċ # Ġ Ġare Ġmade Ġavailable Ġunder Ġthe Ġterms Ġof Ġthe Ġ ĠApache ĠLicense Ġv 2 . 0 Ġwhich Ġaccomp anies Ġthis Ġdistribution . Ċ # Ċ # Ġ ĠThe ĠApache ĠLicense Ġv 2 . 0 Ġis Ġavailable Ġat Ċ # Ġ Ġhttp :// www . opensource . org / licenses / apache 2 . 0 . php Ċ # Ċ # Ġ ĠYou Ġare Ġrequired Ġto Ġredistribute Ġthis Ġcode Ġunder Ġthe Ġsame Ġlicenses . Ċ # Ċ # Ġ ĠProject ĠT NS Money Ċ # Ġ Ġ@ author ĠR az ak ĠZ ak ari Ġ< raz ak @ trans co di um . com > Ċ # Ġ Ġhttps :// trans co di um . com Ċ # Ġ Ġcreated _ at Ġ 1 6 / 0 8 / 2 0 1 8 Ċ Ġ**/ Ċ Ċ package Ġcom . trans co di um . tn sm oney . classes Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . KeyPair Generator Spec Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġcom . trans co di um . tn sm oney . classes . Status Ċ import Ġjava . math . BigInteger Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . security . auth . x 5 0 0 . X 5 0 0 Principal Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . content . edit Ċ import Ġcom . trans co di um . tn sm oney .* Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . Object InputStream Ċ import Ġjava . io . Object OutputStream Ċ import Ġjava . security .* Ċ import Ġjava . security . spec . M GF 1 Parameter Spec Ċ import Ġjava . util .* Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec .* Ċ import Ġkotlin . collections . HashMap ĊĊ Ċ class ĠCrypt Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġ// add Ġsp ong y Ġcast le ĊĠĠĠĠĠĠĠ ĠSecurity . add Provider ( org . sp ong ycastle . j ce . provider . Bo unc y Castle Provider ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIS _ ANDROID _ M _ OR _ HIG HER Ġ= Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIS _ LOWER _ THAN _ ANDROID _ M Ġ= Ġ! IS _ ANDROID _ M _ OR _ HIG HER ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSP ONG Y _ CAST LE _ PROVIDER Ġ= Ġorg . sp ong ycastle . j ce . provider . Bo unc y Castle Provider () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAND ROID _ KEY STORE _ PROVIDER Ġ= Ġ" Android KeyStore " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ AL GO Ġ= Ġ" RSA " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġval ĠCERT _ START _ DATE Ġ= ĠCalendar . getInstance () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġval ĠCERT _ END _ DATE Ġ= ĠCERT _ START _ DATE . apply { Ġadd ( Calendar . YEAR , 2 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIV _ LEN _ BITS Ġ= Ġ 9 6 Ġ// Ġ 1 2 byte ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġ Ġval ĠSYM METRIC _ KEY _ LEN _ BITS Ġ= Ġ 1 2 8 Ġ// Ġ 1 6 Ġbyte ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG CM _ TAG _ SIZE _ BITS Ġ= Ġ 1 2 8 Ġ// Ġ 1 6 Ġbyte ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSYM METRIC _ AL GO Ġ= Ġ" AES " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġval ĠKEY _ ALIAS Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . APPLICATION _ ID ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRSA _ KEY _ SIZE _ BITS Ġ= Ġ 2 0 4 8 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm KeyStore Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . getInstance ( ANDROID _ KEY STORE _ PROVIDER ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}// end Ġks ĊĊĊĠĠĠĠĠĠĠ Ġ// cipher Ġtransformation ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRSA _ CIPHER _ TRANS FORMATION Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( IS _ LOWER _ THAN _ ANDROID _ M ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" RSA / E CB / PKCS 1 Padding " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" RSA / E CB / OA EP With SHA - 2 5 6 And M GF 1 Padding " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}// end ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAES _ CIPHER _ TRANS FORMATION Ġ= Ġ" AES / GCM / No Padding " ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġgenerate Sy metric ĠKey ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Symmetric Key (): ĠSecret Key Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey gen Ġ= ĠKey Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSYM METRIC _ AL GO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP ONG Y _ CAST LE _ PROVIDER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs rand Ġ= ĠSecure Random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey gen . init ( SYM METRIC _ KEY _ LEN _ BITS , Ġs rand ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgen Key Ġ= Ġkey gen . generate Key (). encoded ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// secure Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSecret KeySpec ( gen Key , ĠSYM METRIC _ AL GO ) ĊĠĠĠĠĠĠĠ Ġ}// end Ġfun ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠ Ġ* Ġcreate Sy metric ĠKey ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate As ymmetric Key ( context : ĠContext ): Status Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . e (" KEY _ ALIAS ", generate Sy metric Key ( context ). toJson String ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerator Ġ= ĠKey Pair Generator . getInstance ( KEY _ AL GO , ĠAND ROID _ KEY STORE _ PROVIDER ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġif ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . M ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// api Ġlevel Ġlower Ġthan ĠM Ġ( M ash mel lo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair Generator Spec . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alias ( KEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set SerialNumber ( BigInteger . ONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subject ( X 5 0 0 Principal (" CN =$ KEY _ ALIAS ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StartDate ( CERT _ START _ DATE . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Size ( RSA _ KEY _ SIZE _ BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set EndDate ( CERT _ END _ DATE . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { Ġ// Ġice Ġc ream Ġmr Ġand Ġhigher ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Gen Parameter Spec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ DE CRYPT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ E CB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ RSA _ OA EP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate Subject ( X 5 0 0 Principal (" CN =$ KEY _ ALIAS ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate Not Before ( CERT _ START _ DATE . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate Not After ( CERT _ END _ DATE . time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Size ( RSA _ KEY _ SIZE _ BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setUser Authentication Required ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Digest s ( Key Properties . DIG EST _ SHA 2 5 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}// end Ġif ĊĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . initialize ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . gen KeyPair () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" CREATE _ KEY PAIR _ ERROR "," Failed Ġto Ġcreate Ġkey pair ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . error (" security _ keys _ create _ failed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . e (" PRIVATE _ KEY ", generator . gen KeyPair (). toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . success ( data Ġ= Ġkey Pair ) ĊĠĠĠĠĠĠĠ Ġ}// end Ġfn ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġfetch Key ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget As ymmetric KeyPair (): ĠKey Pair ? { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġm KeyStore . getKey ( KEY _ ALIAS , null ) Ġas ĠPrivate Key ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġm KeyStore . get Certificate ( KEY _ ALIAS )?. publicKey ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( privateKey Ġ!= Ġnull Ġ&& ĠpublicKey Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair ( publicKey , ĠprivateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}// end Ġ Ġget ĠAs y metric ĠKey ĠPair ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRS AC ipher ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ ĠRS AC ipher ( mode : ĠInt , key : ĠKey ): ĠCipher { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( RSA _ CIPHER _ TRANS FORMATION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IS _ ANDROID _ M _ OR _ HIG HER ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠO A EP Spec Ġ= ĠO A EP Parameter Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SHA - 2 5 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" M GF 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM GF 1 Parameter Spec (" SHA - 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP Source . P Specified . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( mode , Ġkey , OA EP Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( mode , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcipher ĊĠĠĠĠĠĠĠ Ġ}// end ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġencrypt Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠRSA Wrap Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠSecret Key ĊĠĠĠĠĠĠĠ Ġ): ĠStatus Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . e (" Size ", data . encoded . size . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// lets Ġfetch Ġthe Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġkey Pair Ġ= Ġget As ymmetric KeyPair () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Pair Ġ== Ġnull ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// generate Ġnew Ġkey pair ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerate KeyPair Ġ= Ġgenerate As ymmetric Key ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( generate KeyPair . isError ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerate KeyPair ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair Ġ= Ġgenerate KeyPair . getData < KeyPair >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( key Pair Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" SECURITY _ KEY PAIR _ ERROR "," Failed Ġto Ġcreate Ġor Ġfetch Ġencryption Ġkey pair ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . failed _ to _ generate _ security _ keys , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Se vere Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠRS AC ipher ( Cipher . WRAP _ MODE , key Pair . public ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcipher . wrap ( data ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . success ( data Ġ= Ġresult ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" rsa _ data _ encryption _ failed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= ĠStatus Codes . RSA _ ENCRYPT ION _ FAILED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Se vere Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}// en Ġencrypt ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġencrypt Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠRSA Un wrap Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠAny ĊĠĠĠĠĠĠĠ Ġ): ĠStatus Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// lets Ġfetch Ġthe Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Pair Ġ= Ġget As ymmetric KeyPair () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Pair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . error (" data _ de cryption _ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Bytes Ġ= Ġwhen ( data ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> ĠBase 6 4 . decode ( data , Base 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġdata ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĠStatus . error (" unknown _ encrypted _ data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// cipher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠRS AC ipher ( Cipher . UN WRAP _ MODE , key Pair . private ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunwrap ed Key Ġ= Ġcipher . unwrap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Data Bytes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AES ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCipher . SECRET _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . success ( data Ġ= Ġunwrap ed Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch ( e : ĠException ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" RSA _ KEY _ UN WRAP _ ERROR ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ e . cause }" Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" data _ de cryption _ failed _ 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= ĠStatus Codes . APP _ KEY _ DE CRYPT ION _ FAILED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Se vere Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}// end ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ}// end Ġfun ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġget IV ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate IV (): ĠByteArray { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs rand Ġ= ĠSecure Random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Ġ= ĠByteArray ( IV _ LEN _ BITS . from Bit To Byte ()) // Ġ 1 6 Ġbyte Ġwhich Ġis Ġ 1 2 8 Ġbit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġs rand . next Bytes ( iv ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġiv ĊĠĠĠĠĠĠĠ Ġ}// end ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcreate APP Key ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate App Key ( context : ĠContext ): ĠStatus { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġapp Ġkey Ġexists , Ġif Ġnot Ġcreate Ġon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas App Key Ġ= Ġ( context Ġas ĠActivity ). shared Pref (). contains ( APP _ KEY _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( has App Key ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget De crypted App Key ( context , true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġfetch Ġencrypted Keys ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget De crypted App Key ( context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate If No Key : ĠBoolean ? Ġ= Ġfalse ): ĠStatus { ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdecrypted Key : ĠSecret Key ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġencrypted Key Bytes : ĠByteArray ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshared Pref Ġ= Ġ Ġ( context Ġas ĠActivity ). shared Pref () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Key Ġ= Ġshared Pref . getString ( APP _ KEY _ NAME ," ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( encrypted Key . isNull OrEmpty ()){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġdo Ġnot Ġcreate Ġif Ġnot Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! create If No Key !! ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . missing _ app _ key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= ĠStatus Codes . MISSING _ APP _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Key Ġ= Ġgenerate Symmetric Key () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypt e Key Status Ġ= ĠRSA Wrap Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( encrypt e Key Status . isError ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġencrypt e Key Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Key Bytes Ġ= Ġencrypt e Key Status . getData < ByteArray >() !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// lets Ġsave Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Str Ġ= ĠBase 6 4 . encode ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Key Bytes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Pref . edit { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( APP _ KEY _ NAME , encrypted Data Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecode E crypted Keys Ġ= ĠBase 6 4 . decode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypt Key Status Ġ= ĠRSA Un wrap Key ( decode E crypted Keys ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( decrypt Key Status . isError ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecrypt Key Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypted Key Ġ= Ġdecrypt Key Status . getData < SecretKey >() !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}// end Ġif ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . success ( data Ġ= Ġdecrypted Key ) ĊĊĠĠĠĠĠĠĠĠ Ġ}// end Ġfun ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠ Ġ* Ġencrypt ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġencrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠAny ĊĠĠĠĠĠĠĠ Ġ): ĠStatus Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Key Status Ġ= Ġget De crypted App Key ( context , true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( app Key Status . isError ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapp Key Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Key Ġ= Ġapp Key Status . getData < SecretKey >() !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// generate ĠIV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Bytes Ġ= Ġgenerate IV () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠG CM Spec Ġ= ĠG CM Parameter Spec ( GCM _ TAG _ SIZE _ BITS , iv Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAES _ CIPHER _ TRANS FORMATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP ONG Y _ CAST LE _ PROVIDER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// cipher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , de crypted Key , GCM Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata To Encrypt Ġ= Ġif ( data Ġis ĠString ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Ġ= Ġcipher . do Final ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata To Encrypt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Out Ġ= ĠByteArrayOutputStream () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata HashMap Ġ= Ġhash Map Of < String , ĠByteArray >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" encrypted _ data " Ġto Ġencrypted Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" iv " Ġto Ġiv Bytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObject OutputStream ( byte Out ). write Object ( data HashMap ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// convert Ġto Ġbase 6 4 Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠBase 6 4 . encode ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Out . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . success ( data Ġ= Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" AES _ ENCRYPT ION _ ERROR ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġcreate ĠAES ĠEncryption : Ġ${ e . cause }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠR . string . data _ encryption _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Se vere Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}// end Ġrsa Ġencrypt ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġextract Parts ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġextract Parts ( data : ĠAny ): ĠHashMap < String , ByteArray >? { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// now Ġdecode Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoded Data Ġ= Ġwhen ( data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ Ġ-> ĠBase 6 4 . decode ( data , ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠByteArray Ġ-> Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray In Ġ= ĠByteArrayInputStream ( decoded Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Input Ġ= ĠObject InputStream ( byteArray In ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata HashMap Ġ= Ġobj Input . read Object () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( data HashMap Ġ! is ĠHashMap < *, *> ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( data HashMap Ġas ĠHashMap < String , ByteArray >) ĊĠĠĠĠĠĠĠ Ġ}// end ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġdecrypt Data ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdecrypt ( context : ĠContext , data : ĠString ): ĠStatus Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecoded Data Ġ= ĠBase 6 4 . decode ( data , ĠBase 6 4 . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Parts Ġ= Ġextract Parts ( decoded Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( data Parts Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStatus . error (" encrypted _ data _ part _ extract _ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data : ĠByteArray Ġ= Ġdata Parts [" encrypted _ data "] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġencrypted Keys : ĠByteArray Ġ= Ġdata Parts [" key "] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Data Bytes : ĠByteArray Ġ= Ġdata Parts [" iv "] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypt Key Status Ġ= Ġget De crypted App Key ( context , false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( decrypt Key Status . isError ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdecrypt Key Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġdecrypt Key Status . getData < SecretKey >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg cm Spec Ġ= ĠG CM Parameter Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG CM _ TAG _ SIZE _ BITS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv Data Bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( AES _ CIPHER _ TRANS FORMATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP ONG Y _ CAST LE _ PROVIDER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , secret Key , gcm Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Data Ġ= Ġcipher . do Final ( encrypted Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġresult Ġ= Ġdecrypted Data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . success ( data Ġ= Ġdecrypted Data ) ĊĊĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" AES _ DE CRYPT ION _ FAILURE "," AES ĠDec ryption ĠFailed : Ġ${ e . cause }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . error (" data _ de cryption _ failed _ error ") ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}// end Ġfun ĊĊĊĠĠĠ Ġ}// end Ġcompanion Ġobj Ċ Ċ } /// end Ġclass