package Ġchat . w ew e . android . manager ĊĊ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . util . Base 6 4 Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . PrivateKey Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ Ċ class ĠEncryption Manager ( context : ĠContext ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMASTER _ KEY Ġ= Ġ" master _ key " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PAIR _ ALGORITHM Ġ= Ġ" RSA " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SIZE : ĠInt Ġ= Ġ 5 1 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PROVIDER Ġ= Ġ" Android KeyStore " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTRANS FORMATION _ ASY M METRIC Ġ= Ġ" RSA / None / PKCS 1 Padding " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkey Store Wrapper Ġ= ĠKey Store Wrapper ( context ) ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠEncryption ĠStage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun Ġcreate Master Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store Wrapper . create Android KeyStore As ymmetric Key ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Master Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Store Wrapper . remove Android KeyStore Key ( MASTER _ KEY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt ( data : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). encrypt ( data , Ġmaster Key ?. public ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt ( data : ĠByteArray ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). encrypt ( data , Ġmaster Key ?. public ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt Others ( data : ĠString , Ġkey : ĠPublicKey ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). encrypt ( data , Ġkey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencrypt Others ( data : ĠByteArray , Ġkey : ĠPublicKey ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). encrypt ( data , Ġkey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt ( data : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). decrypt ( data , Ġmaster Key ?. private ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt ( data : ĠByteArray ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher Wrapper ( TRANS FORMATION _ ASY M METRIC ). decrypt ( data , Ġmaster Key ?. private ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠManage ĠKeys ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget My PublicKey (): ĠPublicKey ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmaster Key ?. public ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget My Priv at Key (): ĠPrivate Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= Ġkey Store Wrapper . get Android KeyStore As ymmetric KeyPair ( MASTER _ KEY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmaster Key ?. private ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Other PublicKey ( key : ĠString ): ĠPublicKey ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic Bytes : ĠByteArray Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . decode ( key , ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Spec Ġ= ĠX 5 0 9 Encoded KeySpec ( public Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Factory Ġ= ĠKey Factory . getInstance ( KEY _ PAIR _ ALGORITHM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Factory . generate Public ( key Spec ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }