/* Ċ * Ġ ĠCopyright Ġ 2 0 2 1 ĠMat thew ĠN el son Ċ * Ċ * Ġ ĠLicensed Ġ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 Ġio . mat the wn el son . feature _ authentication _ core Ċ Ċ import Ġapp . cash . exhaustive . Ex haustive Ċ import Ġio . mat the wn el son . concept _ authentication . coordinator . Authentication Request Ċ import Ġio . mat the wn el son . concept _ authentication . coordinator . Authentication Response Ċ import Ġio . mat the wn el son . concept _ authentication . state . Authentication State Ċ import Ġio . mat the wn el son . concept _ authentication _ core . Authentication Manager Ċ import Ġio . mat the wn el son . concept _ authentication _ core . model . User Input Ċ import Ġio . mat the wn el son . feature _ authentication _ core . data . Authentication Core Storage Ċ import Ġio . mat the wn el son . feature _ authentication _ core . model . Authenticate Flow Response Ċ import Ġio . mat the wn el son . concept _ coroutines . Coroutine Dispatch ers Ċ import Ġio . mat the wn el son . concept _ encryption _ key . Encryption Key Ċ import Ġio . mat the wn el son . concept _ encryption _ key . Encryption Key Exception Ċ import Ġio . mat the wn el son . concept _ encryption _ key . Encryption Key Handler Ċ import Ġio . mat the wn el son . feature _ authentication _ core . components . Authentication Manager Initializer Ċ import Ġio . mat the wn el son . feature _ authentication _ core . components . Authentication Processor Ċ import Ġio . mat the wn el son . feature _ authentication _ core . model . User Input Writer Ċ import Ġio . mat the wn el son . crypto _ common . annotations . Raw Password Access Ċ import Ġio . mat the wn el son . crypto _ common . clazz es . Hash Iterations Ċ import Ġio . mat the wn el son . crypto _ common . clazz es . Password Ċ import Ġio . mat the wn el son . crypto _ common . clazz es . clear Ċ import Ġio . mat the wn el son . crypto _ common . clazz es . compare Ċ import Ġkotlinx . coroutines . flow .* Ċ Ċ /** Ċ Ġ* ĠExtend Ġthis Ġclass Ġand Ġimplement Ċ Ġ* Ġ*/ Ċ abstract Ġclass ĠAuthentication Core Manager ( ĊĠĠĠ Ġdispatch ers : ĠCor outine Dispatch ers , ĊĠĠĠ Ġencryption Key Hash Iterations : ĠHash Iterations , ĊĠĠĠ Ġencryption Key Handler : ĠEncryption Key Handler , ĊĠĠĠ Ġauthentication Core Storage : ĠAuthentication Core Storage , ĊĠĠĠ Ġauthentication Manager Initializer : ĠAuthentication Manager Initializer Ċ ): ĠAuthentication Manager < ĊĠĠĠĠĠĠĠ ĠAuth enticate Flow Response , ĊĠĠĠĠĠĠĠ ĠAuth enticate Flow Response . Password Confirmed For Reset , ĊĠĠĠĠĠĠĠ ĠAuth enticate Flow Response . Confirm Input To Set For First Time ĊĠĠĠĠĠĠĠ Ġ> () Ċ { ĊĊĠĠĠ Ġ// //////////////////////// / ĊĠĠĠ Ġ/// ĠAuthentication State Ġ/// ĊĠĠĠ Ġ// //////////////////////// / ĊĠĠĠ Ġprivate Ġval Ġ_ authentication State Flow : ĠMutable State Flow < Authentication State > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable State Flow ( Authentication State . Required . Initial Log In ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġauthentication State Flow : ĠState Flow < Authentication State > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ authentication State Flow . as State Flow () ĊĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġinternal Ġfun Ġupdate Authentication State ( ĊĠĠĠĠĠĠĠ Ġstate : ĠAuthentication State , ĊĠĠĠĠĠĠĠ Ġencryption Key : ĠEncryption Key ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Ex haustive ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuthentication State . Not Required Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key ?. let Ġ{ Ġnn Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Encryption Key ( nn Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ authentication State Flow . value Ġ== ĠAuthentication State . Required . Initial Log In ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Initial Login Success ( nn Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ĠEncryption Key Ġis Ġrequired Ġwhen Ġsetting ĠAuthentication State Ġto ĠNot Required Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAuthentication State . Required Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Encryption Key ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ authentication State Flow . value Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġ[ Authentication State ] Ġtransitions Ġfrom Ġ[ Authentication State . Required . Initial Log In ] ĊĠĠĠĠ Ġ* Ġto Ġ[ Authentication State . Not Required ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Initial Login Success ( encryption Key : ĠEncryption Key ) Ġ{} ĊĊĠĠĠ Ġprotected Ġfun Ġset Authentication State Required ( state : ĠAuthentication State . Required ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Authentication State ( state , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġ/// ĠInitialization Ġ/// ĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġmin User Input Length Ġ= Ġauthentication Manager Initializer . minimum User Input Length ĊĠĠĠĠĠĠĠ Ġmax User Input Length Ġ= Ġauthentication Manager Initializer . maximum User Input Length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin User Input Length : ĠInt Ġ= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠĠĠĠĠ Ġvar Ġmax User Input Length : ĠInt Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġ/// ĠAuthentication Ġ/// ĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġ@ Suppress (" Remove Explicit Type Arguments ") ĊĠĠĠ Ġprivate Ġval Ġauthentication Processor : ĠAuthentication Processor Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠAuthentication Processor . instantiate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch ers , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key Hash Iterations , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Core Storage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Manager Initializer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġis An Encryption Key Set (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġauthentication Processor . is An Encryption Key Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget New User Input (): ĠUser Input Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUser Input Writer . instantiate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Opt In ( Raw Password Access :: class ) ĊĠĠĠ Ġoverride Ġfun Ġauthenticate ( ĊĠĠĠĠĠĠĠ ĠprivateKey : ĠPassword , ĊĠĠĠĠĠĠĠ Ġrequest : ĠAuthentication Request . Log In ĊĠĠĠ Ġ): ĠFlow < Authentication Response > Ġ= ĊĠĠĠĠĠĠĠ Ġget Encryption Key ()?. let Ġ{ Ġalready Set Key Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! already Set Key . privateKey . compare ( privateKey )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Response . Failure ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authentication State Flow . value Ġis ĠAuthentication State . Not Required ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflow Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuthentication Response . Success . Key ( request , Ġalready Set Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Processor . authenticate ( privateKey , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġauthentication Processor . authenticate ( privateKey , Ġrequest ) ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġauthenticate ( ĊĠĠĠĠĠĠĠ Ġuser Input : ĠUser Input , ĊĠĠĠĠĠĠĠ Ġrequests : ĠList < Authentication Request > ĊĠĠĠ Ġ): ĠFlow < Authenticate Flow Response > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Request List Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( user Input Ġas ĠUser Input Writer ). size () Ġ< Ġmin User Input Length Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Input . size () Ġ> Ġmax User Input Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcreate Ġnew Ġerror Ġto Ġsubmit Ġback Ġinstead Ġof ĠInvalid Password Entry Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Authenticate . Invalid Password Entry Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Processor . authenticate ( user Input Ġas ĠUser Input Writer , Ġrequests ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġreset Password ( ĊĠĠĠĠĠĠĠ Ġreset Password Response : ĠAuth enticate Flow Response . Password Confirmed For Reset , ĊĠĠĠĠĠĠĠ Ġuser Input Confirmation : ĠUser Input , ĊĠĠĠĠĠĠĠ Ġrequests : ĠList < Authentication Request > ĊĠĠĠ Ġ): ĠFlow < Authenticate Flow Response > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Request List Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . getNew Password ToBe Set () Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . New Password Entry Was Null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . getNew Password ToBe Set ()?. size () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< Ġmin User Input Length Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . getNew Password ToBe Set ()?. size () Ġ?: Ġmax User Input Length Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ> Ġmax User Input Length Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . Invalid New Password Entry Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( user Input Confirmation Ġas ĠUser Input Writer ). size () Ġ< Ġmin User Input Length Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Input Confirmation . size () Ġ> Ġmax User Input Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcreate Ġnew Ġerror Ġto Ġsubmit Ġback Ġinstead Ġof ĠInvalid Password Entry Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . Invalid Confirmed Password Entry Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . original Validated User Input HasBeen Cle ared Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . Current Password Entry Was Cle ared ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . new Password HasBeen Cle ared Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . New Password Entry Was Cle ared ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Password Response . compare New Password With Confirmation Input ( user Input Confirmation ) Ġ!= Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Reset Password . New Pin DoesNot Match Confirmed Password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Processor . reset Password ( reset Password Response , Ġrequests ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġset Password First Time ( ĊĠĠĠĠĠĠĠ Ġset Password First Time Response : ĠAuth enticate Flow Response . Confirm Input To Set For First Time , ĊĠĠĠĠĠĠĠ Ġuser Input Confirmation : ĠUser Input , ĊĠĠĠĠĠĠĠ Ġrequests : ĠList < Authentication Request > ĊĠĠĠ Ġ): ĠFlow < Authenticate Flow Response > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequests . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Request List Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( user Input Confirmation Ġas ĠUser Input Writer ). size () Ġ< Ġmin User Input Length Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Input Confirmation . size () Ġ> Ġmax User Input Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcreate Ġnew Ġerror Ġto Ġsubmit Ġback Ġinstead Ġof ĠInvalid Password Entry Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Set Password First Time . Invalid New Password Entry Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! set Password First Time Response . compare Initial Input With Confirmed Input ( user Input Confirmation ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Set Password First Time . New Password DoesNot Match Confirmed Password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Password First Time Response . initial User Input HasBeen Cle ared Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Authenticate Flow Response . Error . Set Password First Time . New Password Entry Was Cle ared ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Processor . set Password First Time ( set Password First Time Response , Ġrequests ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġ/// ĠEncryption ĠKey Ġ/// ĊĠĠĠ Ġ// //////////////// //// ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġencryption Key : ĠEncryption Key ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġencryption Key Lock Ġ= ĠObject () ĊĊĠĠĠ Ġfun Ġget Encryption Key (): ĠEncryption Key ? Ġ= ĊĠĠĠĠĠĠĠ Ġsynchronized ( encryption Key Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġinternal Ġfun Ġget Encryption Key Copy (): ĠEncryption Key ? Ġ= ĊĠĠĠĠĠĠĠ Ġsynchronized ( encryption Key Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key ?. let Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Opt In ( Raw Password Access :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Processor . encryption Key Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. store Copy Of Encryption Key ( key . privateKey . value , Ġkey . publicKey . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠEncryption Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Encryption Key ( encryption Key : ĠEncryption Key ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( encryption Key Lock ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclear Ġkey Ġif Ġpassed Ġvalue Ġis Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encryption Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key ?. privateKey ?. clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key ?. publicKey ?. clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key ?. let Ġ{ Ġcurrent Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġcurrent Ġkey Ġis Ġnot Ġnull , Ġcompare Ġwith Ġthe Ġpassed Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! current Key . privateKey . compare ( encryption Key . privateKey ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! current Key . publicKey . compare ( encryption Key . publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġprovided Ġkey Ġwas Ġnot Ġthe Ġsame , Ġclear Ġthe Ġcurrent Ġkey Ġand Ġset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Key . privateKey . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Key . publicKey . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key Ġ= Ġencryption Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġdo Ġnothing ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġlet Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġno Ġencryption Ġkey Ġis Ġset , Ġset Ġit Ġto Ġthe Ġprovided Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . encryption Key Ġ= Ġencryption Key ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ