package Ġex po . modules . secure store Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . bio metric . Bio metric Manager Ċ import Ġandroidx . bio metric . Bio metric Prompt Ċ import Ġandroidx . bio metric . Bio metric Prompt . Prompt Info Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġex po . modules . core . Module Registry Ċ import Ġex po . modules . core . Promise Ċ import Ġex po . modules . core . arguments . Readable Arguments Ċ import Ġex po . modules . core . interfaces . Activity Provider Ċ import Ġex po . modules . core . interfaces . services . UI Manager Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġjava . security . General Security Exception Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . spec . GCM Parameter Spec Ċ Ċ class ĠAuthentication Helper ( ĊĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠ Ġprivate Ġval Ġmodule Registry : ĠModule Registry Ċ ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠAUTH ENT ICATION _ PROMPT _ PROPERTY Ġ= Ġ" authentication Prompt " ĊĠĠĠ Ġconst Ġval ĠREQUIRE _ AUTHENT ICATION _ PROPERTY Ġ= Ġ" require Authentication " ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġui Manager Ġ= Ġmodule Registry . getModule ( UI Manager :: class . java ) ĊĠ Ġprivate Ġvar Ġis Auth entic ating Ġ= Ġfalse ĊĊĠ Ġ// ĠAuthentication Ġcallback Ġdec ides Ġwhether Ġthe Ġoperation Ġrequires Ġauthentication Ġ( either Ġby ĊĠ Ġ// Ġrequires Authentication Ġargument , Ġor Ġfrom Ġoptions ). ĠWhen Ġitem Ġneeds Ġto Ġbe Ġencrypted / de crypted Ġan ĊĠ Ġ// Ġinstance Ġof ĠAuthentication Ġcallback Ġis Ġpassed Ġto Ġthe Ġrelevant Ġmethod . ĊĠ Ġ// ĠThe Ġmethod Ġpre pa res Ġthe Ġcipher Ġand Ġstarts Ġauthentication Ġcallback Ġwith Ġit . ĠIf Ġthe Ġoperation ĊĠ Ġ// Ġrequires Ġauthentication , Ġthe Ġbio metric Ġprompt Ġis Ġshown , Ġotherwise Ġthe Ġencryption Ġcallback ĊĠ Ġ// Ġis Ġcalled . ĊĠ Ġ// ĠWhen Ġthe Ġuser Ġis Ġauthenticated Ġthe Ġencryption Ġcallback Ġis Ġran Ġwith Ġthe Ġun locked Ġcipher Ġand Ġdoes ĊĠ Ġ// Ġencryption / de cryption . ĠFinally Ġthe ĠPost Encryption Callback Ġmay Ġbe Ġran Ġwith Ġthe Ġobject Ġreturned ĊĠ Ġ// Ġby Ġprevious Ġcallback Ġ( to Ġsave Ġencrypted Ġdata Ġto ĠSharedPreferences ). ĊĊĠ Ġval Ġdefault Callback : ĠAuthentication Callback Ġ= Ġobject Ġ: ĠAuthentication Callback Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck Authentication ( ĊĠĠĠĠĠ Ġpromise : ĠPromise , ĊĠĠĠĠĠ Ġcipher : ĠCipher , ĊĠĠĠĠĠ Ġg cm Parameter Spec : ĠG CM Parameter Spec , ĊĠĠĠĠĠ Ġoptions : ĠRead able Arguments , ĊĠĠĠĠĠ Ġencryption Callback : ĠEncryption Callback , ĊĠĠĠĠĠ Ġpost Encryption Callback : ĠPost Encryption Callback ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrequires Authentication Ġ= Ġoptions . getBoolean ( REQUIRE _ AUTHENT ICATION _ PROPERTY , Ġfalse ) ĊĊĠĠĠĠĠ Ġcheck Authentication ( ĊĠĠĠĠĠĠĠ Ġpromise , Ġrequires Authentication , Ġcipher , Ġg cm Parameter Spec , Ġoptions , Ġencryption Callback , Ġpost Encryption Callback ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Authentication ( ĊĠĠĠĠĠ Ġpromise : ĠPromise , ĊĠĠĠĠĠ Ġrequires Authentication : ĠBoolean , ĊĠĠĠĠĠ Ġcipher : ĠCipher , ĊĠĠĠĠĠ Ġg cm Parameter Spec : ĠG CM Parameter Spec , ĊĠĠĠĠĠ Ġoptions : ĠRead able Arguments , ĊĠĠĠĠĠ Ġencryption Callback : ĠEncryption Callback , ĊĠĠĠĠĠ Ġpost Encryption Callback : ĠPost Encryption Callback ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( requires Authentication ) Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Authentication Prompt ( promise , Ġoptions , Ġencryption Callback , Ġcipher , Ġg cm Parameter Spec , Ġpost Encryption Callback ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Encryption Callback ( promise , Ġencryption Callback , Ġcipher , Ġg cm Parameter Spec , Ġpost Encryption Callback ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġhandle Encryption Callback ( ĊĠĠĠ Ġpromise : ĠPromise , ĊĠĠĠ Ġencryption Callback : ĠEncryption Callback , ĊĠĠĠ Ġcipher : ĠCipher , ĊĠĠĠ Ġg cm Parameter Spec : ĠG CM Parameter Spec , ĊĠĠĠ Ġpost Encryption Callback : ĠPost Encryption Callback ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġencryption Callback . run ( promise , Ġcipher , Ġg cm Parameter Spec , Ġpost Encryption Callback ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠGeneral Security Exception ) Ġ{ ĊĠĠĠĠĠ ĠLog . w ( Secure Store Module . TAG , Ġexception ) ĊĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ ENCRYPT _ FAILURE ", ĊĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġencrypt / decrypt Ġthe Ġvalue Ġfor ĠSecure Store ", ĊĠĠĠĠĠĠĠ Ġexception ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠ ĠLog . w ( Secure Store Module . TAG , Ġexception ) ĊĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ ENCODE _ FAILURE ", ĊĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġcreate Ġan Ġencrypted ĠJSON Ġitem Ġfor ĠSecure Store ", ĊĠĠĠĠĠĠĠ Ġexception ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġopen Authentication Prompt ( ĊĠĠĠ Ġpromise : ĠPromise , ĊĠĠĠ Ġoptions : ĠRead able Arguments , ĊĠĠĠ Ġencryption Callback : ĠEncryption Callback , ĊĠĠĠ Ġcipher : ĠCipher , ĊĠĠĠ Ġg cm Parameter Spec : ĠG CM Parameter Spec , ĊĠĠĠ Ġpost Encryption Callback : ĠPost Encryption Callback ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ NOT _ AVAILABLE ", ĊĠĠĠĠĠĠĠ Ġ" Bio metric Ġauthentication Ġrequires ĠAndroid ĠAPI Ġ 2 3 " ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( is Auth entic ating ) Ġ{ ĊĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ IN _ PROGRESS ", ĊĠĠĠĠĠĠĠ Ġ" Authentication Ġis Ġalready Ġin Ġprogress " ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbio metric Manager Ġ= ĠBio metric Manager . from ( context ) ĊĠĠĠ Ġwhen Ġ( bio metric Manager . can Authenticate ( Bio metric Manager . Auth entic ators . BIO METRIC _ STRONG )) Ġ{ ĊĠĠĠĠĠ ĠBio metric Manager . BIO METRIC _ ERROR _ HW _ UN AVAILABLE , ĠBio metric Manager . BIO METRIC _ ERROR _ NO _ HARD WARE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ NOT _ AVAILABLE ", ĊĠĠĠĠĠĠĠĠĠ Ġ" No Ġhardware Ġavailable Ġfor Ġbio metric Ġauthentication . ĠUse Ġex po - local - authentication Ġto Ġcheck Ġif Ġthe Ġdevice Ġsupports Ġit ." ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠBio metric Manager . BIO METRIC _ ERROR _ NONE _ EN ROL LED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ NOT _ CONFIGURE D ", ĊĠĠĠĠĠĠĠĠĠ Ġ" No Ġbio metrics Ġare Ġcurrently Ġen rolled " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtitle Ġ= Ġoptions . getString ( AUTHENT ICATION _ PROMPT _ PROPERTY , Ġ" Ġ") ĊĊĠĠĠ Ġval Ġprompt Info Ġ= ĠPrompt Info . Builder () ĊĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠ Ġ. set Negative ButtonText ( context . getString ( android . R . string . cancel )) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġfragment Activity Ġ= ĠgetCurrent Activity () Ġas ĠFragment Activity ? ĊĠĠĠ Ġif Ġ( fragment Activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ APP _ BACK GRO UN DED ", ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġdisplay Ġbio metric Ġprompt Ġwhen Ġthe Ġapp Ġis Ġnot Ġin Ġthe Ġforeground " ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġui Manager . run On Ui Queue Thread ( ĊĠĠĠĠĠ ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġis Auth entic ating Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ ĠBio metric Prompt ( ĊĠĠĠĠĠĠĠĠĠ Ġfragment Activity , ĊĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( context ), ĊĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBio metric Prompt . Authentication Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Succeeded ( result : ĠBio metric Prompt . Authentication Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Succeeded ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Auth entic ating Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= Ġresult . crypto Object !!. cipher !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Encryption Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcipher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg cm Parameter Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpromise , Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġresult Ġas ĠJSONObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . put ( REQUIRE _ AUTHENT ICATION _ PROPERTY , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Encryption Callback ?. run ( promise , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Error ( errorCode : ĠInt , Ġerr String : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Error ( errorCode , Ġerr String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Auth entic ating Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( errorCode Ġ== ĠBio metric Prompt . ERROR _ USER _ C ANCE LED Ġ|| ĠerrorCode Ġ== ĠBio metric Prompt . ERROR _ NEGATIVE _ BUTTON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ CANCEL LED ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User Ġcanceled Ġthe Ġauthentication " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ERR _ SECURE STORE _ AUTH _ FAILURE ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġauthenticate Ġthe Ġuser " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ). authenticate ( prompt Info , ĠBio metric Prompt . Crypto Object ( cipher )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠgetCurrent Activity (): ĠActivity ? Ġ{ ĊĠĠĠ Ġval Ġactivity Provider : ĠActivity Provider Ġ= Ġmodule Registry . getModule ( Activity Provider :: class . java ) ĊĠĠĠ Ġreturn Ġactivity Provider . current Activity ĊĠ Ġ} Ċ } Ċ