/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 0 2 0 , ĠV ir gil ĠSecurity , ĠInc . Ċ Ġ* Ċ Ġ* ĠLead ĠMaint ainer : ĠV ir gil ĠSecurity ĠInc . Ġ< support @ vir gil security . com > Ċ Ġ* Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 1 ) ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 2 ) ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ( 3 ) ĠNeither Ġthe Ġname Ġof Ġvir gil Ġnor Ġthe Ġnames Ġof Ġits Ċ Ġ* ĠĠĠĠ Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ Ġ* ĠĠĠĠ Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE Ċ Ġ* ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE Ċ Ġ* ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL Ċ Ġ* ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR Ċ Ġ* ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER Ċ Ġ* ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , Ċ Ġ* ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ Ġ* ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . vir gil security . android . common . storage . cloud Ċ Ċ import Ġcom . vir gil security . android . common . build . V ir gil Info Ċ import Ġcom . vir gil security . android . common . exception . E Three Exception Ċ import Ġcom . vir gil security . android . common . util . Const Ċ import Ġcom . vir gil security . android . common . util . Const . V IR G IL _ BASE _ URL Ċ import Ġcom . vir gil security . key kn ox . Key kn ox Manager Ċ import Ġcom . vir gil security . key kn ox . client . HttpClient Ċ import Ġcom . vir gil security . key kn ox . client . Key kn ox Client Ċ import Ġcom . vir gil security . key kn ox . client . Key kn ox Pull Params Ċ import Ġcom . vir gil security . key kn ox . client . Key kn ox Push Params Ċ import Ġcom . vir gil security . key kn ox . cloud . Cloud Entry Serializer Ċ import Ġcom . vir gil security . key kn ox . cloud . Cloud Key Storage Ċ import Ġcom . vir gil security . key kn ox . exception . De cryption FailedException Ċ import Ġcom . vir gil security . key kn ox . exception . Entry Saving Exception Ċ import Ġcom . vir gil security . key kn ox . exception . Key kn ox Crypto Exception Ċ import Ġcom . vir gil security . key kn ox . model . Cloud Entries Ċ import Ġcom . vir gil security . key kn ox . model . Cloud Entry Ċ import Ġcom . vir gil security . key kn ox . utils . Serializer Ċ import Ġcom . vir gil security . py th ia . brain key . Brain Key Ċ import Ġcom . vir gil security . py th ia . brain key . Brain Key Context Ċ import Ġcom . vir gil security . py th ia . client . V ir gil Py th ia Client Ċ import Ġcom . vir gil security . py th ia . crypto . V ir gil Py th ia Crypto Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil Crypto Ċ import Ġcom . vir gil security . sdk . crypto . V ir gil PrivateKey Ċ import Ġcom . vir gil security . sdk . jwt . contract . AccessToken Provider Ċ import Ġcom . vir gil security . sdk . storage . JsonKey Entry Ċ import Ġcom . vir gil security . sdk . utils . Convert ion Utils Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCloud Key Manager Ċ Ġ*/ Ċ internal Ġclass ĠCloud Key Manager Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġidentity : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcrypto : ĠV ir gil Crypto , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtoken Provider : ĠAccess Token Provider , ĊĠĠĠĠĠĠĠ ĠbaseUrl : ĠString Ġ= ĠV IR G IL _ BASE _ URL Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġkey kn ox Manager : ĠKey kn ox Manager ĊĠĠĠ Ġprivate Ġval Ġbrain Key : ĠBr ain Key ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient ( token Provider , ĠConst . ETH REE _ NAME , ĠV ir gil Info . VERSION ) ĊĠĠĠĠĠĠĠ Ġval Ġkey kn ox Client Ġ= ĠKey kn ox Client ( httpClient , ĠURL ( baseUrl )) ĊĠĠĠĠĠĠĠ Ġthis . key kn ox Manager Ġ= ĠKey kn ox Manager ( key kn ox Client ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġchange ĠV ir gil Py th ia Client Ġto Ġhave Ġtoken Provider Ġinside ĊĠĠĠĠĠĠĠ Ġval Ġpy th ia Client Ġ= ĠV ir gil Py th ia Client ( baseUrl , ĠConst . ETH REE _ NAME , ĠConst . ETH REE _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ir gil Info . VERSION ) ĊĠĠĠĠĠĠĠ Ġval Ġbrain Key Context Ġ= ĠBr ain Key Context . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set AccessToken Provider ( token Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Py th ia Client ( py th ia Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Py th ia Crypto ( V ir gil Py th ia Crypto ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġthis . brain Key Ġ= ĠBr ain Key ( brain Key Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġexists ( password : ĠString ) Ġ= Ġsetup Cloud Key Storage ( password ). exists ( identity ) ĊĊĠĠĠ Ġinternal Ġfun Ġstore ( key : ĠV ir gil PrivateKey , Ġkey Name : ĠString ?, Ġpassword : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexported Identity Key Ġ= Ġthis . crypto . export PrivateKey ( key ) ĊĠĠĠĠĠĠĠ Ġif Ġ( key Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġkey Ġin Ġkey kn ox Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Cloud Key Storage ( password ). store ( this . identity , Ġexported Identity Key ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġkey Ġin Ġkey kn ox Ġv 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrain KeyPair Ġ= Ġthis . brain Key . generate KeyPair ( password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Params Ġ= ĠKey kn ox Pull Params ( this . identity , Ġ" e 3 kit ", Ġ" backup ", Ġkey Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey kn ox Value Ġ= Ġthis . key kn ox Manager . pull Value ( pull Params , ĠlistOf ( brain KeyPair . publicKey ), Ġbrain KeyPair . privateKey ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠKey kn ox Push Params ( listOf ( this . identity ), Ġ" e 3 kit ", Ġ" backup ", Ġkey Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠCloud Entry ( this . identity , Ġexported Identity Key , Ġnow , Ġnow , Ġmap Of ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . key kn ox Manager . push Value ( params , ĠConvert ion Utils . to Bytes ( Serializer . gson . toJson ( entry )), Ġkey kn ox Value . key kn ox Hash , ĠlistOf ( brain KeyPair . publicKey ), Ġbrain KeyPair . privateKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġretrieve ( key Name : ĠString ?, Ġpassword : ĠString ): ĠCloud Entry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġkey Ġfrom Ġkey kn ox Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsetup Cloud Key Storage ( password ). retrieve ( key Name Ġ?: Ġthis . identity ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġkey Ġfrom Ġkey kn ox Ġv 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrain KeyPair Ġ= Ġthis . brain Key . generate KeyPair ( password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Params Ġ= ĠKey kn ox Pull Params ( this . identity , Ġ" e 3 kit ", Ġ" backup ", Ġkey Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey kn ox Value Ġ= Ġthis . key kn ox Manager . pull Value ( pull Params , ĠlistOf ( brain KeyPair . publicKey ), Ġbrain KeyPair . privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠSerializer . gson . fromJson < Cloud Entry >( Convert ion Utils . toString ( key kn ox Value . value ), ĠCloud Entry :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdelete ( password : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Cloud Key Storage ( password ). delete ( identity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdelete All () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . key kn ox Manager . reset Value () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġchange Password ( old Password : ĠString , Ġnew Password : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcloud Key Storage Ġ= Ġsetup Cloud Key Storage ( old Password ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbrain KeyPair Ġ= Ġthis . brain Key . generate KeyPair ( new Password ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Key Storage . update Recipients ( listOf ( brain KeyPair . publicKey ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrain KeyPair . privateKey ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠKey kn ox Crypto Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠE Three Exception ( E Three Exception . Description . WRONG _ PASSWORD ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġ[ Sync Key Storage ] Ġwith Ġdefault Ġsettings , Ġ[ token Provider ] Ġand Ġprovided ĊĠĠĠĠ Ġ* Ġ[ password ] Ġafter Ġthat Ġreturns Ġinitialized Ġ[ Sync Key Storage ] Ġobject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġsetup Cloud Key Storage ( password : ĠString ): ĠCloud Key Storage Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbrain KeyPair Ġ= Ġthis . brain Key . generate KeyPair ( password ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcloud Key Storage Ġ= ĠCloud Key Storage ( this . key kn ox Manager , ĠlistOf ( brain KeyPair . publicKey ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrain KeyPair . privateKey ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Key Storage . retrieve Cloud Entries () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDec ryption FailedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠE Three Exception ( E Three Exception . Description . WRONG _ PASSWORD ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcloud Key Storage ĊĠĠĠ Ġ} Ċ } Ċ