/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠSch ib st ed ĠProducts Ġ& ĠTechnology ĠAS . ĠLicensed Ġunder Ġthe Ġterms Ġof Ġthe ĠMIT Ġlicense . ĠSee ĠLICENSE Ġin Ġthe Ġproject Ġroot . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" DE PREC ATION ") Ċ Ċ package Ġcom . sch ib st ed . account . persistence Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . security . KeyPair Generator Spec Ċ import Ġandroid . security . keystore . Key Gen Parameter Spec Ċ import Ġandroid . security . keystore . Key Properties Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . util . Base 6 4 Ċ import Ġcom . sch ib st ed . account . common . util . Logger Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security . Key Factory Ċ import Ġjava . security . KeyPair Ċ import Ġjava . security . KeyPair Generator Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . KeyStore Exception Ċ import Ġjava . security . spec . Algorithm Parameter Spec Ċ import Ġjava . security . spec . PKCS 8 Encoded KeySpec Ċ import Ġjava . security . spec . RSA Key Gen Parameter Spec Ċ import Ġjava . security . spec . X 5 0 9 Encoded KeySpec Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . Date Ċ import Ġjava . util . G regorian Calendar Ċ import Ġjavax . security . auth . x 5 0 0 . X 5 0 0 Principal Ċ Ċ class ĠEncryption Key Provider ( private Ġval Ġapp Context : ĠContext ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġkey Pair : ĠKey Pair Ġ= Ġget Stored Encryption Key () Ġ?: Ġgenerate Encryption Key () ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠ Ġprivate Ġfun Ġget Stored Encryption Key (): ĠKey Pair ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġks Ġ= ĠKey Store . getInstance ( KEY STORE _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġks . load ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstored KeyPair Ġ= ĠgetKey From KeyStore ( ks , ĠKEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stored KeyPair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Stored KeyPair ( ks , ĠKEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstored KeyPair ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetKey From SharedPreferences () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey From SharedPreferences (): ĠKey Pair ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġapp Context . get SharedPreferences ( SHARED _ PREFER ENCES _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprefs . getString ( SHARED _ PREFER ENCES _ PUBLIC _ KEY , Ġnull )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic Ġ= Ġprefs . getString ( SHARED _ PREFER ENCES _ PUBLIC _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprivate Ġ= Ġprefs . getString ( SHARED _ PREFER ENCES _ PRIVATE _ KEY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublic Byte Key Ġ= ĠBase 6 4 . decode ( public , ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprivate Byte Key Ġ= ĠBase 6 4 . decode ( private , ĠBase 6 4 . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk f Ġ= ĠKey Factory . getInstance ( KEY _ ALGORITHM _ RSA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġk f . generate Public ( X 5 0 9 Encoded KeySpec ( public Byte Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġk f . generate Private ( PKCS 8 Encoded KeySpec ( private Byte Key )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair ( publicKey , ĠprivateKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġdelete Stored KeyPair ( key Store : ĠKey Store , Ġalias : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Store . contains Alias ( alias )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Store . delete Entry ( alias ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . warn ( TAG , Ġ{ Ġ" alias Ġ$ alias Ġwas Ġnot Ġfound " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠKey Store Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( TAG , Ġ{ Ġ" Unable Ġto Ġdelete Ġkey Ġfrom Ġkeystore " Ġ}, Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun ĠgetKey From KeyStore ( key Store : ĠKey Store , Ġalias : ĠString ): ĠKey Pair ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey : ĠKey Pair ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( key Store . contains Alias ( alias )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġkey Store . getEntry ( alias , Ġnull ) Ġas ĠKey Store . PrivateKey Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠKey Pair ( res . certificate . publicKey , Ġres . privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( TAG , Ġ{ Ġ" An Ġexception Ġoccurred Ġwhen Ġattempting Ġto Ġget Ġkey Ġfrom Ġkeystore " Ġ}, Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . warn ( TAG , Ġ{ Ġ" alias Ġ$ alias Ġwas Ġnot Ġfound " Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġlint Ġrule Ġonly Ġmakes Ġsense Ġfor ĠAPI Ġ 4 . 3 Ġand Ġolder ĊĠĠĠĠ Ġ* Ġ@ see Ġhttps :// sites . google . com / a / android . com / tools / tips / lint - checks ĊĠĠĠĠ Ġ* Ġ" Tr uly Random " Ġsection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Tr uly Random ") ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġgenerate Encryption Key M (): ĠKey Pair ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġks Ġ= ĠKey Store . getInstance ( KEY STORE _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġks . load ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk pg Ġ= ĠKey Pair Generator . getInstance ( KEY _ ALGORITHM _ RSA , ĠKEY STORE _ PROVIDER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Valid Ġ= ĠG regorian Calendar (). time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Valid Ġ= ĠG regorian Calendar (). apply Ġ{ Ġadd ( Calendar . YEAR , Ġ 1 ) Ġ}. time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Spec Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġget Api 2 3 Spec ( start Valid , Ġend Valid ) Ġelse Ġget Api 1 8 Spec ( start Valid , Ġend Valid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk pg . initialize ( param Spec ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġk pg . gen KeyPair () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( TAG , Ġ{ Ġ" An Ġexception Ġoccurred Ġwhen Ġgenerating Ġkey . ĠWill Ġuse Ġfallback ." Ġ}, Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Encryption Key Fallback (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠRSA Key Gen Parameter Spec ( 1 0 2 4 , ĠRSA Key Gen Parameter Spec . F 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Gen Ġ= ĠKey Pair Generator . getInstance ( KEY _ ALGORITHM _ RSA ) ĊĠĠĠĠĠĠĠ Ġkey Gen . initialize ( spec ) ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Keys Ġ= Ġkey Gen . gen KeyPair () ĊĊĠĠĠĠĠĠĠ Ġval Ġk f Ġ= ĠKey Factory . getInstance ( KEY _ ALGORITHM _ RSA ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġk f . generate Public ( X 5 0 9 Encoded KeySpec ( generated Keys . public . encoded )) ĊĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġk f . generate Private ( PKCS 8 Encoded KeySpec ( generated Keys . private . encoded )) ĊĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġapp Context . get SharedPreferences ( SHARED _ PREFER ENCES _ NAME , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġwith ( prefs . edit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( SHARED _ PREFER ENCES _ PUBLIC _ KEY , ĠBase 6 4 . encode ToString ( generated Keys . public . encoded , ĠBase 6 4 . DEFAULT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( SHARED _ PREFER ENCES _ PRIVATE _ KEY , ĠBase 6 4 . encode ToString ( generated Keys . private . encoded , ĠBase 6 4 . DEFAULT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠKey Pair ( publicKey , ĠprivateKey ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠ Ġprivate Ġfun Ġgenerate Encryption Key (): ĠKey Pair Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Encryption Key M () Ġ?: Ġgenerate Encryption Key Fallback () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Encryption Key Fallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġget Api 2 3 Spec ( valid From : ĠDate , Ġvalid To : ĠDate ): ĠAlgorithm Parameter Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠKey Gen Parameter Spec . Builder ( KEY _ ALIAS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Properties . P URPOSE _ ENCRYPT Ġor ĠKey Properties . P URPOSE _ DE CRYPT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Digest s ( Key Properties . DIG EST _ SHA 2 5 6 , ĠKey Properties . DIG EST _ SHA 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Certificate Subject ( X 5 0 0 Principal ( PR INC IP AL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encryption P add ings ( Key Properties . ENCRYPT ION _ P ADDING _ RSA _ PKCS 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Validity Start ( valid From ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Validity End ( valid To ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġget Api 1 8 Spec ( valid From : ĠDate , Ġvalid To : ĠDate ): ĠAlgorithm Parameter Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠKey Pair Generator Spec . Builder ( app Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alias ( KEY _ ALIAS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subject ( X 5 0 0 Principal ( PR INC IP AL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set SerialNumber ( BigInteger . valueOf ( 1 4 4 7 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set StartDate ( valid From ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set EndDate ( valid To ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠLogger . DEFAULT _ TAG Ġ+ Ġ"- Encryption Key Provider " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ ALIAS Ġ= Ġ" identity Key Alias " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ ALGORITHM _ RSA Ġ= Ġ" RSA " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY STORE _ PROVIDER Ġ= Ġ" Android KeyStore " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ PREFER ENCES _ NAME Ġ= Ġ" IDENTITY _ KEY STORE " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ PREFER ENCES _ PRIVATE _ KEY Ġ= Ġ" IDENTITY _ PR _ KEY _ PAIR " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHARE D _ PREFER ENCES _ PUBLIC _ KEY Ġ= Ġ" IDENTITY _ PU _ KEY _ PAIR " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPR INC IP AL Ġ= Ġ" CN =$ KEY _ ALIAS , ĠO = Sch ib st ed ĠIdentity " ĊĠĠĠ Ġ} Ċ } Ċ