/****************************************************************************** Ċ Ġ* ĠCor ona - Warn - App ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠSAP ĠSE Ġand Ġall Ġother Ġcontributors Ġ/ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġcopyright Ġowners Ġlicense Ġ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 Ġde . r ki . cor on aw arn app . util . security Ċ Ċ import ĠKey Export Format . TE K Signature List Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroidx . security . crypto . Encrypted SharedPreferences Ċ import Ġandroidx . security . crypto . Master Keys Ċ import Ġde . r ki . cor on aw arn app . Build Config Ċ import Ġde . r ki . cor on aw arn app . Cor ona Warn Application Ċ import Ġde . r ki . cor on aw arn app . exception . C wa Security Exception Ċ import Ġjava . lang . Exception Ċ import Ġjava . lang . NullPointerException Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . Message Digest Ċ import Ġjava . security . Secure Random Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjava . security . Signature Ċ import Ġjava . security . cert . Certificate Ċ Ċ /** Ċ Ġ* ĠKey ĠStore Ġand ĠPassword ĠAccess Ċ Ġ*/ Ċ object ĠSecurity Helper Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠC WA _ APP _ SQL ITE _ DB _ PW Ġ= Ġ" C WA _ APP _ SQL ITE _ DB _ PW " ĊĠĠĠ Ġprivate Ġconst Ġval ĠAES _ KEY _ SIZE Ġ= Ġ 2 5 6 ĊĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ PRE F _ NAME Ġ= Ġ" shared _ preferences _ c wa " ĊĠĠĠ Ġprivate Ġval Ġkey Gen Parameter Spec Ġ= ĠMaster Keys . AES 2 5 6 _ GCM _ SPEC ĊĠĠĠ Ġprivate Ġval Ġmaster Key Alias Ġ= ĠMaster Keys . get OrCreate ( key Gen Parameter Spec ) ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠEX PORT _ SIGNATURE _ ALGORITHM Ġ= Ġ" SHA 2 5 6 with ECD SA " ĊĠĠĠ Ġprivate Ġconst Ġval ĠC WA _ EXPORT _ CER TIFICATE _ NAME _ NON _ PRO D Ġ= Ġ" c wa Ġnon - prod Ġcertificate " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠC WA _ EXPORT _ CER TIFICATE _ KEY _ STORE Ġ= Ġ" trusted - certs - c wa . b ks " ĊĠĠĠ Ġprivate Ġconst Ġval ĠAND ROID _ KEY _ STORE Ġ= Ġ" Android KeyStore " ĊĊĠĠĠ Ġprivate Ġval Ġandroid KeyStore : ĠKey Store Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠKey Store . getInstance ( ANDROID _ KEY _ STORE ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . load ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġglobal Encrypted SharedPreferences Instance : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Security Catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor ona Warn Application . get AppContext (). get Encrypted Shared Prefs ( SHARED _ PRE F _ NAME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe Ġprivate Ġencrypted Ġkey Ġstore ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠContext . get Encrypted Shared Prefs ( fileName : ĠString ) Ġ= ĠEn crypted SharedPreferences ĊĠĠĠĠĠĠĠ Ġ. create ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Key Alias , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Key Encryption Scheme . AES 2 5 6 _ SI V , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Value Encryption Scheme . AES 2 5 6 _ GCM ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe ĠMaster ĠKey Ġfrom Ġthe ĠAndroid ĠKey Store Ġto Ġuse Ġin ĠSQL Cipher ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget DB Password () Ġ= Ġget Or Generate DB SecretKey () ĊĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠ Ġ. toCharArray () ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Generate DB SecretKey (): ĠSecret Key Ġ= ĊĠĠĠĠĠĠĠ Ġandroid KeyStore . getKey ( C WA _ APP _ SQL ITE _ DB _ PW , Ġnull ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk g : ĠKey Generator Ġ= ĠKey Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ AES , ĠAND ROID _ KEY _ STORE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec : ĠKey Gen Parameter Spec Ġ= ĠKey Gen Parameter Spec . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC WA _ APP _ SQL ITE _ DB _ PW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġand ĠKey Properties . P URPOSE _ DE CRYPT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Size ( AES _ KEY _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Block Modes ( Key Properties . BLOCK _ MODE _ CBC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ PKCS 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Random ized Encryption Required ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setUser Authentication Required ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk g . init ( spec , ĠSecure Random ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk g . generate Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġthis Ġas ĠSecret Key ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhash 2 5 6 ( input : ĠString ): ĠString Ġ= ĠMessage Digest ĊĠĠĠĠĠĠĠ Ġ. getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠ Ġ. digest ( input . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġ. fold ("", Ġ{ Ġstr , Ġit Ġ-> Ġstr Ġ+ Ġ"% 0 2 x ". format ( it ) Ġ}) ĊĊĠĠĠ Ġfun Ġexport File IsValid ( export : ĠByteArray ?, Ġsig : ĠByteArray ?) Ġ= Ġwith Security Catch Ġ{ ĊĠĠĠĠĠĠĠ ĠSignature . getInstance ( EXPORT _ SIGNATURE _ ALGORITHM ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Verify ( trusted Cert For Signature ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( export ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( TE K Signature List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parseFrom ( sig ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. signatures List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. signature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġc wa KeyStore : ĠKey Store Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeystore File Ġ= ĠCor ona Warn Application . get AppContext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assets . open ( C WA _ EXPORT _ CER TIFICATE _ KEY _ STORE ) ĊĠĠĠĠĠĠĠ Ġval Ġkeystore Ġ= ĠKey Store . getInstance ( KeyStore . getDefault Type ()) ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Pw Ġ= ĠBuild Config . TR UST ED _ CER TS _ EXPORT _ KEY STORE _ PW ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġkey Store Pw . toCharArray () ĊĠĠĠĠĠĠĠ Ġif Ġ( password . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" TR UST ED _ CER TS _ EXPORT _ KEY STORE _ PW Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġkeystore . load ( keystore File , Ġpassword ) ĊĠĠĠĠĠĠĠ Ġkeystore ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtrusted Cert For Signature : ĠCertificate Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalias Ġ= ĠC WA _ EXPORT _ CER TIFICATE _ NAME _ NON _ PRO D ĊĠĠĠĠĠĠĠ Ġc wa KeyStore . get Certificate ( alias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġwith Security Catch ( do In Catch : Ġ() Ġ-> ĠT ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdo In Catch . invoke () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠC wa Security Exception ( e ) ĊĠĠĠ Ġ} Ċ } Ċ