package Ġcom . encrypt preference Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . util . Base 6 4 Ċ import Ġcom . google . crypto . t ink . A ead Ċ import Ġcom . google . crypto . t ink . Key set Handle Ċ import Ġcom . google . crypto . t ink . a ead . A ead Key Templates Ċ import Ġcom . google . crypto . t ink . config . T ink Config Ċ import Ġcom . google . crypto . t ink . integration . android . Android Key set Manager Ċ Ċ object ĠEn c Pref Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠEMPTY _ ASS OCI ATED _ DATA Ġ= ĠByteArray ( 0 ) ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ SUFFIX Ġ= Ġ"_ default Pref " ĊĠĠĠ Ġprivate Ġconst Ġval ĠEN C _ SUFFIX Ġ= Ġ"_ default Enc " ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ SUFFIX Ġ= Ġ"_ debug " ĊĠĠĠ Ġprivate Ġvar ĠKEY _ URI Ġ= Ġ" android - keystore ://" ĊĠĠĠ Ġprivate Ġvar Ġ_ m Default Pref : ĠSharedPreferences ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġa ead : ĠA ead ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Debug gable : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġclass ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Pref Name : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠmContext : ĠContext ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Use Default Pref Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Context ( mContext : ĠContext ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mContext Ġ= ĠmContext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġser Pref Name ( m Pref Name : ĠString ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m Pref Name Ġ= Ġm Pref Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġser Use Default Pref ( m Use Default Pref : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . m Use Default Pref Ġ= Ġm Use Default Pref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Debug gable ( isDebug gable : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn c Pref . isDebug gable Ġ= Ġis Debug gable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Or Generate Key Handle (): ĠKey set Handle ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAndroid Key set Manager . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Shared Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Encode ( mContext ?. packageName !!. toByteArray ( Charsets . US _ ASCII )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Encode ("${ mContext ?. packageName }$ ENC _ SUFFIX ". toByteArray ( Charsets . US _ ASCII )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Key Template ( A ead Key Templates . AES 2 5 6 _ GCM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Master Key Uri ( KEY _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. key set Handle ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠEn c Pref Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mContext Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Context Ġshould Ġnot Ġbe Ġnull , Ġplease Ġset Ġcontext ."); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Pref Name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pref Name Ġ= ĠmContext ?. packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Use Default Pref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pref Name Ġ= Ġ"${ m Pref Name }$ DEFAULT _ SUFFIX " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a ead Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ink Config . register () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ URI Ġ= Ġ"$ KEY _ URI ${ mContext ?. packageName }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa ead Ġ= Ġget Or Generate Key Handle ()?. get Primitive ( A ead :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmContext !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Pref Name !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEn c Pref ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Pref ( mContext : ĠContext , Ġm Pref Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ m Default Pref Ġ= ĠmContext . get SharedPreferences ( m Pref Name , ĠContext Wrapper . MODE _ PRIVATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbase 6 4 Encode ( input : ĠByteArray ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . encode ToString ( input , ĠBase 6 4 . DEFAULT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbase 6 4 Decode ( input : ĠString ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . decode ( input , ĠBase 6 4 . DEFAULT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencrypt Text ( text To Encrypt : ĠString ?) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcipher Text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ead ?. encrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext To Encrypt ?. toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY _ ASS OCI ATED _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( cipher Text Ġ== Ġnull ) Ġ-> Ġtext To Encrypt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbase 6 4 Encode ( cipher Text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt Text ( text To Decrypt : ĠString ?): ĠString ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplain Text Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ead ?. decrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Decode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext To Decrypt Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY _ ASS OCI ATED _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( plain Text Array Ġ== Ġnull ) Ġ-> Ġtext To Decrypt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠString ( plain Text Array , ĠChar sets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmy Pref : ĠSharedPreferences ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ m Default Pref Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ m Default Pref !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enc Pref Ġclass Ġnot Ġcorrectly Ġinstantiated . ĠPlease Ġcall ĠBuilder . set Context (). build () Ġin Ġthe ĠApplication Ġclass ĠonCreate ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetValue From Pref ( key : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( isDebug gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pref . getString ("$ key $ DEBUG _ SUFFIX ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pref . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Encode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . toByteArray ( Charsets . US _ ASCII ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetValue On Pref ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isDebug gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pref . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ key $ DEBUG _ SUFFIX ", Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Pref . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase 6 4 Encode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . toByteArray ( Charsets . US _ ASCII ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġencrypt Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString ( key : ĠString , ĠdefaultValue : ĠString Ġ= Ġ"") : ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetValue From Pref ( key ) Ġ?: ĠdefaultValue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput String ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Boolean ( key : ĠString , ĠdefaultValue : ĠBoolean Ġ= Ġfalse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue From Pref ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isNull OrEmpty ()) ĠdefaultValue Ġelse Ġvalue . to Boolean () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Boolean ( key : ĠString , Ġvalue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Long ( key : ĠString , ĠdefaultValue : ĠLong Ġ= Ġ 0 L ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue From Pref ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isNull OrEmpty ()) ĠdefaultValue Ġelse Ġvalue . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Long ( key : ĠString , Ġvalue : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Int ( key : ĠString , ĠdefaultValue : ĠInt Ġ= Ġ 0 ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue From Pref ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isNull OrEmpty ()) ĠdefaultValue Ġelse Ġvalue . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Int ( key : ĠString , Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Double ( key : ĠString , ĠdefaultValue : ĠDouble Ġ= Ġ 0 . 0 ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue From Pref ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isNull OrEmpty ()) ĠdefaultValue Ġelse Ġvalue . toDouble () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Double ( key : ĠString , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Float ( key : ĠString , ĠdefaultValue : ĠFloat Ġ= Ġ 0 . 0 f ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠgetValue From Pref ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isNull OrEmpty ()) ĠdefaultValue Ġelse Ġvalue . toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput Float ( key : ĠString , Ġvalue : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetValue On Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll (): ĠMutable Map < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( isDebug gable ) Ġmy Pref . all . filter Ġ{ Ġit . key . contains ( DEBUG _ SUFFIX ) Ġ} Ġelse Ġmy Pref . all . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . key . contains ( DEBUG _ SUFFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( isDebug gable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Map Ġ= Ġmutable Map Of < String , ĠAny ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Map [ String ( base 6 4 Decode ( key ) Ġ?: ĠEMPTY _ ASS OCI ATED _ DATA , ĠChar sets . UTF _ 8 )] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Text ( value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Map ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊ Ċ }