package Ġcom . coin base . wallet . crypto . ciph ers Ċ Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec . GCM Parameter Spec Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ċ Ġ* ĠUtility Ġused Ġto Ġencrypt / decrypt Ġusing ĠAES - 2 5 6 ĠG CM Ċ Ġ*/ Ċ class ĠAES 2 5 6 GCM Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAUTH _ TAG _ SIZE Ġ= Ġ 1 2 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTRANS FORMATION Ġ= Ġ" AES / GCM / No Padding " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEncrypt Ġdata Ġusing Ġusing ĠAES - 2 5 6 ĠG CM ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠData Ġto Ġencrypt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġkey ĠSecret Ġused Ġto Ġencrypt Ġthe Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġiv ĠInitialization Ġvector . ĠAct s Ġas Ġa Ġsalt ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġpair Ġof Ġencrypted Ġdata Ġand Ġauth Tag ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġencrypt ( data : ĠByteArray , Ġkey : ĠByteArray , Ġiv : ĠByteArray ): ĠPair < ByteArray , ĠByteArray > Ġ= ĠCipher Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( TRANS FORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Spec Ġ= ĠG CM Parameter Spec ( AUTH _ TAG _ SIZE , Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠSecret KeySpec ( key , Ġ" AES ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġkey Spec , Ġparam Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Bytes Ġ= Ġcipher . do Final ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġciphertext End Index Ġ= Ġcipher Bytes . size Ġ- Ġ( AUTH _ TAG _ SIZE Ġ/ ĠByte . SIZE _ BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġcipher Bytes . copyOf Range ( 0 , Ġciphertext End Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Tag Bytes Ġ= Ġcipher Bytes . copyOf Range ( ciphertext End Index , Ġcipher Bytes . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( encrypted Bytes , Ġauth Tag Bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEncrypt Ġdata Ġwith ĠAES - 2 5 6 ĠG CM Ġusing Ġusing ĠAndroid ĠKey Store Ġsecret Ġkey ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠData Ġto Ġencrypt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġsecret Key ĠSecret Ġkey Ġfrom ĠAndroid ĠKey Store ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġtriple Ġof Ġiv , Ġauth Tag , Ġand Ġencrypted Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws Ġ` Encryption Exception . invalid AES 2 5 6 GCM Data ` Ġif Ġunable Ġto Ġencrypt Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġencrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Key : ĠSecret Key ĊĠĠĠĠĠĠĠ Ġ): ĠTrip le < ByteArray , ĠByteArray , ĠByteArray > Ġ= ĠCipher Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( TRANS FORMATION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġsecret Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Bytes Ġ= Ġcipher . do Final ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher End Index Ġ= Ġcipher Bytes . size Ġ- Ġ( AUTH _ TAG _ SIZE Ġ/ ĠByte . SIZE _ BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Bytes Ġ= Ġcipher Bytes . copyOf Range ( 0 , Ġcipher End Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Tag Bytes Ġ= Ġcipher Bytes . copyOf Range ( cipher End Index , Ġcipher Bytes . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( cipher . iv , Ġauth Tag Bytes , Ġencrypted Bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDecrypt Ġdata Ġusing Ġusing ĠAES - 2 5 6 ĠG CM ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠData Ġto Ġdecrypt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġkey ĠSecret Ġused Ġto Ġencrypt Ġthe Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġiv ĠInitialization Ġvector . ĠAct s Ġas Ġa Ġsalt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġauth Tag Ġauthentication Ġtag . ĠUsed Ġto Ġverify Ġthe Ġintegrity Ġof Ġthe Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġdecrypted Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ` Encryption Error . invalid AES 2 5 6 GCM Data ` Ġif Ġunable Ġto Ġdecrypt Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdecrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Tag : ĠByteArray ĊĠĠĠĠĠĠĠ Ġ): ĠByteArray Ġ= ĠCipher Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( TRANS FORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Spec Ġ= ĠG CM Parameter Spec ( AUTH _ TAG _ SIZE , Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠSecret KeySpec ( key , Ġ" AES ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Ġ= Ġdata Ġ+ Ġauth Tag ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġkey Spec , Ġparam Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcipher . do Final ( encrypted Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDecrypt Ġdata Ġwith ĠAES - 2 5 6 ĠG CM Ġusing Ġusing ĠAndroid ĠKey Store Ġsecret Ġkey ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġdata ĠData Ġto Ġdecrypt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġsecret Key ĠSecret Ġkey Ġfrom ĠAndroid ĠKey Store ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġiv ĠInitialization Ġvector . ĠAct s Ġas Ġa Ġsalt ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġauth Tag Ġauthentication Ġtag . ĠUsed Ġto Ġverify Ġthe Ġintegrity Ġof Ġthe Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġtriple Ġof Ġiv , Ġauth Tag , Ġand Ġencrypted Ġdata ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdecrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Key : ĠSecret Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Tag : ĠByteArray ĊĠĠĠĠĠĠĠ Ġ): ĠByteArray Ġ= ĠCipher Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( TRANS FORMATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Spec Ġ= ĠG CM Parameter Spec ( AUTH _ TAG _ SIZE , Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Data Ġ= Ġdata Ġ+ Ġauth Tag ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġsecret Key , Ġparam Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcipher . do Final ( encrypted Data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ