package Ġcom . bio auth . sample . server Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . Signature Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjava . util .* Ċ Ċ private Ġconst Ġval ĠS ALT Ġ= Ġ" SUPER _ SAL T " Ċ private Ġconst Ġval ĠCUR VE _ ALG Ġ= Ġ" SHA 2 5 6 with ECD SA " Ċ Ċ class ĠMy Server ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġserver Challenge Ġby Ġlazy Ġ{ ĠUUID . randomUUID (). toString () Ġ} ĊĠĠĠ Ġprivate Ġvar Ġprefs : ĠSharedPreferences Ġ= Ġcontext . application Context . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Server ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġfun Ġlogin With Pin ( pin : ĠString ) Ġ= Ġ" 1 2 3 4 " Ġ== Ġpin ĊĊĠĠĠ Ġfun Ġen roll Fingerprint ( device : ĠString , ĠpublicKey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . edit (). putString (" publicKey ", ĠpublicKey ). apply () ĊĠĠĠĠĠĠĠ ĠLog . d (" PublicKey ", ĠpublicKey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Challenge () Ġ= Ġserver Challenge ĊĊĠĠĠ Ġfun Ġverify ( response : ĠString , Ġnonce : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġload PublicKey () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġ"$ server Challenge $ SAL T $ nonce " ĊĠĠĠĠĠĠĠ Ġif ( publicKey Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġverification Function Ġ= ĠSignature . getInstance ( CUR VE _ ALG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Function . init Verify ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Function . update ( data . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Byte Ġ= Ġ ĠBase 6 4 . decode ( response , ĠBase 6 4 . NO _ WRAP Ġor ĠBase 6 4 . URL _ SAFE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġverification Function . verify ( resp Byte ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload PublicKey (): ĠPublicKey ? { ĊĠĠĠĠĠĠĠ Ġvar Ġpk : ĠString ? Ġ= Ġprefs . getString (" publicKey ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġpk Ġ= Ġpk ?. replace (" ----- BEGIN ĠPUBLIC ĠKEY ----- \ n ", Ġ"") ĊĠĠĠĠĠĠĠ Ġpk Ġ= Ġpk ?. replace (" ----- END ĠPUBLIC ĠKEY ----- ", Ġ"") ĊĠĠĠĠĠĠĠ Ġpk Ġ= Ġpk ?. replace ("\ n ", Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( pk Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp kb Ġ= Ġjava . util . Base 6 4 . get Decoder (). decode ( pk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget PublicKey ( pk b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget PublicKey ( pk b : ĠByteArray ?): ĠPublicKey ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( pk b Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfact Ġ= ĠKey Factory . getInstance (" EC ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfact . generate Public ( X 5 0 9 Encoded KeySpec ( pk b )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġverify Jwt ( signed : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue // No Ġimplementation ĊĠĠĠ Ġ} Ċ }