package Ġar . com . wo lox . android . cookbook . fingerprint . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . util . Log Ċ import Ġcom . google . gson . Gson Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security . KeyStore Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . Key Generator Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec . GCM Parameter Spec Ċ Ċ /** Ċ Ġ* ĠHandles Ġencryption Ġand Ġde cryption Ċ Ġ*/ Ċ interface ĠCrypto graphy Manager Ġ{ ĊĊĠĠĠ Ġfun Ġget Initialized Cipher For Encryption ( key Name : ĠString ): ĠCipher ĊĊĠĠĠ Ġfun Ġget Initialized Cipher For De cryption ( key Name : ĠString , Ġinitialization Vector : ĠByteArray ): ĠCipher ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠCipher Ġcreated Ġwith Ġ[ get Initialized Cipher For Encryption ] Ġis Ġused Ġhere ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencrypt Data ( plaintext : ĠString , Ġcipher : ĠCipher ): ĠC iph ertext Wrapper ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠCipher Ġcreated Ġwith Ġ[ get Initialized Cipher For De cryption ] Ġis Ġused Ġhere ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecrypt Data ( ciphertext : ĠByteArray , Ġcipher : ĠCipher ): ĠString ĊĊĠĠĠ Ġfun Ġpersist C iph ertext Wrapper To Shared Prefs ( ĊĠĠĠĠĠĠĠ Ġciphertext Wrapper : ĠC iph ertext Wrapper , ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠ Ġmode : ĠInt , ĊĠĠĠĠĠĠĠ Ġpref Key : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun ĠgetC iph ertext Wrapper From Shared Prefs ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠ Ġmode : ĠInt , ĊĠĠĠĠĠĠĠ Ġpref Key : ĠString ĊĠĠĠ Ġ): ĠC iph ertext Wrapper ? Ċ } Ċ Ċ fun ĠCrypto graphy Manager (): ĠCrypto graphy Manager Ġ= ĠCrypto graphy ManagerImpl () Ċ Ċ /** Ċ Ġ* ĠTo Ġget Ġan Ġinstance Ġof Ġthis Ġprivate ĠCrypto graphy ManagerImpl Ġclass , Ġuse Ġthe Ġtop - level Ġfunction Ċ Ġ* Ġfun ĠCrypto graphy Manager (): ĠCrypto graphy Manager Ġ= ĠCrypto graphy ManagerImpl () Ċ Ġ*/ Ċ private Ġclass ĠCrypto graphy ManagerImpl Ġ: ĠCrypto graphy Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠKEY _ SIZE Ġ= Ġ 2 5 6 ĊĠĠĠ Ġprivate Ġval ĠAND ROID _ KEY STORE Ġ= Ġ" Android KeyStore " ĊĠĠĠ Ġprivate Ġval ĠEN CRYPT ION _ BLOCK _ MODE Ġ= ĠKey Properties . BLOCK _ MODE _ GCM ĊĠĠĠ Ġprivate Ġval ĠEN CRYPT ION _ P ADDING Ġ= ĠKey Properties . ENCRYPT ION _ P ADDING _ NONE ĊĠĠĠ Ġprivate Ġval ĠEN CRYPT ION _ ALGORITHM Ġ= ĠKey Properties . KEY _ ALGORITHM _ AES ĊĊĠĠĠ Ġoverride Ġfun Ġget Initialized Cipher For Encryption ( key Name : ĠString ): ĠCipher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġget OrCreate SecretKey ( key Name ) ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . ENCRYPT _ MODE , Ġsecret Key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcipher ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Initialized Cipher For De cryption ( ĊĠĠĠĠĠĠĠ Ġkey Name : ĠString , ĊĠĠĠĠĠĠĠ Ġinitialization Vector : ĠByteArray ĊĠĠĠ Ġ): ĠCipher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġget Cipher () ĊĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġget OrCreate SecretKey ( key Name ) ĊĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġsecret Key , ĠG CM Parameter Spec ( 1 2 8 , Ġinitialization Vector )) ĊĠĠĠĠĠĠĠ Ġreturn Ġcipher ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġencrypt Data ( plaintext : ĠString , Ġcipher : ĠCipher ): ĠC iph ertext Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġciphertext Ġ= Ġcipher . do Final ( plaintext . toByteArray ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠ Ġreturn ĠC iph ertext Wrapper ( ciphertext , Ġcipher . iv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecrypt Data ( ciphertext : ĠByteArray , Ġcipher : ĠCipher ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplaintext Ġ= Ġcipher . do Final ( ciphertext ) ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( plaintext , ĠCharset . forName (" UTF - 8 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cipher (): ĠCipher Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransformation Ġ= Ġ"$ ENCRYPT ION _ ALGORITHM /$ ENCRYPT ION _ BLOCK _ MODE /$ ENCRYPT ION _ P ADDING " ĊĠĠĠĠĠĠĠ Ġreturn ĠCipher . getInstance ( transformation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget OrCreate SecretKey ( key Name : ĠString ): ĠSecret Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf ĠSecret key Ġwas Ġpreviously Ġcreated Ġfor Ġthat Ġkey Name , Ġthen Ġgrab Ġand Ġreturn Ġit . ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Ġ= ĠKey Store . getInstance ( ANDROID _ KEY STORE ) ĊĠĠĠĠĠĠĠ Ġkey Store . load ( null ) Ġ// ĠKe yst ore Ġmust Ġbe Ġloaded Ġbefore Ġit Ġcan Ġbe Ġaccessed ĊĠĠĠĠĠĠĠ Ġkey Store . getKey ( key Name , Ġnull )?. let Ġ{ Ġreturn Ġit Ġas ĠSecret Key Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġyou Ġreach Ġhere , Ġthen Ġa Ġnew ĠSecret Key Ġmust Ġbe Ġgenerated Ġfor Ġthat Ġkey Name ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Builder Ġ= ĠKey Gen Parameter Spec . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams Builder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Block Modes ( ENCRYPT ION _ BLOCK _ MODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Encryption P add ings ( ENCRYPT ION _ P ADDING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Key Size ( KEY _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUser Authentication Required ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Gen Params Ġ= Ġparams Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Generator Ġ= ĠKey Generator . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ AES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND ROID _ KEY STORE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Generator . init ( key Gen Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Generator . generate Key () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Bio metry Ġerror ", Ġ" Invalid ĠAPI Ġlevel ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpersist C iph ertext Wrapper To Shared Prefs ( ĊĠĠĠĠĠĠĠ Ġciphertext Wrapper : ĠC iph ertext Wrapper , ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠ Ġmode : ĠInt , ĊĠĠĠĠĠĠĠ Ġpref Key : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠGson (). toJson ( ciphertext Wrapper ) ĊĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( filename , Ġmode ). edit (). putString ( pref Key , Ġjson ). apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetC iph ertext Wrapper From Shared Prefs ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠ Ġmode : ĠInt , ĊĠĠĠĠĠĠĠ Ġpref Key : ĠString ĊĠĠĠ Ġ): ĠC iph ertext Wrapper ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġcontext . get SharedPreferences ( filename , Ġmode ). getString ( pref Key , Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( json , ĠC iph ertext Wrapper :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠC iph ertext Wrapper ( val Ġciphertext : ĠByteArray , Ġval Ġinitialization Vector : ĠByteArray ) Ċ