package Ġorg . hs bp . andro sphinx Ċ Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ import Ġorg . junit . Assert .* Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . lang . Number FormatException Ċ import Ġjava . net . Server Socket Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠInstrument ed Ġtest , Ġwhich Ġwill Ġexecute Ġon Ġan ĠAndroid Ġdevice . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ testing Ġdocumentation ]( http :// d . android . com / tools / testing ). Ċ Ġ* Ċ Ġ* ĠSPDX - File Copyright Text : Ġ 2 0 1 9 , ĠAnd ras ĠVer es - Sz ent kir aly i Ġ< vs za @ vs za . hu > Ċ Ġ* ĠSPDX - License - Identifier : ĠMIT Ċ Ġ*/ Ċ Ċ @ Suppress (" Spell Checking Inspection ") Ċ const Ġval ĠEXPECT ED _ BASIC _ TEST Ġ= Ġ" yt PI Z vs Zl Q Ar / 9 n Lg 4 MX 0 g 2 F + U 0 V 6 K 1 4 1 xEE CI w N LE A =" Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠExample Instrument ed Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġs phinx Basic Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠByteArray ( 1 6 ) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġsalt [ 0 ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ ĠS phinx . Challenge (" sh it ty Ġpassword ". toCharArray (), Ġsalt ). use Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= ĠByteArray ( 3 2 ) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret [ 0 ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= ĠS phinx . respond ( c . challenge , Ġsecret ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr wd Ġ= Ġc . finish ( salt , Ġresp ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ArrayEquals ( Base 6 4 . decode ( EXPECTED _ BASIC _ TEST , ĠBase 6 4 . DEFAULT ), Ġr wd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstorage Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Context Ġ= ĠInstrument ation Registry . get Instrumentation (). target Context ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠAndroid Credential Store ( app Context ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġstorage . key ĊĠĠĠĠĠĠĠ ĠassertEquals ( MASTER _ KEY _ BYTES , Ġkey . as Bytes . size ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( storage . key . as Bytes , Ġkey . as Bytes ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ("", Ġstorage . host ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġstorage . port ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhost Ġ= Ġ" example . t ld " ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġ 3 1 3 3 7 ĊĠĠĠĠĠĠĠ Ġapp Context . store Server Info ( host , Ġport ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( host , Ġstorage . host ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( port , Ġstorage . port ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġs phinx Network Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcs Ġ= ĠMock Credential Store () ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ" network " ĊĠĠĠĠĠĠĠ Ġval Ġusername 2 Ġ= Ġ" network 2 " ĊĠĠĠĠĠĠĠ Ġval Ġhostname Ġ= Ġ" test ${ System . currentTimeMillis ()}. t ld " ĊĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= ĠProtocol . Realm ( username , Ġhostname ) ĊĠĠĠĠĠĠĠ Ġval Ġrealm 2 Ġ= ĠProtocol . Realm ( username 2 , Ġhostname ) ĊĠĠĠĠĠĠĠ Ġval Ġchar Classes Ġ= Ġset Of ( Character Class . LOWER , ĠCharacter Class . DIG ITS ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 1 8 ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠProtocol . Password Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgot Password : ĠChar Array ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpassword Received ( password : ĠChar Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgot Password Ġ= Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ( Protocol . list ( hostname , Ġcs ). isEmpty ()) ĊĊĠĠĠĠĠĠĠ ĠProtocol . create (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġchar Classes , Ġcs , Ġcallback , Ġsize ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( callback . got Password ) ĊĠĠĠĠĠĠĠ Ġval Ġpw Ġ= Ġcallback . got Password !! ĊĠĠĠĠĠĠĠ ĠassertEquals ( size , Ġpw . size ) ĊĠĠĠĠĠĠĠ Ġassert ( pw . all Ġ{ Ġpw Char Ġ-> Ġchar Classes . any Ġ{ Ġit . range . contains ( pw Char ) Ġ} Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġuser List Ġ= ĠProtocol . list ( hostname , Ġcs ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġuser List . size ) ĊĠĠĠĠĠĠĠ Ġassert ( user List . contains ( username )) ĊĊĠĠĠĠĠĠĠ ĠProtocol . create (" sphinx Network Test Master Password 2 ". toCharArray (), Ġrealm 2 , Ġchar Classes , Ġcs , Ġcallback , Ġsize ) ĊĠĠĠĠĠĠĠ Ġval Ġuser List 2 Ġ= ĠProtocol . list ( hostname , Ġcs ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġuser List 2 . size ) ĊĠĠĠĠĠĠĠ Ġassert ( user List 2 . contains ( username )) ĊĠĠĠĠĠĠĠ Ġassert ( user List 2 . contains ( username 2 )) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . get (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . change (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġval Ġpw 2 Ġ= Ġcallback . got Password !! ĊĠĠĠĠĠĠĠ ĠassertFalse ( pw . content Equals ( pw 2 )) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . get (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . commit (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw 2 , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . get (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw 2 , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . undo (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ Ġcallback . got Password Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ ĠProtocol . get (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( pw , Ġcallback . got Password ) ĊĊĠĠĠĠĠĠĠ ĠProtocol . delete (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs ) ĊĠĠĠĠĠĠĠ Ġval Ġuser List 3 Ġ= ĠProtocol . list ( hostname , Ġcs ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġuser List 3 . size ) ĊĠĠĠĠĠĠĠ Ġassert ( user List 3 . contains ( username 2 )) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProtocol . get (" sphinx Network Test Master Password ". toCharArray (), Ġrealm , Ġcs , Ġcallback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Server FailureException Ġshould 've Ġbeen Ġthrown ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProtocol . Server FailureException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsuccess ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" Spell Checking Inspection ") ĊĠĠĠ Ġfun Ġread Eval Print Loop Test () Ġ{ ĊĠĠĠĠĠĠĠ ĠServer Socket ( 2 3 5 5 ). accept (). use Ġ{ Ġsocket Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr Ġ= Ġsocket . getInputStream (). buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpw Ġ= ĠPrintWriter ( socket . get OutputStream (). writer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcs Ġ= ĠMock Credential Store () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . write (" AS REPL > Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġbr . readLine () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Command ( cmd , Ġpw , Ġcs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġprocess Command ( cmd : ĠString , Ġpw : ĠPrintWriter , Ġcs : ĠProtocol . Credential Store ) Ġ{ ĊĠĠĠ Ġif Ġ( cmd Ġ== Ġ" help ") Ġ{ ĊĠĠĠĠĠĠĠ Ġpw . println (" Available Ġcommands :") ĊĠĠĠĠĠĠĠ Ġpw . println () ĊĠĠĠĠĠĠĠ Ġpw . println (" create Ġ< master Ġpassword > Ġ< user > Ġ< site > Ġ[ u ][ l ][ d ][ s ] Ġ[< size >] ") ĊĠĠĠĠĠĠĠ Ġpw . println ("< get | change | commit | delete > Ġ< master Ġpassword > Ġ< user > Ġ< site >") ĊĠĠĠĠĠĠĠ Ġpw . println (" list Ġ< site >") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparts Ġ= Ġcmd . split (' Ġ') ĊĠĠĠ Ġif Ġ( parts . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpw . println (" Not Ġenough Ġarguments Ġor Ġunknown Ġcommand ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpassword Callback Ġ= Ġobject Ġ: ĠProtocol . Password Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpassword Received ( password : ĠChar Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpw . println ( String ( password )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( parts [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ< Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . println (" Not Ġenough Ġarguments ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġif Ġ( parts . size Ġ> Ġ 5 ) Ġparts [ 5 ]. toInt () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc cs Ġ= Ġparts [ 4 ]. toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcc Ġ= ĠCharacter Class . values (). filter To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Set . none Of ( Character Class :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġit . name [ 0 ]. toLowerCase () Ġin Ġc cs Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProtocol . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts [ 1 ]. toCharArray (), ĠProtocol . Realm ( parts [ 2 ], Ġparts [ 3 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc , Ġcs , Ġpassword Callback , Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . println (" Invalid Ġsize ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" get ", Ġ" change ", Ġ" commit ", Ġ" delete " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ< Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . println (" Not Ġenough Ġarguments ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= ĠProtocol . Realm ( parts [ 2 ], Ġparts [ 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parts [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get " ĠĠĠ Ġ-> ĠProtocol . get ( ĠĠ Ġparts [ 1 ]. toCharArray (), Ġrealm , Ġcs , Ġpassword Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" change " Ġ-> ĠProtocol . change ( parts [ 1 ]. toCharArray (), Ġrealm , Ġcs , Ġpassword Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" commit " Ġ-> ĠProtocol . commit ( parts [ 1 ]. toCharArray (), Ġrealm , Ġcs , Ġpassword Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" delete " Ġ-> ĠProtocol . delete ( parts [ 1 ]. toCharArray (), Ġrealm , Ġcs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" list " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProtocol . list ( parts [ 1 ], Ġcs ). forEach ( pw :: println ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpw . println (" Unknown Ġcommand ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( s : ĠProtocol . Server FailureException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpw . println (" Server Ġfailure ") ĊĠĠĠ Ġ} Ċ } Ċ