package Ġcom . iv an ov sky . pass notes . data . crypto . key provider Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . iv an ov sky . pass notes . data . crypto . Data Cipher Constants Ċ import Ġcom . iv an ov sky . pass notes . data . crypto . Data Cipher Constants . KEY _ ALIAS Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . lang . Exception Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ Ċ class ĠFile SecretKey Provider ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠSecret Key Provider Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġkey Store : ĠKey Store ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget SecretKey ( is Create If Need : ĠBoolean ): ĠSecret Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey : ĠSecret Key ? ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠgetKey Store ( is Create If Need ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġkey Ġ= Ġobtain SecretKey From KeyStore ( key Store ) ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġnull Ġ&& Ġis Create If Need ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Key Ġ= Ġgenerate New SecretKey () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generated Key Ġ!= Ġnull Ġ&& Ġsave Key ( generated Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġgenerated Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey Store ( is Create If Need : ĠBoolean ): ĠKey Store ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store Ġ!= Ġnull ) Ġreturn Ġkey Store ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Store File Ġ= ĠgetKey Store File () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠKey Store . getInstance ( KeyStore . getDefault Type ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store File . exists () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ?. load ( FileInputStream ( key Store File ), ĠKEY _ STORE _ PASSWORD . toCharArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Create If Need Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ?. load ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey Store ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Key ( secret Key : ĠSecret Key ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= Ġthis . key Store ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . set Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . SecretKey Entry ( secret Key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . Password Protection ( KEY _ STORE _ PASSWORD . toCharArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( getKey Store File ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ STORE _ PASSWORD . toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" Saving Ġkey Ġstore , Ġsuccess : Ġ$ result ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain SecretKey From KeyStore ( key Store : ĠKey Store ): ĠSecret Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey : ĠSecret Key ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġkey Store . getEntry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . Password Protection ( KEY _ STORE _ PASSWORD . toCharArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġis ĠKey Store . SecretKey Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġentry . secret Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" Load Ġsecret Ġkey Ġfrom Ġkey Ġstore Ġwith Ġalgorithm : Ġ" Ġ+ Ġkey ?. algorithm ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate New SecretKey (): ĠSecret Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey : ĠSecret Key ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Generator Ġ= ĠKey Generator . getInstance ( Data Cipher Constants . KEY _ ALGORITHM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Generator ?. init ( Data Cipher Constants . KEY _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey Generator ?. generate Key () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d ( TAG , Ġ" Generate Ġnew Ġsecret Ġkey Ġwith Ġalgorithm : Ġ" Ġ+ Ġkey ?. algorithm ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey Store File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( context . files Dir , ĠKEY _ STORE _ FILE _ NAME ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠFile SecretKey Provider :: class . simple Name ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ STORE _ FILE _ NAME Ġ= Ġ" Pass notes " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ STORE _ PASSWORD Ġ= Ġ" set on ssa P " ĊĠĠĠ Ġ} Ċ }