/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 0 ĠN HS X . ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġuk . n hs . n hs x . sonar . android . app . http Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . security . keystore . Key Protection Ċ import Ġandroid . util . Base 6 4 Ċ import Ġuk . n hs . n hs x . sonar . android . app . crypto . EL LI PT IC _ CUR VE Ċ import Ġuk . n hs . n hs x . sonar . android . app . crypto . PROVIDER _ NAME Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjavax . crypto . SecretKey Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ import Ġjavax . inject . Inject Ċ Ċ interface ĠSecret Key Storage Ġ{ ĊĠĠĠ Ġfun Ġprovide SecretKey (): ĠSecret Key ? ĊĠĠĠ Ġfun Ġstore SecretKey ( encoded Key : ĠString ) Ċ } Ċ Ċ interface ĠPublicKey Storage Ġ{ ĊĠĠĠ Ġfun Ġprovide PublicKey (): ĠPublicKey ? ĊĠĠĠ Ġfun Ġstore Server PublicKey ( encoded Key : ĠString ) Ċ } Ċ Ċ interface ĠKey Storage Ġ: ĠSecret Key Storage , ĠPublicKey Storage Ċ Ċ class ĠDeleg ating KeyStore Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġsecret Key Storage : ĠSecret Key Storage , ĊĠĠĠ Ġprivate Ġval ĠpublicKey Storage : ĠPublicKey Storage Ċ ) Ġ: ĠKey Storage Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprovide SecretKey (): ĠSecret Key ? Ġ= Ġsecret Key Storage . provide SecretKey () ĊĠĠĠ Ġoverride Ġfun Ġstore SecretKey ( encoded Key : ĠString ) Ġ= Ġsecret Key Storage . store SecretKey ( encoded Key ) ĊĠĠĠ Ġoverride Ġfun Ġprovide PublicKey (): ĠPublicKey ? Ġ= ĠpublicKey Storage . provide PublicKey () ĊĠĠĠ Ġoverride Ġfun Ġstore Server PublicKey ( encoded Key : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ ĠpublicKey Storage . store Server PublicKey ( encoded Key ) Ċ } Ċ Ċ const Ġval ĠPUBLIC _ KEY _ FILENAME Ġ= Ġ" server _ public _ key " Ċ const Ġval ĠP REF _ PUBLIC _ KEY Ġ= Ġ" public _ key " Ċ const Ġval ĠSE CRET _ KEY _ PREFER ENCE _ FILENAME Ġ= Ġ" key " Ċ const Ġval ĠP REF _ SECRET _ KEY Ġ= Ġ" encryption _ key " Ċ Ċ class ĠSharedPreferences PublicKey Storage ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠPublicKey Storage Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprovide PublicKey (): ĠPublicKey ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey AsString Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPUBLIC _ KEY _ FILENAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getString ( PRE F _ PUBLIC _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠBase 6 4 . decode ( key AsString , ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠ Ġval Ġpub KeySpec Ġ= ĠX 5 0 9 Encoded KeySpec ( decoded ) ĊĠĠĠĠĠĠĠ Ġval Ġec Key Factory Ġ= ĠKey Factory . getInstance ( EL LI PT IC _ CUR VE , ĠPRO VIDER _ NAME ) ĊĠĠĠĠĠĠĠ Ġreturn Ġec Key Factory . generate Public ( pub KeySpec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore Server PublicKey ( encoded Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( PUBLIC _ KEY _ FILENAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( PRE F _ PUBLIC _ KEY , Ġencoded Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠAPP _ SECRET _ KEY _ ALIAS Ġ= Ġ" secret Key " Ċ Ċ class ĠAndroid SecretKey Storage ( ĊĠĠĠ Ġprivate Ġval Ġkey Store : ĠKey Store , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠSecret Key Storage Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġprovide SecretKey (): ĠSecret Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Prefs Key Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get SharedPreferences ( SECRET _ KEY _ PREFER ENCE _ FILENAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getString ( PRE F _ SECRET _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Store Key Ġ= Ġkey Store . getKey ( APP _ SECRET _ KEY _ ALIAS , Ġnull ) Ġas ĠSecret Key ? ĊĊĠĠĠĠĠĠĠ Ġif Ġ( shared Prefs Key Ġ== Ġnull ) Ġreturn Ġkey Store Key ĊĊĠĠĠĠĠĠĠ Ġcontext . delete SharedPreferences ( SECRET _ KEY _ PREFER ENCE _ FILENAME ) ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore SecretKey ( shared Prefs Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Store . getKey ( APP _ SECRET _ KEY _ ALIAS , Ġnull ) Ġas ĠSecret Key ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Store Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore SecretKey ( encoded Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Key Ġ= ĠBase 6 4 . decode ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Key , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . DEFAULT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġkey Store . set Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAPP _ SECRET _ KEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Store . SecretKey Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecret KeySpec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . KEY _ ALGORITHM _ HMAC _ SHA 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Protection . Builder ( Key Properties . P URPOSE _ SIGN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Digest s ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . DIG EST _ SHA 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ