package Ġcom . da im ler . mb common kit . security Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . util . Base 6 4 Ċ import Ġcom . da im ler . mb common kit . security . memory . Memory Cache Encryption Algorithm Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security .* Ċ import Ġjavax . crypto .* Ċ import Ġjavax . crypto . spec . GCM Parameter Spec Ċ Ċ @ Target Api ( Build . VERSION _ CODES . M ) Ċ internal Ġclass ĠA es Encryption Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġkey Store : ĠKey Store , ĊĠĠĠ Ġcache Encrypted Values : ĠBoolean Ċ ) Ġ: ĠMemory Cache Encryption Algorithm ( cache Encrypted Values ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAES _ MODE Ġ= Ġ" AES / GCM / No Padding " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG CM _ LENGTH Ġ= Ġ 1 2 8 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCipher Ġrequires Ġan ĠInitialization ĠVector Ġfor Ġde cryption Ġand Ġencryption . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFIX _ IV Ġ= Ġbyte ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 7 7 , Ġ 1 2 1 , Ġ 8 4 , Ġ 1 0 4 , Ġ 1 0 1 , Ġ 1 1 4 , Ġ 1 0 1 , Ġ 1 1 5 , Ġ 9 7 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠEncryption Algorithm ĊĠĠĠ Ġoverride Ġfun Ġgenerate Key ( alias : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store . contains Alias ( alias ). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠKey Gen Parameter Spec . Builder ( alias , ĠKey Properties . P URPOSE _ ENCRYPT . or ( Key Properties . P URPOSE _ DE CRYPT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ GCM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Random ized Encryption Required ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Generator . getInstance ( Key Properties . KEY _ ALGORITHM _ AES , Ġkey Store . type ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Key () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ns a : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġgenerate ĠKey Ġ$ alias .", Ġn sa ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n sp : ĠNoSuch Provider Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġgenerate ĠKey Ġ$ alias .", Ġn sp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ia pe : ĠInvalid Algorithm Parameter Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġgenerate ĠKey Ġ$ alias .", Ġi ape ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetKey ( alias : ĠString ): ĠKey Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . getKey ( alias , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ke : ĠKey Store Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġload ĠKey Ġ$ alias .", Ġke ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ns a : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġload ĠKey Ġ$ alias .", Ġn sa ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( uke : ĠUn recover able Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġload ĠKey Ġ$ alias .", Ġu ke ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Key ( alias : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Store . contains Alias ( alias )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . delete Entry ( alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ke : ĠKey Store Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġremove ĠKey Ġ$ alias .", Ġke ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Encryption ( alias : ĠString , Ġplain Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( AES _ MODE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . ENCRYPT _ MODE , ĠgetKey ( alias ), ĠG CM Parameter Spec ( GCM _ LENGTH , ĠFIX _ IV )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ToString ( cipher . do Final ( plain Text . toByteArray ( Charset . default Charset ())), ĠBase 6 4 . NO _ WRAP ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ns a : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġn sa ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n sp : ĠNoSuch Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġn sp ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ia pe : ĠInvalid Algorithm Parameter Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġi ape ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ike : ĠInvalid Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġi ke ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( b pe : ĠBad Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġb pe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ib se : ĠIllegal BlockSize Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġencrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ plain Text ", Ġib se ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo De cryption ( alias : ĠString , Ġencrypted Text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance ( AES _ MODE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit ( Cipher . DE CRYPT _ MODE , ĠgetKey ( alias ), ĠG CM Parameter Spec ( GCM _ LENGTH , ĠFIX _ IV )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString ( cipher . do Final ( Base 6 4 . decode ( encrypted Text . toByteArray ( Charset . default Charset ()), ĠBase 6 4 . NO _ WRAP )), ĠCharset . default Charset ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ns a : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġn sa ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n sp : ĠNoSuch Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġn sp ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ia pe : ĠInvalid Algorithm Parameter Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġi ape ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ike : ĠInvalid Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġi ke ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( b pe : ĠBad Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġb pe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ib se : ĠIllegal BlockSize Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEncryption Algorithm . AlgorithmException (" Failed Ġto Ġdecrypt Ġwith Ġalias Ġ$ alias . ĠText : Ġ$ encrypted Text ", Ġib se ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ }