/* Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠP ier re ĠTh omain Ċ Ġ* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġdev . pth omain . android . m umbo . t ink Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . security . crypto . Master Keys Ċ import Ġcom . google . crypto . t ink . A ead Ċ import Ġcom . google . crypto . t ink . a ead . A ead Factory Ċ 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 Ċ import Ġcom . google . crypto . t ink . sub tle . Base 6 4 Ċ import Ġdev . pth omain . android . m umbo . base . Encryption Manager Ċ import Ġdev . pth omain . android . m umbo . base . Encryption Manager . Key Policy . J ET PACK Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . security . General Security Exception Ċ import Ġkotlin . text . Charsets . UTF _ 8 Ċ Ċ @ Requires Api ( 2 3 ) Ċ internal Ġclass ĠT ink Encryption Manager ( context : ĠContext ) Ġ: ĠEncryption Manager Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ PRE FS _ FILE _ NAME Ġ= Ġ" m umbo _ t ink _ shared _ prefs " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVALUE _ KEY SET _ ALIAS Ġ= Ġ"__ m umbo _ t ink _ value _ key set __ " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY STORE _ PATH _ URI Ġ= Ġ" android - keystore ://" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTEGER _ SIZE Ġ= Ġ 3 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBYTE _ SIZE Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTEGER _ BYTES Ġ= ĠINTEGER _ SIZE Ġ/ ĠBYTE _ SIZE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġa ead : ĠA ead ? ĊĠĠĠ Ġoverride Ġval Ġis Encryption Available : ĠBoolean ĊĠĠĠ Ġoverride Ġval Ġkey Policy Ġ= ĠJ ET PACK ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Available Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT ink Config . register () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġa ead : ĠA ead ? ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Gen Parameter Spec Ġ= ĠMaster Keys . AES 2 5 6 _ GCM _ SPEC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaster Key Alias Ġ= ĠMaster Keys . get OrCreate ( key Gen Parameter Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa ead Key set Handle Ġ= ĠAndroid Key set Manager . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Key Template ( A ead Key Templates . AES 2 5 6 _ GCM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Shared Pref ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVALUE _ KEY SET _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSHARE D _ PRE FS _ FILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Master Key Uri ( KEY STORE _ PATH _ URI Ġ+ Ġmaster Key Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). key set Handle ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa ead Ġ= ĠA ead Factory . get Primitive ( a ead Key set Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa ead Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa ead Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . a ead Ġ= Ġa ead ĊĠĠĠĠĠĠĠ Ġis Encryption Available Ġ= Ġa ead Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġencrypt ( to Encrypt : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Encryption Available Ġ&& Ġto Encrypt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . encode ( encrypt Bytes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Encrypt . toByteArray ( UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġencrypt Bytes ( to Encrypt : ĠByteArray ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Encryption Available Ġ&& Ġto Encrypt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Byte Length Ġ= Ġto Encrypt . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTEGER _ BYTES Ġ+ Ġstring Byte Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put Int ( string Byte Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . put ( to Encrypt ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa ead ?. encrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag . toByteArray ( UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġdecrypt ( to Decrypt : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Encryption Available Ġ&& Ġto Decrypt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Text Ġ= ĠBase 6 4 . decode ( to Decrypt , ĠBase 6 4 . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Bytes To ByteBuffer ( cipher Text , Ġdata Tag ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUTF _ 8 . decode ( it ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠGeneral Security Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Could Ġnot Ġdecrypt Ġvalue . Ġ" Ġ+ Ġex . message , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecrypt Bytes ( to Decrypt : ĠByteArray ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Encryption Available Ġ&& Ġto Decrypt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt Bytes To ByteBuffer ( to Decrypt , Ġdata Tag )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArray ( it . capacity ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġdecrypt Bytes To ByteBuffer ( to Decrypt : ĠByteArray ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Tag : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Encryption Available Ġ&& Ġto Decrypt Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġa ead ?. decrypt ( to Decrypt , Ġdata Tag . toByteArray ( UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . wrap ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Length Ġ= Ġbuffer . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Slice Ġ= Ġbuffer . slice () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . limit ( string Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Slice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull Ċ Ċ }